BPF_MAP_TYPE_CGRP_STORAGE¶
BPF_MAP_TYPE_CGRP_STORAGE 對映型別表示 cgroup 的本地固定大小儲存。它僅在啟用了 CONFIG_CGROUPS 時可用。程式透過相同的 Kconfig 提供。特定 cgroup 的資料可以透過使用該 cgroup 查詢對映來檢索。
本文件描述了 BPF_MAP_TYPE_CGRP_STORAGE 對映型別的用法和語義。
用法¶
對映鍵必須是 sizeof(int),表示一個 cgroup 檔案描述符。要在程式中訪問儲存,請使用 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僅適用於 BPF_CGROUP_INET_INGRESS 或 BPF_CGROUP_SOCK_OPS 等 cgroup 程式型別。- (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 程式附加之前執行bpf_map_update_elem()來預分配本地儲存。- (4).
BPF_MAP_TYPE_CGRP_STORAGE支援由 BPF 程式刪除本地儲存 而
BPF_MAP_TYPE_CGROUP_STORAGE_DEPRECATED僅在程式分離時刪除儲存。
總而言之,BPF_MAP_TYPE_CGRP_STORAGE 支援 BPF_MAP_TYPE_CGROUP_STORAGE_DEPRECATED 的所有功能及更多。建議使用 BPF_MAP_TYPE_CGRP_STORAGE 而非 BPF_MAP_TYPE_CGROUP_STORAGE_DEPRECATED。