Jdsphinx.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_bloom_filtermodnameN classnameN refexplicitutagnamehhh ubh)}(hhh]hChinese (Traditional)}hh2sbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget(/translations/zh_TW/bpf/map_bloom_filtermodnameN classnameN refexplicituh1hhh ubh)}(hhh]hItalian}hhFsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget(/translations/it_IT/bpf/map_bloom_filtermodnameN classnameN refexplicituh1hhh ubh)}(hhh]hJapanese}hhZsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget(/translations/ja_JP/bpf/map_bloom_filtermodnameN classnameN refexplicituh1hhh ubh)}(hhh]hKorean}hhnsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget(/translations/ko_KR/bpf/map_bloom_filtermodnameN classnameN refexplicituh1hhh ubh)}(hhh]hSpanish}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget(/translations/sp_SP/bpf/map_bloom_filtermodnameN 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:spacepreserveuh1hhhhhhB/var/lib/git/docbuild/linux/Documentation/bpf/map_bloom_filter.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)}(hBPF_MAP_TYPE_BLOOM_FILTERh]hBPF_MAP_TYPE_BLOOM_FILTER}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhhhhhKubhnote)}(hE- ``BPF_MAP_TYPE_BLOOM_FILTER`` was introduced in kernel version 5.16h]h bullet_list)}(hhh]h list_item)}(hC``BPF_MAP_TYPE_BLOOM_FILTER`` was introduced in kernel version 5.16h]h paragraph)}(hhh](hliteral)}(h``BPF_MAP_TYPE_BLOOM_FILTER``h]hBPF_MAP_TYPE_BLOOM_FILTER}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhubh& was introduced in kernel version 5.16}(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)}(hX ``BPF_MAP_TYPE_BLOOM_FILTER`` provides a BPF bloom filter map. Bloom filters are a space-efficient probabilistic data structure used to quickly test whether an element exists in a set. In a bloom filter, false positives are possible whereas false negatives are not.h](h)}(h``BPF_MAP_TYPE_BLOOM_FILTER``h]hBPF_MAP_TYPE_BLOOM_FILTER}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubh provides a BPF bloom filter map. Bloom filters are a space-efficient probabilistic data structure used to quickly test whether an element exists in a set. In a bloom filter, false positives are possible whereas false negatives are not.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK hhhhubh)}(hThe bloom filter map does not have keys, only values. When the bloom filter map is created, it must be created with a ``key_size`` of 0. The bloom filter map supports two operations:h](hvThe bloom filter map does not have keys, only values. When the bloom filter map is created, it must be created with a }(hj7hhhNhNubh)}(h ``key_size``h]hkey_size}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj7ubh5 of 0. The bloom filter map supports two operations:}(hj7hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(hhh](h)}(h"push: adding an element to the maph]h)}(hj\h]h"push: adding an element to the map}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjZubah}(h]h ]h"]h$]h&]uh1hhjWhhhhhNubh)}(h;peek: determining whether an element is present in the map h]h)}(h:peek: determining whether an element is present in the maph]h:peek: determining whether an element is present in the map}(hjuhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjqubah}(h]h ]h"]h$]h&]uh1hhjWhhhhhNubeh}(h]h ]h"]h$]h&]jjuh1hhhhKhhhhubh)}(hBPF programs must use ``bpf_map_push_elem`` to add an element to the bloom filter map and ``bpf_map_peek_elem`` to query the map. These operations are exposed to userspace applications using the existing ``bpf`` syscall in the following way:h](hBPF programs must use }(hjhhhNhNubh)}(h``bpf_map_push_elem``h]hbpf_map_push_elem}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubh/ to add an element to the bloom filter map and }(hjhhhNhNubh)}(h``bpf_map_peek_elem``h]hbpf_map_peek_elem}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubh] to query the map. These operations are exposed to userspace applications using the existing }(hjhhhNhNubh)}(h``bpf``h]hbpf}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubh syscall in the following way:}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(hhh](h)}(h``BPF_MAP_UPDATE_ELEM`` -> pushh]h)}(hjh](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&]uh1hhjhhhhhNubh)}(h ``BPF_MAP_LOOKUP_ELEM`` -> peek h]h)}(h``BPF_MAP_LOOKUP_ELEM`` -> peekh](h)}(h``BPF_MAP_LOOKUP_ELEM``h]hBPF_MAP_LOOKUP_ELEM}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubh -> peek}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1hhjhhhhhNubeh}(h]h ]h"]h$]h&]jjuh1hhhhKhhhhubh)}(hX2The ``max_entries`` size that is specified at map creation time is used to approximate a reasonable bitmap size for the bloom filter, and is not otherwise strictly enforced. If the user wishes to insert more entries into the bloom filter than ``max_entries``, this may lead to a higher false positive rate.h](hThe }(hj'hhhNhNubh)}(h``max_entries``h]h max_entries}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj'ubh size that is specified at map creation time is used to approximate a reasonable bitmap size for the bloom filter, and is not otherwise strictly enforced. If the user wishes to insert more entries into the bloom filter than }(hj'hhhNhNubh)}(h``max_entries``h]h max_entries}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj'ubh0, this may lead to a higher false positive rate.}(hj'hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(hX:The number of hashes to use for the bloom filter is configurable using the lower 4 bits of ``map_extra`` in ``union bpf_attr`` at map creation time. If no number is specified, the default used will be 5 hash functions. In general, using more hashes decreases both the false positive rate and the speed of a lookup.h](h[The number of hashes to use for the bloom filter is configurable using the lower 4 bits of }(hjYhhhNhNubh)}(h ``map_extra``h]h map_extra}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1hhjYubh in }(hjYhhhNhNubh)}(h``union bpf_attr``h]hunion bpf_attr}(hjshhhNhNubah}(h]h ]h"]h$]h&]uh1hhjYubh at map creation time. If no number is specified, the default used will be 5 hash functions. In general, using more hashes decreases both the false positive rate and the speed of a lookup.}(hjYhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK%hhhhubh)}(hIt is not possible to delete elements from a bloom filter map. A bloom filter map may be used as an inner map. The user is responsible for synchronising concurrent updates and lookups to ensure no false negative lookups occur.h]hIt is not possible to delete elements from a bloom filter map. A bloom filter map may be used as an inner map. The user is responsible for synchronising concurrent updates and lookups to ensure no false negative lookups occur.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK+hhhhubh)}(hhh](h)}(hUsageh]hUsage}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhK1ubh)}(hhh](h)}(h Kernel BPFh]h Kernel BPF}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhK4ubh)}(hhh](h)}(hbpf_map_push_elem()h]hbpf_map_push_elem()}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhK7ubh 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)}hjsbah}(h]h ]h"]h$]h&]hhforcelanguagechighlight_args}uh1jhhhK9hjhhubh)}(hA ``value`` can be added to a bloom filter using the ``bpf_map_push_elem()`` helper. The ``flags`` parameter must be set to ``BPF_ANY`` when adding an entry to the bloom filter. This helper returns ``0`` on success, or negative error in case of failure.h](hA }(hjhhhNhNubh)}(h ``value``h]hvalue}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubh* can be added to a bloom filter using the }(hjhhhNhNubh)}(h``bpf_map_push_elem()``h]hbpf_map_push_elem()}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubh helper. The }(hjhhhNhNubh)}(h ``flags``h]hflags}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubh parameter must be set to }(hjhhhNhNubh)}(h ``BPF_ANY``h]hBPF_ANY}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubh? when adding an entry to the bloom filter. This helper returns }(hjhhhNhNubh)}(h``0``h]h0}(hj1hhhNhNubah}(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-push-elemah ]h"]bpf_map_push_elem()ah$]h&]uh1hhjhhhhhK7ubh)}(hhh](h)}(hbpf_map_peek_elem()h]hbpf_map_peek_elem()}(hjThhhNhNubah}(h]h ]h"]h$]h&]uh1hhjQhhhhhKCubj)}(h8long bpf_map_peek_elem(struct bpf_map *map, void *value)h]h8long bpf_map_peek_elem(struct bpf_map *map, void *value)}hjbsbah}(h]h ]h"]h$]h&]hhjjjj}uh1jhhhKEhjQhhubh)}(hThe ``bpf_map_peek_elem()`` helper is used to determine whether ``value`` is present in the bloom filter map. This helper returns ``0`` if ``value`` is probably present in the map, or ``-ENOENT`` if ``value`` is definitely not present in the map.h](hThe }(hjqhhhNhNubh)}(h``bpf_map_peek_elem()``h]hbpf_map_peek_elem()}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjqubh% helper is used to determine whether }(hjqhhhNhNubh)}(h ``value``h]hvalue}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjqubh9 is present in the bloom filter map. This helper returns }(hjqhhhNhNubh)}(h``0``h]h0}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjqubh if }(hjqhhhNhNubh)}(h ``value``h]hvalue}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjqubh$ is probably present in the map, or }(hjqhhhNhNubh)}(h ``-ENOENT``h]h-ENOENT}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjqubh if }(hjqhhhNhNubh)}(h ``value``h]hvalue}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjqubh& is definitely not present in the map.}(hjqhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKIhjQhhubeh}(h]bpf-map-peek-elemah ]h"]bpf_map_peek_elem()ah$]h&]uh1hhjhhhhhKCubeh}(h] kernel-bpfah ]h"]h$] kernel bpfah&]uh1hhjhhhhhK4 referencedKubh)}(hhh](h)}(h Userspaceh]h Userspace}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhKOubh)}(hhh](h)}(hbpf_map_update_elem()h]hbpf_map_update_elem()}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hhhhhKRubj)}(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&]hhjjjj}uh1jhhhKThj hhubh)}(hXA userspace program can add a ``value`` to a bloom filter using libbpf's ``bpf_map_update_elem`` function. The ``key`` parameter must be set to ``NULL`` and ``flags`` must be set to ``BPF_ANY``. Returns ``0`` on success, or negative error in case of failure.h](hA userspace program can add a }(hj-hhhNhNubh)}(h ``value``h]hvalue}(hj5hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj-ubh$ to a bloom filter using libbpf’s }(hj-hhhNhNubh)}(h``bpf_map_update_elem``h]hbpf_map_update_elem}(hjGhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj-ubh function. The }(hj-hhhNhNubh)}(h``key``h]hkey}(hjYhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj-ubh parameter must be set to }(hj-hhhNhNubh)}(h``NULL``h]hNULL}(hjkhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj-ubh and }(hj-hhhNhNubh)}(h ``flags``h]hflags}(hj}hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj-ubh must be set to }(hj-hhhNhNubh)}(h ``BPF_ANY``h]hBPF_ANY}(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&]uh1hhhhKXhj hhubeh}(h]bpf-map-update-elemah ]h"]bpf_map_update_elem()ah$]h&]uh1hhjhhhhhKRubh)}(hhh](h)}(hbpf_map_lookup_elem()h]hbpf_map_lookup_elem()}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhK^ubj)}(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&]hhjjjj}uh1jhhhK`hjhhubh)}(hX*A userspace program can determine the presence of ``value`` in a bloom filter using libbpf's ``bpf_map_lookup_elem`` function. The ``key`` parameter must be set to ``NULL``. Returns ``0`` if ``value`` is probably present in the map, or ``-ENOENT`` if ``value`` is definitely not present in the map.h](h2A userspace program can determine the presence of }(hjhhhNhNubh)}(h ``value``h]hvalue}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubh$ in a bloom filter using libbpf’s }(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}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubh parameter must be set to }(hjhhhNhNubh)}(h``NULL``h]hNULL}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubh . Returns }(hjhhhNhNubh)}(h``0``h]h0}(hj1hhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubh if }(hjhhhNhNubh)}(h ``value``h]hvalue}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubh$ is probably present in the map, or }(hjhhhNhNubh)}(h ``-ENOENT``h]h-ENOENT}(hjUhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubh if }hjsbh)}(h ``value``h]hvalue}(hjghhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubh& is definitely not present in the map.}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKdhjhhubeh}(h]bpf-map-lookup-elemah ]h"]bpf_map_lookup_elem()ah$]h&]uh1hhjhhhhhK^ubeh}(h] userspaceah ]h"]h$] userspaceah&]uh1hhjhhhhhKOjKubeh}(h]usageah ]h"]usageah$]h&]uh1hhhhhhhhK1ubh)}(hhh](h)}(hExamplesh]hExamples}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhKkubh)}(hhh](h)}(h Kernel BPFh]h Kernel BPF}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhKnubh)}(hBThis snippet shows how to declare a bloom filter in a BPF program:h]hBThis snippet shows how to declare a bloom filter in a BPF program:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKphjhhubj)}(hstruct { __uint(type, BPF_MAP_TYPE_BLOOM_FILTER); __type(value, __u32); __uint(max_entries, 1000); __uint(map_extra, 3); } bloom_filter SEC(".maps");h]hstruct { __uint(type, BPF_MAP_TYPE_BLOOM_FILTER); __type(value, __u32); __uint(max_entries, 1000); __uint(map_extra, 3); } bloom_filter SEC(".maps");}hjsbah}(h]h ]h"]h$]h&]hhjjjj}uh1jhhhKrhjhhubh)}(h[This snippet shows how to determine presence of a value in a bloom filter in a BPF program:h]h[This snippet shows how to determine presence of a value in a bloom filter in a BPF program:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK{hjhhubj)}(hXTvoid *lookup(__u32 key) { if (bpf_map_peek_elem(&bloom_filter, &key) == 0) { /* Verify not a false positive and fetch an associated * value using a secondary lookup, e.g. in a hash table */ return bpf_map_lookup_elem(&hash_table, &key); } return 0; }h]hXTvoid *lookup(__u32 key) { if (bpf_map_peek_elem(&bloom_filter, &key) == 0) { /* Verify not a false positive and fetch an associated * value using a secondary lookup, e.g. in a hash table */ return bpf_map_lookup_elem(&hash_table, &key); } return 0; }}hjsbah}(h]h ]h"]h$]h&]hhjjjj}uh1jhhhK~hjhhubeh}(h]id1ah ]h"]h$]jah&]uh1hhjhhhhhKnjKubh)}(hhh](h)}(h Userspaceh]h Userspace}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhhhhhKubh)}(hQThis snippet shows how to use libbpf to create a bloom filter map from userspace:h]hQThis snippet shows how to use libbpf to create a bloom filter map from userspace:}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubj)}(hXint create_bloom() { LIBBPF_OPTS(bpf_map_create_opts, opts, .map_extra = 3); /* number of hashes */ return bpf_map_create(BPF_MAP_TYPE_BLOOM_FILTER, "ipv6_bloom", /* name */ 0, /* key size, must be zero */ sizeof(ipv6_addr), /* value size */ 10000, /* max entries */ &opts); /* create options */ }h]hXint create_bloom() { LIBBPF_OPTS(bpf_map_create_opts, opts, .map_extra = 3); /* number of hashes */ return bpf_map_create(BPF_MAP_TYPE_BLOOM_FILTER, "ipv6_bloom", /* name */ 0, /* key size, must be zero */ sizeof(ipv6_addr), /* value size */ 10000, /* max entries */ &opts); /* create options */ }}hjsbah}(h]h ]h"]h$]h&]hhjjjj}uh1jhhhKhjhhubh)}(hJThis snippet shows how to add an element to a bloom filter from userspace:h]hJThis snippet shows how to add an element to a bloom filter from userspace:}(hj(hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjhhubj)}(hint add_element(struct bpf_map *bloom_map, __u32 value) { int bloom_fd = bpf_map__fd(bloom_map); return bpf_map_update_elem(bloom_fd, NULL, &value, BPF_ANY); }h]hint add_element(struct bpf_map *bloom_map, __u32 value) { int bloom_fd = bpf_map__fd(bloom_map); return bpf_map_update_elem(bloom_fd, NULL, &value, BPF_ANY); }}hj6sbah}(h]h ]h"]h$]h&]hhjjjj}uh1jhhhKhjhhubeh}(h]id2ah ]h"]h$]jah&]uh1hhjhhhhhKjKubeh}(h]examplesah ]h"]examplesah$]h&]uh1hhhhhhhhKkubh)}(hhh](h)}(h Referencesh]h References}(hjWhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjThhhhhKubh)}(hChttps://lwn.net/ml/bpf/20210831225005.2762202-1-joannekoong@fb.com/h]h reference)}(hjgh]hChttps://lwn.net/ml/bpf/20210831225005.2762202-1-joannekoong@fb.com/}(hjkhhhNhNubah}(h]h ]h"]h$]h&]refurijguh1jihjeubah}(h]h ]h"]h$]h&]uh1hhhhKhjThhubeh}(h] referencesah ]h"] referencesah$]h&]uh1hhhhhhhhKubeh}(h]bpf-map-type-bloom-filterah ]h"]bpf_map_type_bloom_filterah$]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 bpfNjNjKjj userspaceNjjjjjQjNjju nametypes}(jjjjNjjjjjQjuh}(jhjjjjjKjjjQjjjj jjjNjjjjGjjjTu 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”.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubah}(h]h ]h"]h$]h&]jalevelKtypeINFOsourcehlineKnuh1jhjhhhhhKnubj)}(hhh]h)}(h,Duplicate implicit target name: "userspace".h]h0Duplicate implicit target name: “userspace”.}(hj7hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj4ubah}(h]h ]h"]h$]h&]jGalevelKtypej1sourcehlineKuh1jhjhhhhhKubetransform_messages] transformerN include_log] decorationNhhub.