在内核中,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
函数,但它似乎是一个用户空间函数,只能在加载地图之前调用。
我将不胜感激任何示例代码片段或参考。
不,目前您无法“调整” eBPF 映射的大小创建后。
然而,内核中的映射的大小可能会随着时间的推移而变化。
- 有些地图是预先分配的,因为它们的类型需要这样(例如数组),或者因为用户在创建地图时需要通过提供相关标志来进行分配。这些映射在创建后立即分配,占用的空间等于
(key_size + value_size) * max_entries
.
- 其他一些地图没有预先分配,并且会随着时间的推移而增长。例如,哈希映射就是这种情况:随着新条目的添加,它们将占用内核空间中的更多空间。但是,它们只会增长到创建期间提供的最大条目数,并且NOT之后可以更新此最大条目数。
关于bpf_map__resize()
来自 libbpf 的函数,它是一个用户空间函数,可用于更新映射的条目数,before该映射是在内核中创建的:
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);
}
如果我们已经创建了映射(如果我们有该映射的文件描述符),则操作将失败。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)