€•ÂOŒsphinx.addnodes”Œdocument”“”)”}”(Œ rawsource”Œ”Œchildren”]”(Œ translations”Œ LanguagesNode”“”)”}”(hhh]”(hŒ pending_xref”“”)”}”(hhh]”Œdocutils.nodes”ŒText”“”ŒChinese (Simplified)”…””}”Œparent”hsbaŒ attributes”}”(Œids”]”Œclasses”]”Œnames”]”Œdupnames”]”Œbackrefs”]”Œ refdomain”Œstd”Œreftype”Œdoc”Œ reftarget”Œ(/translations/zh_CN/bpf/map_cgrp_storage”Œmodname”NŒ classname”NŒ refexplicit”ˆuŒtagname”hhh ubh)”}”(hhh]”hŒChinese (Traditional)”…””}”hh2sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ(/translations/zh_TW/bpf/map_cgrp_storage”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒItalian”…””}”hhFsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ(/translations/it_IT/bpf/map_cgrp_storage”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒJapanese”…””}”hhZsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ(/translations/ja_JP/bpf/map_cgrp_storage”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒKorean”…””}”hhnsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ(/translations/ko_KR/bpf/map_cgrp_storage”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒPortuguese (Brazilian)”…””}”hh‚sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ(/translations/pt_BR/bpf/map_cgrp_storage”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒSpanish”…””}”hh–sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ(/translations/sp_SP/bpf/map_cgrp_storage”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubeh}”(h]”h ]”h"]”h$]”h&]”Œcurrent_language”ŒEnglish”uh1h hhŒ _document”hŒsource”NŒline”NubhŒcomment”“”)”}”(hŒ%SPDX-License-Identifier: GPL-2.0-only”h]”hŒ%SPDX-License-Identifier: GPL-2.0-only”…””}”hh·sbah}”(h]”h ]”h"]”h$]”h&]”Œ xml:space”Œpreserve”uh1hµhhh²hh³ŒB/var/lib/git/docbuild/linux/Documentation/bpf/map_cgrp_storage.rst”h´Kubh¶)”}”(hŒ7Copyright (C) 2022 Meta Platforms, Inc. and affiliates.”h]”hŒ7Copyright (C) 2022 Meta Platforms, Inc. and affiliates.”…””}”hhÈsbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1hµhhh²hh³hÇh´KubhŒsection”“”)”}”(hhh]”(hŒtitle”“”)”}”(hŒBPF_MAP_TYPE_CGRP_STORAGE”h]”hŒBPF_MAP_TYPE_CGRP_STORAGE”…””}”(hhÝh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÛhhØh²hh³hÇh´KubhŒ paragraph”“”)”}”(hXThe ``BPF_MAP_TYPE_CGRP_STORAGE`` map type represents a local fix-sized storage for cgroups. It is only available with ``CONFIG_CGROUPS``. The programs are made available by the same Kconfig. The data for a particular cgroup can be retrieved by looking up the map with that cgroup.”h]”(hŒThe ”…””}”(hhíh²hh³Nh´NubhŒliteral”“”)”}”(hŒ``BPF_MAP_TYPE_CGRP_STORAGE``”h]”hŒBPF_MAP_TYPE_CGRP_STORAGE”…””}”(hh÷h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hõhhíubhŒV map type represents a local fix-sized storage for cgroups. It is only available with ”…””}”(hhíh²hh³Nh´Nubhö)”}”(hŒ``CONFIG_CGROUPS``”h]”hŒCONFIG_CGROUPS”…””}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hõhhíubhŒ. The programs are made available by the same Kconfig. The data for a particular cgroup can be retrieved by looking up the map with that cgroup.”…””}”(hhíh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÇh´KhhØh²hubhì)”}”(hŒ^This document describes the usage and semantics of the ``BPF_MAP_TYPE_CGRP_STORAGE`` map type.”h]”(hŒ7This document describes the usage and semantics of the ”…””}”(hj!h²hh³Nh´Nubhö)”}”(hŒ``BPF_MAP_TYPE_CGRP_STORAGE``”h]”hŒBPF_MAP_TYPE_CGRP_STORAGE”…””}”(hj)h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hõhj!ubhŒ map type.”…””}”(hj!h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÇh´KhhØh²hubh×)”}”(hhh]”(hÜ)”}”(hŒUsage”h]”hŒUsage”…””}”(hjDh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÛhjAh²hh³hÇh´Kubhì)”}”(hŒ€The map key must be ``sizeof(int)`` representing a cgroup fd. To access the storage in a program, use ``bpf_cgrp_storage_get``::”h]”(hŒThe map key must be ”…””}”(hjRh²hh³Nh´Nubhö)”}”(hŒ``sizeof(int)``”h]”hŒ sizeof(int)”…””}”(hjZh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hõhjRubhŒC representing a cgroup fd. To access the storage in a program, use ”…””}”(hjRh²hh³Nh´Nubhö)”}”(hŒ``bpf_cgrp_storage_get``”h]”hŒbpf_cgrp_storage_get”…””}”(hjlh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hõhjRubhŒ:”…””}”(hjRh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÇh´KhjAh²hubhŒ literal_block”“”)”}”(hŒ^void *bpf_cgrp_storage_get(struct bpf_map *map, struct cgroup *cgroup, void *value, u64 flags)”h]”hŒ^void *bpf_cgrp_storage_get(struct bpf_map *map, struct cgroup *cgroup, void *value, u64 flags)”…””}”hj†sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1j„h³hÇh´KhjAh²hubhì)”}”(hŒŠ``flags`` could be 0 or ``BPF_LOCAL_STORAGE_GET_F_CREATE`` which indicates that a new local storage will be created if one does not exist.”h]”(hö)”}”(hŒ ``flags``”h]”hŒflags”…””}”(hj˜h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hõhj”ubhŒ could be 0 or ”…””}”(hj”h²hh³Nh´Nubhö)”}”(hŒ"``BPF_LOCAL_STORAGE_GET_F_CREATE``”h]”hŒBPF_LOCAL_STORAGE_GET_F_CREATE”…””}”(hjªh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hõhj”ubhŒP which indicates that a new local storage will be created if one does not exist.”…””}”(hj”h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÇh´KhjAh²hubhì)”}”(hŒCThe local storage can be removed with ``bpf_cgrp_storage_delete``::”h]”(hŒ&The local storage can be removed with ”…””}”(hjÂh²hh³Nh´Nubhö)”}”(hŒ``bpf_cgrp_storage_delete``”h]”hŒbpf_cgrp_storage_delete”…””}”(hjÊh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hõhjÂubhŒ:”…””}”(hjÂh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÇh´KhjAh²hubj…)”}”(hŒHlong bpf_cgrp_storage_delete(struct bpf_map *map, struct cgroup *cgroup)”h]”hŒHlong bpf_cgrp_storage_delete(struct bpf_map *map, struct cgroup *cgroup)”…””}”hjâsbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1j„h³hÇh´KhjAh²hubhì)”}”(hŒ*The map is available to all program types.”h]”hŒ*The map is available to all program types.”…””}”(hjðh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÇh´K hjAh²hubeh}”(h]”Œusage”ah ]”h"]”Œusage”ah$]”h&]”uh1hÖhhØh²hh³hÇh´Kubh×)”}”(hhh]”(hÜ)”}”(hŒExamples”h]”hŒExamples”…””}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÛhjh²hh³hÇh´K#ubhì)”}”(hŒ6A BPF program example with BPF_MAP_TYPE_CGRP_STORAGE::”h]”hŒ5A BPF program example with BPF_MAP_TYPE_CGRP_STORAGE:”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÇh´K%hjh²hubj…)”}”(hX‘#include #include #include 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; }”h]”hX‘#include #include #include 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; }”…””}”hj%sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1j„h³hÇh´K'hjh²hubhì)”}”(hŒ(Userspace accessing map declared above::”h]”hŒ'Userspace accessing map declared above:”…””}”(hj3h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÇh´K@hjh²hubj…)”}”(hŒÿ#include #include __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; }”h]”hŒÿ#include #include __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; }”…””}”hjAsbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1j„h³hÇh´KBhjh²hubeh}”(h]”Œexamples”ah ]”h"]”Œexamples”ah$]”h&]”uh1hÖhhØh²hh³hÇh´K#ubh×)”}”(hhh]”(hÜ)”}”(hŒLDifference Between BPF_MAP_TYPE_CGRP_STORAGE and BPF_MAP_TYPE_CGROUP_STORAGE”h]”hŒLDifference Between BPF_MAP_TYPE_CGRP_STORAGE and BPF_MAP_TYPE_CGROUP_STORAGE”…””}”(hjZh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÛhjWh²hh³hÇh´KOubhì)”}”(hXUThe old cgroup storage map ``BPF_MAP_TYPE_CGROUP_STORAGE`` has been marked as deprecated (renamed to ``BPF_MAP_TYPE_CGROUP_STORAGE_DEPRECATED``). The new ``BPF_MAP_TYPE_CGRP_STORAGE`` map should be used instead. The following illusates the main difference between ``BPF_MAP_TYPE_CGRP_STORAGE`` and ``BPF_MAP_TYPE_CGROUP_STORAGE_DEPRECATED``.”h]”(hŒThe old cgroup storage map ”…””}”(hjhh²hh³Nh´Nubhö)”}”(hŒ``BPF_MAP_TYPE_CGROUP_STORAGE``”h]”hŒBPF_MAP_TYPE_CGROUP_STORAGE”…””}”(hjph²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hõhjhubhŒ+ has been marked as deprecated (renamed to ”…””}”(hjhh²hh³Nh´Nubhö)”}”(hŒ*``BPF_MAP_TYPE_CGROUP_STORAGE_DEPRECATED``”h]”hŒ&BPF_MAP_TYPE_CGROUP_STORAGE_DEPRECATED”…””}”(hj‚h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hõhjhubhŒ ). The new ”…””}”(hjhh²hh³Nh´Nubhö)”}”(hŒ``BPF_MAP_TYPE_CGRP_STORAGE``”h]”hŒBPF_MAP_TYPE_CGRP_STORAGE”…””}”(hj”h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hõhjhubhŒQ map should be used instead. The following illusates the main difference between ”…””}”(hjhh²hh³Nh´Nubhö)”}”(hŒ``BPF_MAP_TYPE_CGRP_STORAGE``”h]”hŒBPF_MAP_TYPE_CGRP_STORAGE”…””}”(hj¦h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hõhjhubhŒ and ”…””}”(hjhh²hh³Nh´Nubhö)”}”(hŒ*``BPF_MAP_TYPE_CGROUP_STORAGE_DEPRECATED``”h]”hŒ&BPF_MAP_TYPE_CGROUP_STORAGE_DEPRECATED”…””}”(hj¸h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hõhjhubhŒ.”…””}”(hjhh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÇh´KQhjWh²hubhŒdefinition_list”“”)”}”(hhh]”(hŒdefinition_list_item”“”)”}”(hŒÙ(1). ``BPF_MAP_TYPE_CGRP_STORAGE`` can be used by all program types while ``BPF_MAP_TYPE_CGROUP_STORAGE_DEPRECATED`` is available only to cgroup program types like BPF_CGROUP_INET_INGRESS or BPF_CGROUP_SOCK_OPS, etc. ”h]”(hŒterm”“”)”}”(hŒI(1). ``BPF_MAP_TYPE_CGRP_STORAGE`` can be used by all program types while”h]”(hŒ(1). ”…””}”(hjÝh²hh³Nh´Nubhö)”}”(hŒ``BPF_MAP_TYPE_CGRP_STORAGE``”h]”hŒBPF_MAP_TYPE_CGRP_STORAGE”…””}”(hjåh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hõhjÝubhŒ' can be used by all program types while”…””}”(hjÝh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÛh³hÇh´KYhj×ubhŒ definition”“”)”}”(hhh]”hì)”}”(hŒŽ``BPF_MAP_TYPE_CGROUP_STORAGE_DEPRECATED`` is available only to cgroup program types like BPF_CGROUP_INET_INGRESS or BPF_CGROUP_SOCK_OPS, etc.”h]”(hö)”}”(hŒ*``BPF_MAP_TYPE_CGROUP_STORAGE_DEPRECATED``”h]”hŒ&BPF_MAP_TYPE_CGROUP_STORAGE_DEPRECATED”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hõhjubhŒd is available only to cgroup program types like BPF_CGROUP_INET_INGRESS or BPF_CGROUP_SOCK_OPS, etc.”…””}”(hjh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÇh´KXhjÿubah}”(h]”h ]”h"]”h$]”h&]”uh1jýhj×ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÕh³hÇh´KYhjÒubjÖ)”}”(hŒÁ(2). ``BPF_MAP_TYPE_CGRP_STORAGE`` supports local storage for more than one cgroup while ``BPF_MAP_TYPE_CGROUP_STORAGE_DEPRECATED`` only supports one cgroup which is attached by a BPF program. ”h]”(jÜ)”}”(hŒK(2). ``BPF_MAP_TYPE_CGRP_STORAGE`` supports local storage for more than one”h]”(hŒ(2). ”…””}”(hj.h²hh³Nh´Nubhö)”}”(hŒ``BPF_MAP_TYPE_CGRP_STORAGE``”h]”hŒBPF_MAP_TYPE_CGRP_STORAGE”…””}”(hj6h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hõhj.ubhŒ) supports local storage for more than one”…””}”(hj.h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÛh³hÇh´K]hj*ubjþ)”}”(hhh]”hì)”}”(hŒtcgroup while ``BPF_MAP_TYPE_CGROUP_STORAGE_DEPRECATED`` only supports one cgroup which is attached by a BPF program.”h]”(hŒ cgroup while ”…””}”(hjQh²hh³Nh´Nubhö)”}”(hŒ*``BPF_MAP_TYPE_CGROUP_STORAGE_DEPRECATED``”h]”hŒ&BPF_MAP_TYPE_CGROUP_STORAGE_DEPRECATED”…””}”(hjYh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hõhjQubhŒ= only supports one cgroup which is attached by a BPF program.”…””}”(hjQh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÇh´K\hjNubah}”(h]”h ]”h"]”h$]”h&]”uh1jýhj*ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÕh³hÇh´K]hjÒh²hubjÖ)”}”(hXÃ(3). ``BPF_MAP_TYPE_CGROUP_STORAGE_DEPRECATED`` allocates local storage at attach time so ``bpf_get_local_storage()`` always returns non-NULL local storage. ``BPF_MAP_TYPE_CGRP_STORAGE`` allocates local storage at runtime so it is possible that ``bpf_cgrp_storage_get()`` may return null local storage. To avoid such null local storage issue, user space can do ``bpf_map_update_elem()`` to pre-allocate local storage before a BPF program is attached. ”h]”(jÜ)”}”(hŒY(3). ``BPF_MAP_TYPE_CGROUP_STORAGE_DEPRECATED`` allocates local storage at attach time so”h]”(hŒ(3). ”…””}”(hjh²hh³Nh´Nubhö)”}”(hŒ*``BPF_MAP_TYPE_CGROUP_STORAGE_DEPRECATED``”h]”hŒ&BPF_MAP_TYPE_CGROUP_STORAGE_DEPRECATED”…””}”(hj‰h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hõhjubhŒ* allocates local storage at attach time so”…””}”(hjh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÛh³hÇh´Kehj}ubjþ)”}”(hhh]”hì)”}”(hXh``bpf_get_local_storage()`` always returns non-NULL local storage. ``BPF_MAP_TYPE_CGRP_STORAGE`` allocates local storage at runtime so it is possible that ``bpf_cgrp_storage_get()`` may return null local storage. To avoid such null local storage issue, user space can do ``bpf_map_update_elem()`` to pre-allocate local storage before a BPF program is attached.”h]”(hö)”}”(hŒ``bpf_get_local_storage()``”h]”hŒbpf_get_local_storage()”…””}”(hj¨h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hõhj¤ubhŒ( always returns non-NULL local storage. ”…””}”(hj¤h²hh³Nh´Nubhö)”}”(hŒ``BPF_MAP_TYPE_CGRP_STORAGE``”h]”hŒBPF_MAP_TYPE_CGRP_STORAGE”…””}”(hjºh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hõhj¤ubhŒ; allocates local storage at runtime so it is possible that ”…””}”(hj¤h²hh³Nh´Nubhö)”}”(hŒ``bpf_cgrp_storage_get()``”h]”hŒbpf_cgrp_storage_get()”…””}”(hjÌh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hõhj¤ubhŒZ may return null local storage. To avoid such null local storage issue, user space can do ”…””}”(hj¤h²hh³Nh´Nubhö)”}”(hŒ``bpf_map_update_elem()``”h]”hŒbpf_map_update_elem()”…””}”(hjÞh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hõhj¤ubhŒ@ to pre-allocate local storage before a BPF program is attached.”…””}”(hj¤h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÇh´K`hj¡ubah}”(h]”h ]”h"]”h$]”h&]”uh1jýhj}ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÕh³hÇh´KehjÒh²hubjÖ)”}”(hŒ³(4). ``BPF_MAP_TYPE_CGRP_STORAGE`` supports deleting local storage by a BPF program while ``BPF_MAP_TYPE_CGROUP_STORAGE_DEPRECATED`` only deletes storage during prog detach time. ”h]”(jÜ)”}”(hŒS(4). ``BPF_MAP_TYPE_CGRP_STORAGE`` supports deleting local storage by a BPF program”h]”(hŒ(4). ”…””}”(hjh²hh³Nh´Nubhö)”}”(hŒ``BPF_MAP_TYPE_CGRP_STORAGE``”h]”hŒBPF_MAP_TYPE_CGRP_STORAGE”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hõhjubhŒ1 supports deleting local storage by a BPF program”…””}”(hjh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÛh³hÇh´Kihjubjþ)”}”(hhh]”hì)”}”(hŒ^while ``BPF_MAP_TYPE_CGROUP_STORAGE_DEPRECATED`` only deletes storage during prog detach time.”h]”(hŒwhile ”…””}”(hj)h²hh³Nh´Nubhö)”}”(hŒ*``BPF_MAP_TYPE_CGROUP_STORAGE_DEPRECATED``”h]”hŒ&BPF_MAP_TYPE_CGROUP_STORAGE_DEPRECATED”…””}”(hj1h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hõhj)ubhŒ. only deletes storage during prog detach time.”…””}”(hj)h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÇh´Khhj&ubah}”(h]”h ]”h"]”h$]”h&]”uh1jýhjubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÕh³hÇh´KihjÒh²hubeh}”(h]”h ]”h"]”h$]”h&]”uh1jÐhjWh²hh³hÇh´Nubhì)”}”(hŒéSo overall, ``BPF_MAP_TYPE_CGRP_STORAGE`` supports all ``BPF_MAP_TYPE_CGROUP_STORAGE_DEPRECATED`` functionality and beyond. It is recommended to use ``BPF_MAP_TYPE_CGRP_STORAGE`` instead of ``BPF_MAP_TYPE_CGROUP_STORAGE_DEPRECATED``.”h]”(hŒ So overall, ”…””}”(hj[h²hh³Nh´Nubhö)”}”(hŒ``BPF_MAP_TYPE_CGRP_STORAGE``”h]”hŒBPF_MAP_TYPE_CGRP_STORAGE”…””}”(hjch²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hõhj[ubhŒ supports all ”…””}”(hj[h²hh³Nh´Nubhö)”}”(hŒ*``BPF_MAP_TYPE_CGROUP_STORAGE_DEPRECATED``”h]”hŒ&BPF_MAP_TYPE_CGROUP_STORAGE_DEPRECATED”…””}”(hjuh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hõhj[ubhŒ4 functionality and beyond. It is recommended to use ”…””}”(hj[h²hh³Nh´Nubhö)”}”(hŒ``BPF_MAP_TYPE_CGRP_STORAGE``”h]”hŒBPF_MAP_TYPE_CGRP_STORAGE”…””}”(hj‡h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hõhj[ubhŒ instead of ”…””}”(hj[h²hh³Nh´Nubhö)”}”(hŒ*``BPF_MAP_TYPE_CGROUP_STORAGE_DEPRECATED``”h]”hŒ&BPF_MAP_TYPE_CGROUP_STORAGE_DEPRECATED”…””}”(hj™h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hõhj[ubhŒ.”…””}”(hj[h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hëh³hÇh´KkhjWh²hubeh}”(h]”ŒLdifference-between-bpf-map-type-cgrp-storage-and-bpf-map-type-cgroup-storage”ah ]”h"]”ŒLdifference between bpf_map_type_cgrp_storage and bpf_map_type_cgroup_storage”ah$]”h&]”uh1hÖhhØh²hh³hÇh´KOubeh}”(h]”Œbpf-map-type-cgrp-storage”ah ]”h"]”Œbpf_map_type_cgrp_storage”ah$]”h&]”uh1hÖhhh²hh³hÇh´Kubeh}”(h]”h ]”h"]”h$]”h&]”Œsource”hÇuh1hŒcurrent_source”NŒ current_line”NŒsettings”Œdocutils.frontend”ŒValues”“”)”}”(hÛNŒ generator”NŒ datestamp”NŒ source_link”NŒ source_url”NŒ toc_backlinks”Œentry”Œfootnote_backlinks”KŒ sectnum_xform”KŒstrip_comments”NŒstrip_elements_with_classes”NŒ strip_classes”NŒ report_level”KŒ halt_level”KŒexit_status_level”KŒdebug”NŒwarning_stream”NŒ traceback”ˆŒinput_encoding”Œ utf-8-sig”Œinput_encoding_error_handler”Œstrict”Œoutput_encoding”Œutf-8”Œoutput_encoding_error_handler”jäŒerror_encoding”Œutf-8”Œerror_encoding_error_handler”Œbackslashreplace”Œ language_code”Œen”Œrecord_dependencies”NŒconfig”NŒ id_prefix”hŒauto_id_prefix”Œid”Œ dump_settings”NŒdump_internals”NŒdump_transforms”NŒdump_pseudo_xml”NŒexpose_internals”NŒstrict_visitor”NŒ_disable_config”NŒ_source”hÇŒ _destination”NŒ _config_files”]”Œ7/var/lib/git/docbuild/linux/Documentation/docutils.conf”aŒfile_insertion_enabled”ˆŒ raw_enabled”KŒline_length_limit”M'Œpep_references”NŒ pep_base_url”Œhttps://peps.python.org/”Œpep_file_url_template”Œpep-%04d”Œrfc_references”NŒ rfc_base_url”Œ&https://datatracker.ietf.org/doc/html/”Œ tab_width”KŒtrim_footnote_reference_space”‰Œsyntax_highlight”Œlong”Œ smart_quotes”ˆŒsmartquotes_locales”]”Œcharacter_level_inline_markup”‰Œdoctitle_xform”‰Œ docinfo_xform”KŒsectsubtitle_xform”‰Œ image_loading”Œlink”Œembed_stylesheet”‰Œcloak_email_addresses”ˆŒsection_self_link”‰Œenv”NubŒreporter”NŒindirect_targets”]”Œsubstitution_defs”}”Œsubstitution_names”}”Œrefnames”}”Œrefids”}”Œnameids”}”(j¾j»jjjTjQj¶j³uŒ nametypes”}”(j¾‰j‰jT‰j¶‰uh}”(j»hØjjAjQjj³jWuŒ footnote_refs”}”Œ citation_refs”}”Œ autofootnotes”]”Œautofootnote_refs”]”Œsymbol_footnotes”]”Œsymbol_footnote_refs”]”Œ footnotes”]”Œ citations”]”Œautofootnote_start”KŒsymbol_footnote_start”KŒ id_counter”Œ collections”ŒCounter”“”}”…”R”Œparse_messages”]”Œtransform_messages”]”Œ transformer”NŒ include_log”]”Œ decoration”Nh²hub.