bpf / bcc сообщает об ошибке при попытке доступа к `struct rq` - PullRequest
0 голосов
/ 08 февраля 2019

Это моя 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 в Ubuntu 16.04

1 Ответ

0 голосов
/ 08 февраля 2019

struct rq на самом деле не является частью заголовков ядра , как вы можете посмотреть на Bootlin .

Вы можете либо:

  • получить смещение rq->cpu из указателя rq и жестко закодировать его в вашей программе BPF, но я бы не рекомендовал это;
  • или найти какой-либо другой способ получения номера процессора, может бытьдо prev или текущего задания (например, prev->cpu).
...