动态更改 eBPF 映射大小

van*_*aer 6 linux-kernel ebpf

在内核中,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函数,但它似乎是一个用户空间函数,只能在加载地图之前调用。我将不胜感激任何示例代码片段或参考。

Qeo*_*ole 7

不,目前您无法在创建eBPF 映射后 \xe2\x80\x9cresize\xe2\x80\x9d 大小。

\n

然而,内核中的映射的大小可能会随着时间的推移而变化。

\n
    \n
  • 有些映射是预先分配的,因为它们的类型需要这样(例如数组),或者因为用户在创建映射时需要通过提供相关标志来进行分配。这些映射在创建后立即分配,占用的空间等于(key_size + value_size) * max_entries
  • \n
  • 其他一些地图没有预先分配,并且会随着时间的推移而增长。例如,哈希映射就是这种情况:随着新条目的添加,它们将占用内核空间中的更多空间。但是,它们只会增长到创建期间提供的最大条目数,并且不会增长此后无法更新此最大条目数
  • \n
\n

关于bpf_map__resize()libbpf 中的函数,它是一个用户空间函数,可用于更新映射的条目数,之前更新映射的条目数:

\n
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}\n
Run Code Online (Sandbox Code Playgroud)\n

如果我们已经创建了映射(如果我们有该映射的文件描述符),则操作将失败。

\n