eBPF:将新的内部地图插入到“ BPF_MAP_TYPE_HASH_OF_MAPS”吗?

问题描述

我正在尝试实现LSM BPF程序,并且我想使用BPF_MAP_TYPE_HASH_OF_MAPS来存储每个超级块的信息,因为sb_alloc_security LSM挂钩被触发了。例如,我想将地图定义为:

struct bpf_map_def SEC("SBMap") outer_map = {
    .type = BPF_MAP_TYPE_HASH_OF_MAPS,.key_size = sizeof(uuid_t),// super block unique identifier
    .value_size = sizeof(__u32),// must be u32 because it is inner map id
    .max_entries = 1024,// for Now,let's assume we care about only 1024 super blocks
};

我想使用超级块的UUID作为outer_map的密钥,并且每次分配新的超级块时,我都想创建一个新的内部映射,例如:

SEC("lsm/sb_alloc_security")
int BPF_PROG(sb_alloc_security,struct super_block *sb) {
    uuid_t key = sb->s_uuid; // use super block UUID as key to the outer_map
    // If key does not exist in outer_map,// create a new inner map and insert it
    // into the outer_map with the key
}

但是似乎只能在用户空间中创建地图。有什么解决方法吗?

解决方法

是的, BPF映射只能从用户空间创建,包括内部映射结构的内部映射。如果您可以从BPF程序中创建映射,那么它将实质上启用动态内存分配。