【问题标题】:Dynamically Change eBPF map size动态改变 eBPF 映射大小
【发布时间】:2020-11-25 19:54:09
【问题描述】:

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

【问题讨论】:

    标签: linux-kernel ebpf


    【解决方案1】:

    不,目前您无法在 eBPF 地图创建后“调整其大小”

    但是,内核中映射的大小可能会随时间而变化。

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

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

    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);
    }
    

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

    【讨论】:

      猜你喜欢
      • 2017-08-30
      • 1970-01-01
      • 2018-11-16
      • 2011-01-25
      • 1970-01-01
      • 2013-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多