首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >动态更改eBPF映射大小

动态更改eBPF映射大小
EN

Stack Overflow用户
提问于 2020-08-05 15:32:57
回答 1查看 995关注 0票数 4

在内核中,eBPF映射可以定义为:

代码语言:javascript
复制
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函数,但它似乎是一个用户空间函数,只能在加载地图之前调用。我希望有任何示例代码片段或参考。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-05 15:47:08

不,目前不能在创建eBPF映射之后“调整”它的大小。

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

  • 一些映射是预先分配的,因为它们的类型要求如此(例如数组),或者是因为用户在地图创建时通过提供相关的标志而需要这样做。这些映射一经创建就会被分配,并占用相当于(key_size + value_size) * max_entries.
  • Some的空间--其他映射不是预先分配的,并且会随着时间的推移而增长。例如,散列映射是这样的:随着新条目的添加,它们在内核空间中将占用更多空间。但是,它们只会增长到在创建过程中提供的最大条目数,不可能在此之后更新这个最大数量的条目。

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

代码语言:javascript
复制
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);
}

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63268557

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档