bpf/bcc 尝试访问 `struct rq` 时报告错误
bpf/bcc reports error when trying to access `struct rq`
这是我的 bpf 程序,用于分析内核函数 pick_next_task_fiar
。
#include <uapi/linux/ptrace.h>
#include <linux/sched.h>
#include <linux/nsproxy.h>
#include <linux/pid_namespace.h>
struct rq; // forward declaration
struct val_t {
pid_t pid;
u64 vruntime;
int type; // Note, 0 for previous task, 1 for next task.
};
BPF_PERF_OUTPUT(events);
int kprobe_pick_next_fair(struct pt_regs *ctx, struct rq *rq,
struct task_struct *prev)
{
int cpu = rq->cpu;
struct val_t data = {};
data.pid = prev->pid;
data.vruntime = prev->se.vruntime;
data.type = 0;
events.perf_submit(ctx, &data, sizeof(data));
return 0;
};
报错如下:
int cpu = rq->cpu;
~~^
/virtual/main.c:8:8: note: forward declaration of 'struct rq'
struct rq; // forward declaration
^
1 error generated.
Traceback (most recent call last):
File "picknextfair__back.py", line 73, in <module>
b = BPF(text=bpf_text)
File "/usr/lib/python2.7/dist-packages/bcc/__init__.py", line 297, in __init__
raise Exception("Failed to compile BPF text:\n%s" % text)
Exception: Failed to compile BPF text:
我的问题是为什么 bpf 无法识别 struct rq
,因为我已经包含了 # include <linux/sched.h>
。但是,它确实识别 struct task_struct
。这两个结构在同一个头文件中。
内核版本:4.4.0-141-generic on ubuntu 16.04
struct rq
实际上 不是内核头文件的一部分 ,你可以 see on Bootlin.
您可以:
- 从
rq
指针中检索到 rq->cpu
的偏移量并将其硬编码到您的 BPF 程序中,但我不推荐这样做;
- 或找到其他方法来检索 cpu 号码,可能是通过
prev
或当前任务(例如 prev->cpu
)。
这是我的 bpf 程序,用于分析内核函数 pick_next_task_fiar
。
#include <uapi/linux/ptrace.h>
#include <linux/sched.h>
#include <linux/nsproxy.h>
#include <linux/pid_namespace.h>
struct rq; // forward declaration
struct val_t {
pid_t pid;
u64 vruntime;
int type; // Note, 0 for previous task, 1 for next task.
};
BPF_PERF_OUTPUT(events);
int kprobe_pick_next_fair(struct pt_regs *ctx, struct rq *rq,
struct task_struct *prev)
{
int cpu = rq->cpu;
struct val_t data = {};
data.pid = prev->pid;
data.vruntime = prev->se.vruntime;
data.type = 0;
events.perf_submit(ctx, &data, sizeof(data));
return 0;
};
报错如下:
int cpu = rq->cpu;
~~^
/virtual/main.c:8:8: note: forward declaration of 'struct rq'
struct rq; // forward declaration
^
1 error generated.
Traceback (most recent call last):
File "picknextfair__back.py", line 73, in <module>
b = BPF(text=bpf_text)
File "/usr/lib/python2.7/dist-packages/bcc/__init__.py", line 297, in __init__
raise Exception("Failed to compile BPF text:\n%s" % text)
Exception: Failed to compile BPF text:
我的问题是为什么 bpf 无法识别 struct rq
,因为我已经包含了 # include <linux/sched.h>
。但是,它确实识别 struct task_struct
。这两个结构在同一个头文件中。
内核版本:4.4.0-141-generic on ubuntu 16.04
struct rq
实际上 不是内核头文件的一部分 ,你可以 see on Bootlin.
您可以:
- 从
rq
指针中检索到rq->cpu
的偏移量并将其硬编码到您的 BPF 程序中,但我不推荐这样做; - 或找到其他方法来检索 cpu 号码,可能是通过
prev
或当前任务(例如prev->cpu
)。