问题描述
我正在尝试实现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程序中创建映射,那么它将实质上启用动态内存分配。