首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >BPF环缓冲区无效参数(-22)?

BPF环缓冲区无效参数(-22)?
EN

Stack Overflow用户
提问于 2020-08-14 14:58:01
回答 1查看 1.2K关注 0票数 2

我想使用eBPF的最新地图BPF_MAP_TYPE_RINGBUF,但我在网上找不到多少关于如何使用它的信息,所以我只是在这里做一些尝试和错误。我这样定义和使用它:

代码语言:javascript
复制
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;
}

但是,在运行时,我得到了以下错误:

代码语言:javascript
复制
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?我从GitHub克隆了最新的GitHub,并做了makemake install。我正在使用Linux5.8.0内核。

UPDATE:如果我将max_entries改为4096 * 64,这个问题似乎就解决了,但我不知道为什么会这样。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-09-28 03:52:36

您是对的,问题在于BPF_MAP_TYPE_RINGBUF ( libbpf定义中的max_entries属性)的大小。它必须是内存页的倍数(至少在大多数流行的平台上是4096字节)。因此,当您指定64 * 4096时,这就解释了为什么所有这些都有效。

顺便说一句,如果您想看到一些使用它的例子,我将从BPF自我测试开始:

用户空间部分:https://github.com/torvalds/linux/blob/master/tools/testing/selftests/bpf/prog_tests/ringbuf.c

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63415220

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档