【发布时间】:2021-09-15 09:47:37
【问题描述】:
我对 bpf_object__pin_maps(bpf_obj, pin_dir) 是否会固定地图类型 BPF_MAP_TYPE_HASH_OF_MAPS 的内部地图感到困惑。由于此函数将 bpf_obj 作为参数,因此在此之前我们不会创建内部映射。如果它不固定内部地图,那我们该怎么做呢?
【问题讨论】:
标签: linux linux-kernel bpf ebpf
我对 bpf_object__pin_maps(bpf_obj, pin_dir) 是否会固定地图类型 BPF_MAP_TYPE_HASH_OF_MAPS 的内部地图感到困惑。由于此函数将 bpf_obj 作为参数,因此在此之前我们不会创建内部映射。如果它不固定内部地图,那我们该怎么做呢?
【问题讨论】:
标签: linux linux-kernel bpf ebpf
如果您的内部地图与您的程序和外部地图在同一个目标文件中定义,我希望 libbpf 能够同时创建和固定它们。
相反,如果它们尚未创建(因为您稍后会在工作流程中创建它们,例如使用 bpftool 或从另一个目标文件创建),那么您仍然可以稍后固定它们。
使用 libbpf,您可以通过检索地图的句柄来做到这一点,例如从 struct bpf_object 和 bpf_object__find_map_by_name() 或类似函数:
LIBBPF_API struct bpf_map *
bpf_object__find_map_by_name(const struct bpf_object *obj, const char *name);
然后您可以使用bpf_map__pin() 轻松固定它:
LIBBPF_API int bpf_map__pin(struct bpf_map *map, const char *path);
使用 bpftool,如果您加载了地图但尚未固定(由用户空间应用程序中的文件描述符或 eBPF 程序引用),您可以使用以下命令固定它:
# bpftool map pin <map> <pinned path>
请注意,使用 bpftool 创建地图会自动将其固定,并且需要您提供路径:
# bpftool map create <pinned path> type <type> key <key size> value <value size> \
entries <max entries> name <name>
【讨论】:
bpf_object 包含您的内部地图的定义。它可以与您的外部地图相同,但在这种情况下,我希望 libbpf 能够同时创建所有地图(但请注意,我有一段时间没有检查过,我可能会出错) .