【问题标题】:BPF cgroup device controller program problem with mapBPF cgroup设备控制器程序问题与map
【发布时间】:2020-06-21 05:55:56
【问题描述】:

我想用 BPF_PROG_TYPE_CGROUP_DEVICE 在用户/内核端之间传递数据

我已将地图定义为:

struct bpf_map_def SEC("maps") my_map = {
    .type = BPF_MAP_TYPE_ARRAY,
    .key_size = sizeof(int),
    .value_size = sizeof(int),
    .max_entries = 100,
};

当我在 BPF 程序中执行以下操作时:

int ret = bpf_map_update_elem(&my_map, &key, &value, BPF_ANY);
void *out = bpf_map_lookup_elem(&my_map, &key);

if (!out)
{
    // Never gets in here
}

我的代码永远不会进入 if 语句。

用户端

在用户方面,我使用辅助函数正确加载了对映射的引用,这些辅助函数为我提供了全局数组,例如 struct bpf_map_data map_data[MAX_MAPS];

我可以通过以下方式获取地图名称:

printf("Name: %s \n", map_data[0].name); 这意味着我能够正确解析 SEC("maps") 属性的 ELF 文件,并且当我尝试以下操作时:

bpf_map_update_elem(map_data[0].fd, &key, &value, BPF_ANY); bpf_map_lookup_elem(map_data[0].fd, &key, &value);

地图数据已更新,并且在用户空间中可见。

问题是我看不到 BPF 程序中定义的映射。我尝试过使用另一种类型的程序,它的行为符合预期。

我是否缺少这种类型的 BPF_PROG_TYPE_CGROUP_DEVICE 以及与地图共享的数据?

【问题讨论】:

    标签: cgroups bpf ebpf


    【解决方案1】:

    这与BPF_PROG_TYPE_CGROUP_DEVICE无关,但与您对BPF_MAP_TYPE_ARRAY的使用有关。 数组类型的 BPF 映射的值总是被初始化(为零),所以out 永远不能是null。但是,您可以检查out 指向的值;默认为零。

    您仍然需要检查返回的值是否不为空,因为 BPF 验证器不知道它永远不会。所以,如果你不检查,它会抱怨。

    【讨论】:

    • 我完全同意。但是让我进一步解释一下:在 BPF 程序中,我将 key=1 的元素分配给 value=5,当我在用户端检查该键时,它仍然为零。这种行为反之亦然。不知何故,价值观没有正确传播?我很困惑,因为与 BPF_PROG_TYPE_SOCKET_FILTER 类型的程序一起使用时结果符合预期。
    【解决方案2】:

    int map_fd[MAX_MAPS]; 对象未正确引用我的地图。我会看看一个原因,但是用这个调用来获取地图:

    int map_fd = bpf_object__find_map_fd_by_name(obj, "my_map");

    解决了我的问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-05-03
      • 1970-01-01
      • 1970-01-01
      • 2013-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多