bpf_object__pin_maps是否会pin BPF_MAP_TYPE_HASH_OF_MAPS的内部映射?
BPF_HASH_OF_MAPS内层映射pin操作相关问题解答
1. bpf_object__pin_maps()是否会pin内层映射?
不会。
bpf_object__pin_maps()的作用范围仅包含当前bpf_obj对应的BPF ELF文件中静态定义的所有映射。而BPF_MAP_TYPE_HASH_OF_MAPS的内层映射不属于静态定义内容,是用户态动态创建的资源,调用该函数时你也还未创建内层映射,因此不可能自动pin内层映射。
2. 内层映射的手动pin操作步骤
- 第一步:完成BPF对象加载后,先调用
bpf_object__pin_maps(bpf_obj, pin_dir)将外层HASH_OF_MAPS映射pin到指定路径,这一步和普通映射pin操作一致。 - 第二步:根据业务需要调用
bpf_map_create()创建内层映射,注意内层映射的类型必须和外层HASH_OF_MAPS定义时指定的inner_map_type参数匹配。 - 第三步:调用
bpf_map_update_elem(),将新建的内层映射fd作为value写入外层HASH_OF_MAPS的指定key位置,完成内外层映射的关联。 - 第四步:调用
bpf_map__pin(inner_map, inner_pin_path)即可完成单个内层映射的pin操作,建议统一规划内层映射的pin路径(例如/sys/fs/bpf/inner_maps/xxx)方便后续查找复用。
注意事项
- 已pin的内层映射可以在BPF程序重新加载时复用,无需重复创建:调用
bpf_map__open(inner_pin_path)即可拿到已存在的内层映射fd,重新关联到新的外层映射即可。 - 不再使用的pin映射需要手动调用
bpf_map__unpin()或者直接删除bpffs对应的文件,否则会一直占用内核资源。
内容的提问来源于stack exchange,提问作者Vikas.Maurya
相关产品推荐
相关产品推荐

