BPF_MAP_TYPE_CGRP_STORAGE¶
BPF_MAP_TYPE_CGRP_STORAGE
映射类型表示 cgroup 的本地固定大小存储。它仅在 CONFIG_CGROUPS
的情况下可用。程序由相同的 Kconfig 提供。可以通过使用该 cgroup 查找映射来检索特定 cgroup 的数据。
本文档描述了 BPF_MAP_TYPE_CGRP_STORAGE
映射类型的使用和语义。
用法¶
映射键必须是 sizeof(int)
,表示一个 cgroup fd。 要访问程序中的存储,请使用 bpf_cgrp_storage_get
void *bpf_cgrp_storage_get(struct bpf_map *map, struct cgroup *cgroup, void *value, u64 flags)
flags
可以是 0 或 BPF_LOCAL_STORAGE_GET_F_CREATE
,表示如果不存在,将创建一个新的本地存储。
可以使用 bpf_cgrp_storage_delete
删除本地存储
long bpf_cgrp_storage_delete(struct bpf_map *map, struct cgroup *cgroup)
该映射可用于所有程序类型。
示例¶
带有 BPF_MAP_TYPE_CGRP_STORAGE 的 BPF 程序示例
#include <vmlinux.h>
#include <bpf/bpf_helpers.h>
#include <bpf/bpf_tracing.h>
struct {
__uint(type, BPF_MAP_TYPE_CGRP_STORAGE);
__uint(map_flags, BPF_F_NO_PREALLOC);
__type(key, int);
__type(value, long);
} cgrp_storage SEC(".maps");
SEC("tp_btf/sys_enter")
int BPF_PROG(on_enter, struct pt_regs *regs, long id)
{
struct task_struct *task = bpf_get_current_task_btf();
long *ptr;
ptr = bpf_cgrp_storage_get(&cgrp_storage, task->cgroups->dfl_cgrp, 0,
BPF_LOCAL_STORAGE_GET_F_CREATE);
if (ptr)
__sync_fetch_and_add(ptr, 1);
return 0;
}
用户空间访问上面声明的映射
#include <linux/bpf.h>
#include <linux/libbpf.h>
__u32 map_lookup(struct bpf_map *map, int cgrp_fd)
{
__u32 *value;
value = bpf_map_lookup_elem(bpf_map__fd(map), &cgrp_fd);
if (value)
return *value;
return 0;
}
BPF_MAP_TYPE_CGRP_STORAGE 和 BPF_MAP_TYPE_CGROUP_STORAGE 之间的差异¶
旧的 cgroup 存储映射 BPF_MAP_TYPE_CGROUP_STORAGE
已被标记为已弃用(重命名为 BPF_MAP_TYPE_CGROUP_STORAGE_DEPRECATED
)。 应该使用新的 BPF_MAP_TYPE_CGRP_STORAGE
映射。 下面说明了 BPF_MAP_TYPE_CGRP_STORAGE
和 BPF_MAP_TYPE_CGROUP_STORAGE_DEPRECATED
之间的主要区别。
- (1)。
BPF_MAP_TYPE_CGRP_STORAGE
可以被所有程序类型使用,而 BPF_MAP_TYPE_CGROUP_STORAGE_DEPRECATED
仅适用于 cgroup 程序类型,如 BPF_CGROUP_INET_INGRESS 或 BPF_CGROUP_SOCK_OPS 等。- (2)。
BPF_MAP_TYPE_CGRP_STORAGE
支持多个本地存储 cgroup,而
BPF_MAP_TYPE_CGROUP_STORAGE_DEPRECATED
仅支持由 BPF 程序附加的一个 cgroup。- (3)。
BPF_MAP_TYPE_CGROUP_STORAGE_DEPRECATED
在附加时分配本地存储,因此 bpf_get_local_storage()
始终返回非 NULL 的本地存储。BPF_MAP_TYPE_CGRP_STORAGE
在运行时分配本地存储,因此bpf_cgrp_storage_get()
可能返回 NULL 的本地存储。 为了避免这种 NULL 的本地存储问题,用户空间可以执行bpf_map_update_elem()
在附加 BPF 程序之前预先分配本地存储。- (4)。
BPF_MAP_TYPE_CGRP_STORAGE
支持通过 BPF 程序删除本地存储 而
BPF_MAP_TYPE_CGROUP_STORAGE_DEPRECATED
仅在 prog 分离时删除存储。
因此总的来说,BPF_MAP_TYPE_CGRP_STORAGE
支持 BPF_MAP_TYPE_CGROUP_STORAGE_DEPRECATED
的所有功能,并且功能更强大。 建议使用 BPF_MAP_TYPE_CGRP_STORAGE
代替 BPF_MAP_TYPE_CGROUP_STORAGE_DEPRECATED
。