[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]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}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhubh and }(hhhhhNhNubh)}(h``BPF_MAP_TYPE_STACK``h]hBPF_MAP_TYPE_STACK}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhubh' 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](h)}(h``BPF_MAP_TYPE_QUEUE``h]hBPF_MAP_TYPE_QUEUE}(hj2hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj.ubh provides FIFO storage and }(hj.hhhNhNubh)}(h``BPF_MAP_TYPE_STACK``h]hBPF_MAP_TYPE_STACK}(hjDhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj.ubh 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 }(hj.hhhNhNubh)}(h``bpf``h]hbpf}(hjVhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj.ubh syscall in the following way:}(hj.hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK hhhhubh)}(hhh](h)}(h``BPF_MAP_LOOKUP_ELEM`` -> peekh]h)}(hjsh](h)}(h``BPF_MAP_LOOKUP_ELEM``h]hBPF_MAP_LOOKUP_ELEM}(hjxhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjuubh -> peek}(hjuhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjqubah}(h]h ]h"]h$]h&]uh1hhjnhhhhhNubh)}(h)``BPF_MAP_LOOKUP_AND_DELETE_ELEM`` -> poph]h)}(hjh](h)}(h"``BPF_MAP_LOOKUP_AND_DELETE_ELEM``h]hBPF_MAP_LOOKUP_AND_DELETE_ELEM}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubh -> pop}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1hhjnhhhhhNubh)}(h ``BPF_MAP_UPDATE_ELEM`` -> push h]h)}(h``BPF_MAP_UPDATE_ELEM`` -> pushh](h)}(h``BPF_MAP_UPDATE_ELEM``h]hBPF_MAP_UPDATE_ELEM}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubh -> push}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1hhjnhhhhhNubeh}(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](h)}(h``BPF_MAP_TYPE_QUEUE``h]hBPF_MAP_TYPE_QUEUE}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubh and }(hjhhhNhNubh)}(h``BPF_MAP_TYPE_STACK``h]hBPF_MAP_TYPE_STACK}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubh do not support }(hjhhhNhNubh)}(h``BPF_F_NO_PREALLOC``h]hBPF_F_NO_PREALLOC}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubh.}(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}(hj;hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj8hhhhhKubh)}(hhh](h)}(hbpf_map_push_elem()h]hbpf_map_push_elem()}(hjLhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjIhhhhhK 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)}hj\sbah}(h]h ]h"]h$]h&]hhforcelanguagechighlight_args}uh1jZhhhK"hjIhhubh)}(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 }(hjohhhNhNubh)}(h ``value``h]hvalue}(hjwhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjoubh, can be added to a queue or stack using the }(hjohhhNhNubh)}(h``bpf_map_push_elem``h]hbpf_map_push_elem}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjoubh helper. The }(hjohhhNhNubh)}(h ``flags``h]hflags}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjoubh parameter must be set to }(hjohhhNhNubh)}(h ``BPF_ANY``h]hBPF_ANY}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjoubh or }(hjohhhNhNubh)}(h ``BPF_EXIST``h]h BPF_EXIST}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjoubh. If }(hjohhhNhNubh)}(h ``flags``h]hflags}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjoubh is set to }(hjohhhNhNubh)}(h ``BPF_EXIST``h]h BPF_EXIST}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjoubh\ then, when the queue or stack is full, the oldest element will be removed to make room for }(hjohhhNhNubh)}(h ``value``h]hvalue}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjoubh to be added. Returns }(hjohhhNhNubh)}(h``0``h]h0}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjoubh2 on success, or negative error in case of failure.}(hjohhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK&hjIhhubeh}(h]bpf-map-push-elemah ]h"]bpf_map_push_elem()ah$]h&]uh1hhj8hhhhhK ubh)}(hhh](h)}(hbpf_map_peek_elem()h]hbpf_map_peek_elem()}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj'hhhhhK.ubj[)}(h8long bpf_map_peek_elem(struct bpf_map *map, void *value)h]h8long bpf_map_peek_elem(struct bpf_map *map, void *value)}hj8sbah}(h]h ]h"]h$]h&]hhjjjkjljm}uh1jZhhhK0hj'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 }(hjGhhhNhNubh)}(h ``value``h]hvalue}(hjOhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjGubh4 from a queue or stack without removing it. Returns }(hjGhhhNhNubh)}(h``0``h]h0}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1hhjGubh2 on success, or negative error in case of failure.}(hjGhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK4hj'hhubeh}(h]bpf-map-peek-elemah ]h"]bpf_map_peek_elem()ah$]h&]uh1hhj8hhhhhK.ubh)}(hhh](h)}(hbpf_map_pop_elem()h]hbpf_map_pop_elem()}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhK9ubj[)}(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&]hhjjjkjljm}uh1jZhhhK;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 }(hjhhhNhNubh)}(h ``value``h]hvalue}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubh from a queue or stack. Returns }(hjhhhNhNubh)}(h``0``h]h0}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubh2 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&]uh1hhj8hhhhhK9ubeh}(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()}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhKGubj[)}(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&]hhjjjkjljm}uh1jZhhhKIhjhhubh)}(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 }(hjhhhNhNubh)}(h ``value``h]hvalue}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubh( onto a queue or stack using libbpf’s }(hjhhhNhNubh)}(h``bpf_map_update_elem``h]hbpf_map_update_elem}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubh function. The }(hjhhhNhNubh)}(h``key``h]hkey}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubh parameter must be set to }(hjhhhNhNubh)}(h``NULL``h]hNULL}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubh and }(hjhhhNhNubh)}(h ``flags``h]hflags}(hjehhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubh must be set to }(hjhhhNhNubh)}(h ``BPF_ANY``h]hBPF_ANY}(hjwhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubh or }(hjhhhNhNubh)}(h ``BPF_EXIST``h]h BPF_EXIST}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubh!, with the same semantics as the }(hjhhhNhNubh)}(h``bpf_map_push_elem``h]hbpf_map_push_elem}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubh kernel helper. Returns }(hjhhhNhNubh)}(h``0``h]h0}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubh2 on success, or negative error in case of failure.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKMhjhhubeh}(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&]uh1hhjhhhhhKTubj[)}(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&]hhjjjkjljm}uh1jZhhhKVhjhhubh)}(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 }(hjhhhNhNubh)}(h ``value``h]hvalue}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubh2 at the head of a queue or stack using the libbpf }(hjhhhNhNubh)}(h``bpf_map_lookup_elem``h]hbpf_map_lookup_elem}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubh function. The }(hjhhhNhNubh)}(h``key``h]hkey}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubh parameter must be set to }(hjhhhNhNubh)}(h``NULL``h]hNULL}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubh . Returns }(hjhhhNhNubh)}(h``0``h]h0}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubh2 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()}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj]hhhhhK`ubj[)}(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)}hjnsbah}(h]h ]h"]h$]h&]hhjjjkjljm}uh1jZhhhKbhj]hhubh)}(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 }(hj}hhhNhNubh)}(h ``value``h]hvalue}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj}ubh4 from the head of a queue or stack using the libbpf }(hj}hhhNhNubh)}(h"``bpf_map_lookup_and_delete_elem``h]hbpf_map_lookup_and_delete_elem}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj}ubh function. The }(hj}hhhNhNubh)}(h``key``h]hkey}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj}ubh parameter must be set to }(hj}hhhNhNubh)}(h``NULL``h]hNULL}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj}ubh . Returns }(hj}hhhNhNubh)}(h``0``h]h0}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj}ubh2 on success, or negative error in case of failure.}(hj}hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKfhj]hhubeh}(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}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhKoubh)}(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:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKqhjhhubj[)}(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");}hj-sbah}(h]h ]h"]h$]h&]hhjjjkjljm}uh1jZhhhKshjhhubeh}(h]id1ah ]h"]h$]jah&]uh1hhjhhhhhKojKubh)}(hhh](h)}(h Userspaceh]h Userspace}(hjFhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjChhhhhK}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:}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjChhubj[)}(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 */ }}hjbsbah}(h]h ]h"]h$]h&]hhjjjkjljm}uh1jZhhhKhjChhubeh}(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_sourceh _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 bpfNj$j!j~j{jj userspaceNjjjZjWjjj}jzjju nametypes}(jjj"j$j~jj#jjZjj}juh}(jhjj'jj8j!jIj{j'jjjjjjjWjjj]jzjj>jjsjCjju 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”.}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjDubah}(h]h ]h"]h$]h&]j>alevelKtypeINFOsourcehlineKouh1jBhjhhhhhKoubjC)}(hhh]h)}(h,Duplicate implicit target name: "userspace".h]h0Duplicate implicit target name: “userspace”.}(hjchhhNhNubah}(h]h ]h"]h$]h&]uh1hhj`ubah}(h]h ]h"]h$]h&]jsalevelKtypej]sourcehlineK}uh1jBhjChhhhhK}ubetransform_messages] transformerN include_log] decorationNhhub.