bpf, docs: Reformat BPF maps page to be more readable
Add a more complete introduction, with links to man pages. Move toctree of map types above usage notes. Format usage notes to improve readability. Signed-off-by: Donald Hunter <donald.hunter@gmail.com> Link: https://lore.kernel.org/r/20221012152715.25073-1-donald.hunter@gmail.com Signed-off-by: Alexei Starovoitov <ast@kernel.org>
This commit is contained in:
Родитель
04a8f9d7c0
Коммит
fb73a20ebe
|
@ -1,46 +1,19 @@
|
|||
|
||||
=========
|
||||
eBPF maps
|
||||
=========
|
||||
========
|
||||
BPF maps
|
||||
========
|
||||
|
||||
'maps' is a generic storage of different types for sharing data between kernel
|
||||
and userspace.
|
||||
BPF 'maps' provide generic storage of different types for sharing data between
|
||||
kernel and user space. There are several storage types available, including
|
||||
hash, array, bloom filter and radix-tree. Several of the map types exist to
|
||||
support specific BPF helpers that perform actions based on the map contents. The
|
||||
maps are accessed from BPF programs via BPF helpers which are documented in the
|
||||
`man-pages`_ for `bpf-helpers(7)`_.
|
||||
|
||||
The maps are accessed from user space via BPF syscall, which has commands:
|
||||
|
||||
- create a map with given type and attributes
|
||||
``map_fd = bpf(BPF_MAP_CREATE, union bpf_attr *attr, u32 size)``
|
||||
using attr->map_type, attr->key_size, attr->value_size, attr->max_entries
|
||||
returns process-local file descriptor or negative error
|
||||
|
||||
- lookup key in a given map
|
||||
``err = bpf(BPF_MAP_LOOKUP_ELEM, union bpf_attr *attr, u32 size)``
|
||||
using attr->map_fd, attr->key, attr->value
|
||||
returns zero and stores found elem into value or negative error
|
||||
|
||||
- create or update key/value pair in a given map
|
||||
``err = bpf(BPF_MAP_UPDATE_ELEM, union bpf_attr *attr, u32 size)``
|
||||
using attr->map_fd, attr->key, attr->value
|
||||
returns zero or negative error
|
||||
|
||||
- find and delete element by key in a given map
|
||||
``err = bpf(BPF_MAP_DELETE_ELEM, union bpf_attr *attr, u32 size)``
|
||||
using attr->map_fd, attr->key
|
||||
|
||||
- to delete map: close(fd)
|
||||
Exiting process will delete maps automatically
|
||||
|
||||
userspace programs use this syscall to create/access maps that eBPF programs
|
||||
are concurrently updating.
|
||||
|
||||
maps can have different types: hash, array, bloom filter, radix-tree, etc.
|
||||
|
||||
The map is defined by:
|
||||
|
||||
- type
|
||||
- max number of elements
|
||||
- key size in bytes
|
||||
- value size in bytes
|
||||
BPF maps are accessed from user space via the ``bpf`` syscall, which provides
|
||||
commands to create maps, lookup elements, update elements and delete
|
||||
elements. More details of the BPF syscall are available in
|
||||
:doc:`/userspace-api/ebpf/syscall` and in the `man-pages`_ for `bpf(2)`_.
|
||||
|
||||
Map Types
|
||||
=========
|
||||
|
@ -49,4 +22,60 @@ Map Types
|
|||
:maxdepth: 1
|
||||
:glob:
|
||||
|
||||
map_*
|
||||
map_*
|
||||
|
||||
Usage Notes
|
||||
===========
|
||||
|
||||
.. c:function::
|
||||
int bpf(int command, union bpf_attr *attr, u32 size)
|
||||
|
||||
Use the ``bpf()`` system call to perform the operation specified by
|
||||
``command``. The operation takes parameters provided in ``attr``. The ``size``
|
||||
argument is the size of the ``union bpf_attr`` in ``attr``.
|
||||
|
||||
**BPF_MAP_CREATE**
|
||||
|
||||
Create a map with the desired type and attributes in ``attr``:
|
||||
|
||||
.. code-block:: c
|
||||
|
||||
int fd;
|
||||
union bpf_attr attr = {
|
||||
.map_type = BPF_MAP_TYPE_ARRAY; /* mandatory */
|
||||
.key_size = sizeof(__u32); /* mandatory */
|
||||
.value_size = sizeof(__u32); /* mandatory */
|
||||
.max_entries = 256; /* mandatory */
|
||||
.map_flags = BPF_F_MMAPABLE;
|
||||
.map_name = "example_array";
|
||||
};
|
||||
|
||||
fd = bpf(BPF_MAP_CREATE, &attr, sizeof(attr));
|
||||
|
||||
Returns a process-local file descriptor on success, or negative error in case of
|
||||
failure. The map can be deleted by calling ``close(fd)``. Maps held by open
|
||||
file descriptors will be deleted automatically when a process exits.
|
||||
|
||||
.. note:: Valid characters for ``map_name`` are ``A-Z``, ``a-z``, ``0-9``,
|
||||
``'_'`` and ``'.'``.
|
||||
|
||||
**BPF_MAP_LOOKUP_ELEM**
|
||||
|
||||
Lookup key in a given map using ``attr->map_fd``, ``attr->key``,
|
||||
``attr->value``. Returns zero and stores found elem into ``attr->value`` on
|
||||
success, or negative error on failure.
|
||||
|
||||
**BPF_MAP_UPDATE_ELEM**
|
||||
|
||||
Create or update key/value pair in a given map using ``attr->map_fd``, ``attr->key``,
|
||||
``attr->value``. Returns zero on success or negative error on failure.
|
||||
|
||||
**BPF_MAP_DELETE_ELEM**
|
||||
|
||||
Find and delete element by key in a given map using ``attr->map_fd``,
|
||||
``attr->key``. Returns zero on success or negative error on failure.
|
||||
|
||||
.. Links:
|
||||
.. _man-pages: https://www.kernel.org/doc/man-pages/
|
||||
.. _bpf(2): https://man7.org/linux/man-pages/man2/bpf.2.html
|
||||
.. _bpf-helpers(7): https://man7.org/linux/man-pages/man7/bpf-helpers.7.html
|
||||
|
|
Загрузка…
Ссылка в новой задаче