Недопустимый аргумент кольцевого буфера BPF (-22)?

Я хотел использовать последнюю карту eBPF, BPF_MAP_TYPE_RINGBUF, но я не могу найти много информации в Интернете о том, как я могу ее использовать, поэтому я просто пробую и ошибаюсь здесь. Я определил и использовал его следующим образом:

struct bpf_map_def SEC("maps") r_buf = {
    .type = BPF_MAP_TYPE_RINGBUF,
    .max_entries = 1 << 2,
};

SEC("lsm/task_alloc")
int BPF_PROG(task_alloc, struct task_struct *task, unsigned long clone_flags) {
    uint32_t pid  = task->pid;
    bpf_ringbuf_output(&r_buf, &pid, sizeof(uint32_t), 0); //stores the pid value to the ring buffer
    return 0;
}

Но я получил следующую ошибку при запуске:

libbpf: map 'r_buf': failed to create: Invalid argument(-22)
libbpf: failed to load object 'bpf_example_kern'
libbpf: failed to load BPF skeleton 'bpf_example_kern': -22

Вроде libbpf не узнаёт BPF_MAP_TYPE_RINGBUF? Я клонировал последний libbpf с GitHub и сделал make и make install. Я использую ядро ​​Linux 5.8.0.

ОБНОВЛЕНИЕ: проблема кажется решенной, если я изменил max_entries на что-то вроде 4096 * 64, но я не знаю, почему это так.


person vanbastelaer    schedule 14.08.2020    source источник


Ответы (1)


Вы правы, проблема в размере BPF_MAP_TYPE_RINGBUF (атрибут max_entries в определении карты libbpf). Он должен быть кратен странице памяти (что составляет не менее 4096 байт на большинстве популярных платформ). Так что это объясняет, почему все работало, когда вы указали 64 * 4096.

Кстати, если вы хотите увидеть несколько примеров его использования, я бы начал с самотестирования BPF:

person Andrii Nakryiko    schedule 28.09.2020