]sphinx.addnodesdocument)}( rawsourcechildren]( translations LanguagesNode)}(hhh](h pending_xref)}(hhh]docutils.nodesTextChinese (Simplified)}parenthsba attributes}(ids]classes]names]dupnames]backrefs] refdomainstdreftypedoc reftarget'/translations/zh_CN/bpf/map_queue_stackmodnameN classnameN refexplicitutagnamehhh ubh)}(hhh]hChinese (Traditional)}hh2sbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget'/translations/zh_TW/bpf/map_queue_stackmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hItalian}hhFsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget'/translations/it_IT/bpf/map_queue_stackmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hJapanese}hhZsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget'/translations/ja_JP/bpf/map_queue_stackmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hKorean}hhnsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget'/translations/ko_KR/bpf/map_queue_stackmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hPortuguese (Brazilian)}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget'/translations/pt_BR/bpf/map_queue_stackmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hSpanish}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget'/translations/sp_SP/bpf/map_queue_stackmodnameN classnameN refexplicituh1hhh ubeh}(h]h ]h"]h$]h&]current_languageEnglishuh1h hh _documenthsourceNlineNubhcomment)}(h%SPDX-License-Identifier: GPL-2.0-onlyh]h%SPDX-License-Identifier: GPL-2.0-only}hhsbah}(h]h ]h"]h$]h&] xml:spacepreserveuh1hhhhhhA/var/lib/git/docbuild/linux/Documentation/bpf/map_queue_stack.rsthKubh)}(h Copyright (C) 2022 Red Hat, Inc.h]h Copyright (C) 2022 Red Hat, Inc.}hhsbah}(h]h ]h"]h$]h&]hhuh1hhhhhhhhKubhsection)}(hhh](htitle)}(h)BPF_MAP_TYPE_QUEUE and BPF_MAP_TYPE_STACKh]h)BPF_MAP_TYPE_QUEUE and BPF_MAP_TYPE_STACK}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhhhhhKubhnote)}(h\- ``BPF_MAP_TYPE_QUEUE`` and ``BPF_MAP_TYPE_STACK`` were introduced in kernel version 4.20h]h bullet_list)}(hhh]h list_item)}(hX``BPF_MAP_TYPE_QUEUE`` and ``BPF_MAP_TYPE_STACK`` were introduced in kernel version 4.20h]h paragraph)}(hX``BPF_MAP_TYPE_QUEUE`` and ``BPF_MAP_TYPE_STACK`` were introduced in kernel version 4.20h](hliteral)}(h``BPF_MAP_TYPE_QUEUE``h]hBPF_MAP_TYPE_QUEUE}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhhubh and }(hhhhhNhNubj)}(h``BPF_MAP_TYPE_STACK``h]hBPF_MAP_TYPE_STACK}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhhubh' were introduced in kernel version 4.20}(hhhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK hhubah}(h]h ]h"]h$]h&]uh1hhhubah}(h]h ]h"]h$]h&]bullet-uh1hhhhK hhubah}(h]h ]h"]h$]h&]uh1hhhhhhNhNubh)}(hXQ``BPF_MAP_TYPE_QUEUE`` provides FIFO storage and ``BPF_MAP_TYPE_STACK`` provides LIFO storage for BPF programs. These maps support peek, pop and push operations that are exposed to BPF programs through the respective helpers. These operations are exposed to userspace applications using the existing ``bpf`` syscall in the following way:h](j)}(h``BPF_MAP_TYPE_QUEUE``h]hBPF_MAP_TYPE_QUEUE}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjBubh provides FIFO storage and }(hjBhhhNhNubj)}(h``BPF_MAP_TYPE_STACK``h]hBPF_MAP_TYPE_STACK}(hjXhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjBubh provides LIFO storage for BPF programs. These maps support peek, pop and push operations that are exposed to BPF programs through the respective helpers. These operations are exposed to userspace applications using the existing }(hjBhhhNhNubj)}(h``bpf``h]hbpf}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjBubh syscall in the following way:}(hjBhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK hhhhubh)}(hhh](h)}(h``BPF_MAP_LOOKUP_ELEM`` -> peekh]h)}(hjh](j)}(h``BPF_MAP_LOOKUP_ELEM``h]hBPF_MAP_LOOKUP_ELEM}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh -> peek}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1hhjhhhhhNubh)}(h)``BPF_MAP_LOOKUP_AND_DELETE_ELEM`` -> poph]h)}(hjh](j)}(h"``BPF_MAP_LOOKUP_AND_DELETE_ELEM``h]hBPF_MAP_LOOKUP_AND_DELETE_ELEM}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh -> pop}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1hhjhhhhhNubh)}(h ``BPF_MAP_UPDATE_ELEM`` -> push h]h)}(h``BPF_MAP_UPDATE_ELEM`` -> pushh](j)}(h``BPF_MAP_UPDATE_ELEM``h]hBPF_MAP_UPDATE_ELEM}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh -> push}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1hhjhhhhhNubeh}(h]h ]h"]h$]h&]j:j;uh1hhhhKhhhhubh)}(hW``BPF_MAP_TYPE_QUEUE`` and ``BPF_MAP_TYPE_STACK`` do not support ``BPF_F_NO_PREALLOC``.h](j)}(h``BPF_MAP_TYPE_QUEUE``h]hBPF_MAP_TYPE_QUEUE}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh and }(hjhhhNhNubj)}(h``BPF_MAP_TYPE_STACK``h]hBPF_MAP_TYPE_STACK}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh do not support }(hjhhhNhNubj)}(h``BPF_F_NO_PREALLOC``h]hBPF_F_NO_PREALLOC}(hj#hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(hhh](h)}(hUsageh]hUsage}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj;hhhhhKubh)}(hhh](h)}(h Kernel BPFh]h Kernel BPF}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjLhhhhhKubh)}(hhh](h)}(hbpf_map_push_elem()h]hbpf_map_push_elem()}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj]hhhhhK ubh literal_block)}(hIlong bpf_map_push_elem(struct bpf_map *map, const void *value, u64 flags)h]hIlong bpf_map_push_elem(struct bpf_map *map, const void *value, u64 flags)}hjpsbah}(h]h ]h"]h$]h&]hhƌforcelanguagechighlight_args}uh1jnhhhK"hj]hhubh)}(hXyAn element ``value`` can be added to a queue or stack using the ``bpf_map_push_elem`` helper. The ``flags`` parameter must be set to ``BPF_ANY`` or ``BPF_EXIST``. If ``flags`` is set to ``BPF_EXIST`` then, when the queue or stack is full, the oldest element will be removed to make room for ``value`` to be added. Returns ``0`` on success, or negative error in case of failure.h](h An element }(hjhhhNhNubj)}(h ``value``h]hvalue}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh, can be added to a queue or stack using the }(hjhhhNhNubj)}(h``bpf_map_push_elem``h]hbpf_map_push_elem}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh helper. The }(hjhhhNhNubj)}(h ``flags``h]hflags}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh parameter must be set to }(hjhhhNhNubj)}(h ``BPF_ANY``h]hBPF_ANY}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh or }(hjhhhNhNubj)}(h ``BPF_EXIST``h]h BPF_EXIST}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh. If }(hjhhhNhNubj)}(h ``flags``h]hflags}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh is set to }(hjhhhNhNubj)}(h ``BPF_EXIST``h]h BPF_EXIST}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh\ then, when the queue or stack is full, the oldest element will be removed to make room for }(hjhhhNhNubj)}(h ``value``h]hvalue}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh to be added. Returns }(hjhhhNhNubj)}(h``0``h]h0}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh2 on success, or negative error in case of failure.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK&hj]hhubeh}(h]bpf-map-push-elemah ]h"]bpf_map_push_elem()ah$]h&]uh1hhjLhhhhhK ubh)}(hhh](h)}(hbpf_map_peek_elem()h]hbpf_map_peek_elem()}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj;hhhhhK.ubjo)}(h8long bpf_map_peek_elem(struct bpf_map *map, void *value)h]h8long bpf_map_peek_elem(struct bpf_map *map, void *value)}hjLsbah}(h]h ]h"]h$]h&]hhj~jjj}uh1jnhhhK0hj;hhubh)}(hThis helper fetches an element ``value`` from a queue or stack without removing it. Returns ``0`` on success, or negative error in case of failure.h](hThis helper fetches an element }(hj[hhhNhNubj)}(h ``value``h]hvalue}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1jhj[ubh4 from a queue or stack without removing it. Returns }(hj[hhhNhNubj)}(h``0``h]h0}(hjuhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj[ubh2 on success, or negative error in case of failure.}(hj[hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK4hj;hhubeh}(h]bpf-map-peek-elemah ]h"]bpf_map_peek_elem()ah$]h&]uh1hhjLhhhhhK.ubh)}(hhh](h)}(hbpf_map_pop_elem()h]hbpf_map_pop_elem()}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhK9ubjo)}(h7long bpf_map_pop_elem(struct bpf_map *map, void *value)h]h7long bpf_map_pop_elem(struct bpf_map *map, void *value)}hjsbah}(h]h ]h"]h$]h&]hhj~jjj}uh1jnhhhK;hjhhubh)}(hThis helper removes an element into ``value`` from a queue or stack. Returns ``0`` on success, or negative error in case of failure.h](h$This helper removes an element into }(hjhhhNhNubj)}(h ``value``h]hvalue}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh from a queue or stack. Returns }(hjhhhNhNubj)}(h``0``h]h0}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh2 on success, or negative error in case of failure.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK?hjhhubeh}(h]bpf-map-pop-elemah ]h"]bpf_map_pop_elem()ah$]h&]uh1hhjLhhhhhK9ubeh}(h] kernel-bpfah ]h"]h$] kernel bpfah&]uh1hhj;hhhhhK referencedKubh)}(hhh](h)}(h Userspaceh]h Userspace}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhKDubh)}(hhh](h)}(hbpf_map_update_elem()h]hbpf_map_update_elem()}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hhhhhKGubjo)}(hQint bpf_map_update_elem (int fd, const void *key, const void *value, __u64 flags)h]hQint bpf_map_update_elem (int fd, const void *key, const void *value, __u64 flags)}hjsbah}(h]h ]h"]h$]h&]hhj~jjj}uh1jnhhhKIhj hhubh)}(hXZA userspace program can push ``value`` onto a queue or stack using libbpf's ``bpf_map_update_elem`` function. The ``key`` parameter must be set to ``NULL`` and ``flags`` must be set to ``BPF_ANY`` or ``BPF_EXIST``, with the same semantics as the ``bpf_map_push_elem`` kernel helper. Returns ``0`` on success, or negative error in case of failure.h](hA userspace program can push }(hj)hhhNhNubj)}(h ``value``h]hvalue}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj)ubh( onto a queue or stack using libbpf’s }(hj)hhhNhNubj)}(h``bpf_map_update_elem``h]hbpf_map_update_elem}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1jhj)ubh function. The }(hj)hhhNhNubj)}(h``key``h]hkey}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj)ubh parameter must be set to }(hj)hhhNhNubj)}(h``NULL``h]hNULL}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1jhj)ubh and }(hj)hhhNhNubj)}(h ``flags``h]hflags}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj)ubh must be set to }(hj)hhhNhNubj)}(h ``BPF_ANY``h]hBPF_ANY}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj)ubh or }(hj)hhhNhNubj)}(h ``BPF_EXIST``h]h BPF_EXIST}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj)ubh!, with the same semantics as the }(hj)hhhNhNubj)}(h``bpf_map_push_elem``h]hbpf_map_push_elem}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj)ubh kernel helper. Returns }(hj)hhhNhNubj)}(h``0``h]h0}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhj)ubh2 on success, or negative error in case of failure.}(hj)hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKMhj hhubeh}(h]bpf-map-update-elemah ]h"]bpf_map_update_elem()ah$]h&]uh1hhjhhhhhKGubh)}(hhh](h)}(hbpf_map_lookup_elem()h]hbpf_map_lookup_elem()}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhKTubjo)}(h>int bpf_map_lookup_elem (int fd, const void *key, void *value)h]h>int bpf_map_lookup_elem (int fd, const void *key, void *value)}hjsbah}(h]h ]h"]h$]h&]hhj~jjj}uh1jnhhhKVhjhhubh)}(hA userspace program can peek at the ``value`` at the head of a queue or stack using the libbpf ``bpf_map_lookup_elem`` function. The ``key`` parameter must be set to ``NULL``. Returns ``0`` on success, or negative error in case of failure.h](h$A userspace program can peek at the }(hjhhhNhNubj)}(h ``value``h]hvalue}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh2 at the head of a queue or stack using the libbpf }(hjhhhNhNubj)}(h``bpf_map_lookup_elem``h]hbpf_map_lookup_elem}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh function. The }(hjhhhNhNubj)}(h``key``h]hkey}(hj-hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh parameter must be set to }(hjhhhNhNubj)}(h``NULL``h]hNULL}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh . Returns }(hjhhhNhNubj)}(h``0``h]h0}(hjQhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh2 on success, or negative error in case of failure.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKZhjhhubeh}(h]bpf-map-lookup-elemah ]h"]bpf_map_lookup_elem()ah$]h&]uh1hhjhhhhhKTubh)}(hhh](h)}(h bpf_map_lookup_and_delete_elem()h]h bpf_map_lookup_and_delete_elem()}(hjthhhNhNubah}(h]h ]h"]h$]h&]uh1hhjqhhhhhK`ubjo)}(hIint bpf_map_lookup_and_delete_elem (int fd, const void *key, void *value)h]hIint bpf_map_lookup_and_delete_elem (int fd, const void *key, void *value)}hjsbah}(h]h ]h"]h$]h&]hhj~jjj}uh1jnhhhKbhjqhhubh)}(hA userspace program can pop a ``value`` from the head of a queue or stack using the libbpf ``bpf_map_lookup_and_delete_elem`` function. The ``key`` parameter must be set to ``NULL``. Returns ``0`` on success, or negative error in case of failure.h](hA userspace program can pop a }(hjhhhNhNubj)}(h ``value``h]hvalue}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh4 from the head of a queue or stack using the libbpf }(hjhhhNhNubj)}(h"``bpf_map_lookup_and_delete_elem``h]hbpf_map_lookup_and_delete_elem}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh function. The }(hjhhhNhNubj)}(h``key``h]hkey}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh parameter must be set to }(hjhhhNhNubj)}(h``NULL``h]hNULL}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh . Returns }(hjhhhNhNubj)}(h``0``h]h0}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh2 on success, or negative error in case of failure.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKfhjqhhubeh}(h]bpf-map-lookup-and-delete-elemah ]h"] bpf_map_lookup_and_delete_elem()ah$]h&]uh1hhjhhhhhK`ubeh}(h] userspaceah ]h"]h$] userspaceah&]uh1hhj;hhhhhKDjKubeh}(h]usageah ]h"]usageah$]h&]uh1hhhhhhhhKubh)}(hhh](h)}(hExamplesh]hExamples}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhKlubh)}(hhh](h)}(h Kernel BPFh]h Kernel BPF}(hj%hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj"hhhhhKoubh)}(h;This snippet shows how to declare a queue in a BPF program:h]h;This snippet shows how to declare a queue in a BPF program:}(hj3hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKqhj"hhubjo)}(hstruct { __uint(type, BPF_MAP_TYPE_QUEUE); __type(value, __u32); __uint(max_entries, 10); } queue SEC(".maps");h]hstruct { __uint(type, BPF_MAP_TYPE_QUEUE); __type(value, __u32); __uint(max_entries, 10); } queue SEC(".maps");}hjAsbah}(h]h ]h"]h$]h&]hhj~jjj}uh1jnhhhKshj"hhubeh}(h]id1ah ]h"]h$]jah&]uh1hhjhhhhhKojKubh)}(hhh](h)}(h Userspaceh]h Userspace}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjWhhhhhK}ubh)}(hVThis snippet shows how to use libbpf's low-level API to create a queue from userspace:h]hXThis snippet shows how to use libbpf’s low-level API to create a queue from userspace:}(hjhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjWhhubjo)}(hXint create_queue() { return bpf_map_create(BPF_MAP_TYPE_QUEUE, "sample_queue", /* name */ 0, /* key size, must be zero */ sizeof(__u32), /* value size */ 10, /* max entries */ NULL); /* create options */ }h]hXint create_queue() { return bpf_map_create(BPF_MAP_TYPE_QUEUE, "sample_queue", /* name */ 0, /* key size, must be zero */ sizeof(__u32), /* value size */ 10, /* max entries */ NULL); /* create options */ }}hjvsbah}(h]h ]h"]h$]h&]hhj~jjj}uh1jnhhhKhjWhhubeh}(h]id2ah ]h"]h$]jah&]uh1hhjhhhhhK}jKubeh}(h]examplesah ]h"]examplesah$]h&]uh1hhhhhhhhKlubh)}(hhh](h)}(h Referencesh]h References}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhKubh)}(hNhttps://lwn.net/ml/netdev/153986858555.9127.14517764371945179514.stgit@kernel/h]h reference)}(hjh]hNhttps://lwn.net/ml/netdev/153986858555.9127.14517764371945179514.stgit@kernel/}(hjhhhNhNubah}(h]h ]h"]h$]h&]refurijuh1jhjubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubeh}(h] referencesah ]h"] referencesah$]h&]uh1hhhhhhhhKubeh}(h])bpf-map-type-queue-and-bpf-map-type-stackah ]h"])bpf_map_type_queue and bpf_map_type_stackah$]h&]uh1hhhhhhhhKubeh}(h]h ]h"]h$]h&]sourcehuh1hcurrent_sourceN current_lineNsettingsdocutils.frontendValues)}(hN generatorN datestampN source_linkN source_urlN toc_backlinksentryfootnote_backlinksK sectnum_xformKstrip_commentsNstrip_elements_with_classesN strip_classesN report_levelK halt_levelKexit_status_levelKdebugNwarning_streamN tracebackinput_encoding utf-8-siginput_encoding_error_handlerstrictoutput_encodingutf-8output_encoding_error_handlerjerror_encodingutf-8error_encoding_error_handlerbackslashreplace language_codeenrecord_dependenciesNconfigN id_prefixhauto_id_prefixid dump_settingsNdump_internalsNdump_transformsNdump_pseudo_xmlNexpose_internalsNstrict_visitorN_disable_configN_sourcehnj _destinationN _config_files]7/var/lib/git/docbuild/linux/Documentation/docutils.confafile_insertion_enabled raw_enabledKline_length_limitM'pep_referencesN pep_base_urlhttps://peps.python.org/pep_file_url_templatepep-%04drfc_referencesN rfc_base_url&https://datatracker.ietf.org/doc/html/ tab_widthKtrim_footnote_reference_spacesyntax_highlightlong smart_quotessmartquotes_locales]character_level_inline_markupdoctitle_xform docinfo_xformKsectsubtitle_xform image_loadinglinkembed_stylesheetcloak_email_addressessection_self_linkenvNubreporterNindirect_targets]substitution_defs}substitution_names}refnames}refids}nameids}(jjjj  kernel bpfNj8j5jjjj userspaceNjjjnjkjjjjjju nametypes}(jjj6j8jjj7jjnjjjuh}(jhj j;jjLj5j]jj;jjjjjj jkjjjqjjjRj"jjWjju footnote_refs} citation_refs} autofootnotes]autofootnote_refs]symbol_footnotes]symbol_footnote_refs] footnotes] citations]autofootnote_startKsymbol_footnote_startK id_counter collectionsCounter}jKsRparse_messages](hsystem_message)}(hhh]h)}(h-Duplicate implicit target name: "kernel bpf".h]h1Duplicate implicit target name: “kernel bpf”.}(hj[hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjXubah}(h]h ]h"]h$]h&]jRalevelKtypeINFOsourcehnjlineKouh1jVhj"hhhhhKoubjW)}(hhh]h)}(h,Duplicate implicit target name: "userspace".h]h0Duplicate implicit target name: “userspace”.}(hjwhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjtubah}(h]h ]h"]h$]h&]jalevelKtypejqsourcehnjlineK}uh1jVhjWhhhhhK}ubetransform_messages] transformerN include_log] decorationNhhub.