在内核中,eBPF 映射可以定义为:
struct bpf_map_def SEC("maps") my_map = {
.type = BPF_MAP_TYPE_HASH,
.key_size = sizeof(uint32_t),
.value_size = sizeof(struct task_prov_struct),
.max_entries = 4096,
};
Run Code Online (Sandbox Code Playgroud)
如果我提前不知道最大可能大小my_map(我也不想浪费内存),有没有办法预先分配一个小大小并根据需要动态增加大小?我知道bpf_map__resize函数,但它似乎是一个用户空间函数,只能在加载地图之前调用。我将不胜感激任何示例代码片段或参考。
不,目前您无法在创建eBPF 映射后 \xe2\x80\x9cresize\xe2\x80\x9d 大小。
\n然而,内核中的映射的大小可能会随着时间的推移而变化。
\n(key_size + value_size) * max_entries。关于bpf_map__resize()libbpf 中的函数,它是一个用户空间函数,可用于更新映射的条目数,之前更新映射的条目数:
int bpf_map__set_max_entries(struct bpf_map *map, __u32 max_entries)\n{\n if (map->fd >= 0)\n return -EBUSY;\n map->def.max_entries = max_entries;\n return 0;\n}\n\nint bpf_map__resize(struct bpf_map *map, __u32 max_entries)\n{\n if (!map || !max_entries)\n return -EINVAL;\n\n return bpf_map__set_max_entries(map, max_entries);\n}\nRun Code Online (Sandbox Code Playgroud)\n如果我们已经创建了映射(如果我们有该映射的文件描述符),则操作将失败。
\n