在内核中,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,
};如果我不提前知道my_map的最大可能大小(我也不想浪费内存),那么是否有办法预先分配一个小的大小并根据需要动态地增加大小?我知道bpf_map__resize函数,但它似乎是一个用户空间函数,只能在加载地图之前调用。我希望有任何示例代码片段或参考。
发布于 2020-08-05 15:47:08
不,目前不能在创建eBPF映射之后“调整”它的大小。
但是,内核中映射的大小可能随时间而变化。
(key_size + value_size) * max_entries.对于libbpf中的bpf_map__resize()函数,它是一个用户空间函数,可用于在内核中创建此映射之前更新映射的条目数:
int bpf_map__set_max_entries(struct bpf_map *map, __u32 max_entries)
{
if (map->fd >= 0)
return -EBUSY;
map->def.max_entries = max_entries;
return 0;
}
int bpf_map__resize(struct bpf_map *map, __u32 max_entries)
{
if (!map || !max_entries)
return -EINVAL;
return bpf_map__set_max_entries(map, max_entries);
}如果我们已经创建了映射(如果我们有该映射的文件描述符),操作就会失败。
https://stackoverflow.com/questions/63268557
复制相似问题