~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/Documentation/bpf/map_hash.rst

Version: ~ [ linux-6.12-rc7 ] ~ [ linux-6.11.7 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.60 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.116 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.171 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.229 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.285 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.323 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.12 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

Diff markup

Differences between /Documentation/bpf/map_hash.rst (Version linux-6.12-rc7) and /Documentation/bpf/map_hash.rst (Version linux-6.0.19)


  1 .. SPDX-License-Identifier: GPL-2.0-only            1 .. SPDX-License-Identifier: GPL-2.0-only
  2 .. Copyright (C) 2022 Red Hat, Inc.                 2 .. Copyright (C) 2022 Red Hat, Inc.
  3 .. Copyright (C) 2022-2023 Isovalent, Inc.     << 
  4                                                     3 
  5 ==============================================      4 ===============================================
  6 BPF_MAP_TYPE_HASH, with PERCPU and LRU Variant      5 BPF_MAP_TYPE_HASH, with PERCPU and LRU Variants
  7 ==============================================      6 ===============================================
  8                                                     7 
  9 .. note::                                           8 .. note::
 10    - ``BPF_MAP_TYPE_HASH`` was introduced in k      9    - ``BPF_MAP_TYPE_HASH`` was introduced in kernel version 3.19
 11    - ``BPF_MAP_TYPE_PERCPU_HASH`` was introduc     10    - ``BPF_MAP_TYPE_PERCPU_HASH`` was introduced in version 4.6
 12    - Both ``BPF_MAP_TYPE_LRU_HASH`` and ``BPF_     11    - Both ``BPF_MAP_TYPE_LRU_HASH`` and ``BPF_MAP_TYPE_LRU_PERCPU_HASH``
 13      were introduced in version 4.10               12      were introduced in version 4.10
 14                                                    13 
 15 ``BPF_MAP_TYPE_HASH`` and ``BPF_MAP_TYPE_PERCP     14 ``BPF_MAP_TYPE_HASH`` and ``BPF_MAP_TYPE_PERCPU_HASH`` provide general
 16 purpose hash map storage. Both the key and the     15 purpose hash map storage. Both the key and the value can be structs,
 17 allowing for composite keys and values.            16 allowing for composite keys and values.
 18                                                    17 
 19 The kernel is responsible for allocating and f     18 The kernel is responsible for allocating and freeing key/value pairs, up
 20 to the max_entries limit that you specify. Has     19 to the max_entries limit that you specify. Hash maps use pre-allocation
 21 of hash table elements by default. The ``BPF_F     20 of hash table elements by default. The ``BPF_F_NO_PREALLOC`` flag can be
 22 used to disable pre-allocation when it is too      21 used to disable pre-allocation when it is too memory expensive.
 23                                                    22 
 24 ``BPF_MAP_TYPE_PERCPU_HASH`` provides a separa     23 ``BPF_MAP_TYPE_PERCPU_HASH`` provides a separate value slot per
 25 CPU. The per-cpu values are stored internally      24 CPU. The per-cpu values are stored internally in an array.
 26                                                    25 
 27 The ``BPF_MAP_TYPE_LRU_HASH`` and ``BPF_MAP_TY     26 The ``BPF_MAP_TYPE_LRU_HASH`` and ``BPF_MAP_TYPE_LRU_PERCPU_HASH``
 28 variants add LRU semantics to their respective     27 variants add LRU semantics to their respective hash tables. An LRU hash
 29 will automatically evict the least recently us     28 will automatically evict the least recently used entries when the hash
 30 table reaches capacity. An LRU hash maintains      29 table reaches capacity. An LRU hash maintains an internal LRU list that
 31 is used to select elements for eviction. This      30 is used to select elements for eviction. This internal LRU list is
 32 shared across CPUs but it is possible to reque     31 shared across CPUs but it is possible to request a per CPU LRU list with
 33 the ``BPF_F_NO_COMMON_LRU`` flag when calling  !!  32 the ``BPF_F_NO_COMMON_LRU`` flag when calling ``bpf_map_create``.
 34 following table outlines the properties of LRU << 
 35 map type and the flags used to create the map. << 
 36                                                << 
 37 ======================== ===================== << 
 38 Flag                     ``BPF_MAP_TYPE_LRU_HA << 
 39 ======================== ===================== << 
 40 **BPF_F_NO_COMMON_LRU**  Per-CPU LRU, global m << 
 41 **!BPF_F_NO_COMMON_LRU** Global LRU, global ma << 
 42 ======================== ===================== << 
 43                                                    33 
 44 Usage                                              34 Usage
 45 =====                                              35 =====
 46                                                    36 
 47 Kernel BPF                                     !!  37 .. c:function::
 48 ----------                                     << 
 49                                                << 
 50 bpf_map_update_elem()                          << 
 51 ~~~~~~~~~~~~~~~~~~~~~                          << 
 52                                                << 
 53 .. code-block:: c                              << 
 54                                                << 
 55    long bpf_map_update_elem(struct bpf_map *ma     38    long bpf_map_update_elem(struct bpf_map *map, const void *key, const void *value, u64 flags)
 56                                                    39 
 57 Hash entries can be added or updated using the     40 Hash entries can be added or updated using the ``bpf_map_update_elem()``
 58 helper. This helper replaces existing elements     41 helper. This helper replaces existing elements atomically. The ``flags``
 59 parameter can be used to control the update be     42 parameter can be used to control the update behaviour:
 60                                                    43 
 61 - ``BPF_ANY`` will create a new element or upd     44 - ``BPF_ANY`` will create a new element or update an existing element
 62 - ``BPF_NOEXIST`` will create a new element on     45 - ``BPF_NOEXIST`` will create a new element only if one did not already
 63   exist                                            46   exist
 64 - ``BPF_EXIST`` will update an existing elemen     47 - ``BPF_EXIST`` will update an existing element
 65                                                    48 
 66 ``bpf_map_update_elem()`` returns 0 on success     49 ``bpf_map_update_elem()`` returns 0 on success, or negative error in
 67 case of failure.                                   50 case of failure.
 68                                                    51 
 69 bpf_map_lookup_elem()                          !!  52 .. c:function::
 70 ~~~~~~~~~~~~~~~~~~~~~                          << 
 71                                                << 
 72 .. code-block:: c                              << 
 73                                                << 
 74    void *bpf_map_lookup_elem(struct bpf_map *m     53    void *bpf_map_lookup_elem(struct bpf_map *map, const void *key)
 75                                                    54 
 76 Hash entries can be retrieved using the ``bpf_     55 Hash entries can be retrieved using the ``bpf_map_lookup_elem()``
 77 helper. This helper returns a pointer to the v     56 helper. This helper returns a pointer to the value associated with
 78 ``key``, or ``NULL`` if no entry was found.        57 ``key``, or ``NULL`` if no entry was found.
 79                                                    58 
 80 bpf_map_delete_elem()                          !!  59 .. c:function::
 81 ~~~~~~~~~~~~~~~~~~~~~                          << 
 82                                                << 
 83 .. code-block:: c                              << 
 84                                                << 
 85    long bpf_map_delete_elem(struct bpf_map *ma     60    long bpf_map_delete_elem(struct bpf_map *map, const void *key)
 86                                                    61 
 87 Hash entries can be deleted using the ``bpf_ma     62 Hash entries can be deleted using the ``bpf_map_delete_elem()``
 88 helper. This helper will return 0 on success,      63 helper. This helper will return 0 on success, or negative error in case
 89 of failure.                                        64 of failure.
 90                                                    65 
 91 Per CPU Hashes                                     66 Per CPU Hashes
 92 --------------                                     67 --------------
 93                                                    68 
 94 For ``BPF_MAP_TYPE_PERCPU_HASH`` and ``BPF_MAP     69 For ``BPF_MAP_TYPE_PERCPU_HASH`` and ``BPF_MAP_TYPE_LRU_PERCPU_HASH``
 95 the ``bpf_map_update_elem()`` and ``bpf_map_lo     70 the ``bpf_map_update_elem()`` and ``bpf_map_lookup_elem()`` helpers
 96 automatically access the hash slot for the cur     71 automatically access the hash slot for the current CPU.
 97                                                    72 
 98 bpf_map_lookup_percpu_elem()                   !!  73 .. c:function::
 99 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~                   << 
100                                                << 
101 .. code-block:: c                              << 
102                                                << 
103    void *bpf_map_lookup_percpu_elem(struct bpf     74    void *bpf_map_lookup_percpu_elem(struct bpf_map *map, const void *key, u32 cpu)
104                                                    75 
105 The ``bpf_map_lookup_percpu_elem()`` helper ca     76 The ``bpf_map_lookup_percpu_elem()`` helper can be used to lookup the
106 value in the hash slot for a specific CPU. Ret     77 value in the hash slot for a specific CPU. Returns value associated with
107 ``key`` on ``cpu`` , or ``NULL`` if no entry w     78 ``key`` on ``cpu`` , or ``NULL`` if no entry was found or ``cpu`` is
108 invalid.                                           79 invalid.
109                                                    80 
110 Concurrency                                        81 Concurrency
111 -----------                                        82 -----------
112                                                    83 
113 Values stored in ``BPF_MAP_TYPE_HASH`` can be      84 Values stored in ``BPF_MAP_TYPE_HASH`` can be accessed concurrently by
114 programs running on different CPUs.  Since Ker     85 programs running on different CPUs.  Since Kernel version 5.1, the BPF
115 infrastructure provides ``struct bpf_spin_lock     86 infrastructure provides ``struct bpf_spin_lock`` to synchronise access.
116 See ``tools/testing/selftests/bpf/progs/test_s     87 See ``tools/testing/selftests/bpf/progs/test_spin_lock.c``.
117                                                    88 
118 Userspace                                          89 Userspace
119 ---------                                          90 ---------
120                                                    91 
121 bpf_map_get_next_key()                         !!  92 .. c:function::
122 ~~~~~~~~~~~~~~~~~~~~~~                         << 
123                                                << 
124 .. code-block:: c                              << 
125                                                << 
126    int bpf_map_get_next_key(int fd, const void     93    int bpf_map_get_next_key(int fd, const void *cur_key, void *next_key)
127                                                    94 
128 In userspace, it is possible to iterate throug     95 In userspace, it is possible to iterate through the keys of a hash using
129 libbpf's ``bpf_map_get_next_key()`` function.      96 libbpf's ``bpf_map_get_next_key()`` function. The first key can be fetched by
130 calling ``bpf_map_get_next_key()`` with ``cur_     97 calling ``bpf_map_get_next_key()`` with ``cur_key`` set to
131 ``NULL``. Subsequent calls will fetch the next     98 ``NULL``. Subsequent calls will fetch the next key that follows the
132 current key. ``bpf_map_get_next_key()`` return     99 current key. ``bpf_map_get_next_key()`` returns 0 on success, -ENOENT if
133 cur_key is the last key in the hash, or negati    100 cur_key is the last key in the hash, or negative error in case of
134 failure.                                          101 failure.
135                                                   102 
136 Note that if ``cur_key`` gets deleted then ``b    103 Note that if ``cur_key`` gets deleted then ``bpf_map_get_next_key()``
137 will instead return the *first* key in the has    104 will instead return the *first* key in the hash table which is
138 undesirable. It is recommended to use batched     105 undesirable. It is recommended to use batched lookup if there is going
139 to be key deletion intermixed with ``bpf_map_g    106 to be key deletion intermixed with ``bpf_map_get_next_key()``.
140                                                   107 
141 Examples                                          108 Examples
142 ========                                          109 ========
143                                                   110 
144 Please see the ``tools/testing/selftests/bpf``    111 Please see the ``tools/testing/selftests/bpf`` directory for functional
145 examples.  The code snippets below demonstrate    112 examples.  The code snippets below demonstrates API usage.
146                                                   113 
147 This example shows how to declare an LRU Hash     114 This example shows how to declare an LRU Hash with a struct key and a
148 struct value.                                     115 struct value.
149                                                   116 
150 .. code-block:: c                                 117 .. code-block:: c
151                                                   118 
152     #include <linux/bpf.h>                        119     #include <linux/bpf.h>
153     #include <bpf/bpf_helpers.h>                  120     #include <bpf/bpf_helpers.h>
154                                                   121 
155     struct key {                                  122     struct key {
156         __u32 srcip;                              123         __u32 srcip;
157     };                                            124     };
158                                                   125 
159     struct value {                                126     struct value {
160         __u64 packets;                            127         __u64 packets;
161         __u64 bytes;                              128         __u64 bytes;
162     };                                            129     };
163                                                   130 
164     struct {                                      131     struct {
165             __uint(type, BPF_MAP_TYPE_LRU_HASH    132             __uint(type, BPF_MAP_TYPE_LRU_HASH);
166             __uint(max_entries, 32);              133             __uint(max_entries, 32);
167             __type(key, struct key);              134             __type(key, struct key);
168             __type(value, struct value);          135             __type(value, struct value);
169     } packet_stats SEC(".maps");                  136     } packet_stats SEC(".maps");
170                                                   137 
171 This example shows how to create or update has    138 This example shows how to create or update hash values using atomic
172 instructions:                                     139 instructions:
173                                                   140 
174 .. code-block:: c                                 141 .. code-block:: c
175                                                   142 
176     static void update_stats(__u32 srcip, int     143     static void update_stats(__u32 srcip, int bytes)
177     {                                             144     {
178             struct key key = {                    145             struct key key = {
179                     .srcip = srcip,               146                     .srcip = srcip,
180             };                                    147             };
181             struct value *value = bpf_map_look    148             struct value *value = bpf_map_lookup_elem(&packet_stats, &key);
182                                                   149 
183             if (value) {                          150             if (value) {
184                     __sync_fetch_and_add(&valu    151                     __sync_fetch_and_add(&value->packets, 1);
185                     __sync_fetch_and_add(&valu    152                     __sync_fetch_and_add(&value->bytes, bytes);
186             } else {                              153             } else {
187                     struct value newval = { 1,    154                     struct value newval = { 1, bytes };
188                                                   155 
189                     bpf_map_update_elem(&packe    156                     bpf_map_update_elem(&packet_stats, &key, &newval, BPF_NOEXIST);
190             }                                     157             }
191     }                                             158     }
192                                                   159 
193 Userspace walking the map elements from the ma    160 Userspace walking the map elements from the map declared above:
194                                                   161 
195 .. code-block:: c                                 162 .. code-block:: c
196                                                   163 
197     #include <bpf/libbpf.h>                       164     #include <bpf/libbpf.h>
198     #include <bpf/bpf.h>                          165     #include <bpf/bpf.h>
199                                                   166 
200     static void walk_hash_elements(int map_fd)    167     static void walk_hash_elements(int map_fd)
201     {                                             168     {
202             struct key *cur_key = NULL;           169             struct key *cur_key = NULL;
203             struct key next_key;                  170             struct key next_key;
204             struct value value;                   171             struct value value;
205             int err;                              172             int err;
206                                                   173 
207             for (;;) {                            174             for (;;) {
208                     err = bpf_map_get_next_key    175                     err = bpf_map_get_next_key(map_fd, cur_key, &next_key);
209                     if (err)                      176                     if (err)
210                             break;                177                             break;
211                                                   178 
212                     bpf_map_lookup_elem(map_fd    179                     bpf_map_lookup_elem(map_fd, &next_key, &value);
213                                                   180 
214                     // Use key and value here     181                     // Use key and value here
215                                                   182 
216                     cur_key = &next_key;          183                     cur_key = &next_key;
217             }                                     184             }
218     }                                             185     }
219                                                << 
220 Internals                                      << 
221 =========                                      << 
222                                                << 
223 This section of the document is targeted at Li << 
224 aspects of the map implementations that are no << 
225 following details are subject to change in fut << 
226                                                << 
227 ``BPF_MAP_TYPE_LRU_HASH`` and variants         << 
228 --------------------------------------         << 
229                                                << 
230 Updating elements in LRU maps may trigger evic << 
231 of the map is reached. There are various steps << 
232 attempts in order to enforce the LRU property  << 
233 other CPUs involved in the following operation << 
234                                                << 
235 - Attempt to use CPU-local state to batch oper << 
236 - Attempt to fetch free nodes from global list << 
237 - Attempt to pull any node from a global list  << 
238 - Attempt to pull any node from any CPU's list << 
239                                                << 
240 This algorithm is described visually in the fo << 
241 description in commit 3a08c2fd7634 ("bpf: LRU  << 
242 the corresponding operations:                  << 
243                                                << 
244 .. kernel-figure::  map_lru_hash_update.dot    << 
245    :alt:    Diagram outlining the LRU eviction << 
246                                                << 
247    LRU hash eviction during map update for ``B << 
248    variants. See the dot file source for kerne << 
249                                                << 
250 Map updates start from the oval in the top rig << 
251 and progress through the graph towards the bot << 
252 either a successful update or a failure with v << 
253 the top right provides indicators for which lo << 
254 operations. This is intended as a visual hint  << 
255 contention may impact update operations, thoug << 
256 impact the actual contention on those locks, b << 
257 the table above. For instance, if the map is c << 
258 ``BPF_MAP_TYPE_LRU_PERCPU_HASH`` and flags ``B << 
259 properties would be per-cpu.                   << 
                                                      

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php