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_STORAGEBPF_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