libbpf: Add documentation for bpf_map batch operations
PATCH v2 1/1 libbpf: Add documentation for bpf_map batch operations
From: Grant Seltzer <[email protected]>
This adds documentation for:
- bpf_map_delete_batch()
- bpf_map_lookup_batch()
- bpf_map_lookup_and_delete_batch()
- bpf_map_update_batch()
--- tools/lib/bpf/bpf.c | 4 +- tools/lib/bpf/bpf.h | 112 +++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 112 insertions(+), 4 deletions(-)
tools/lib/bpf/bpf.c +2 -2
@@ -691,7 +691,7 @@ static int bpf_map_batch_common(int cmd, int fd, void *in_batch,return libbpf_err_errno (ret); } -int bpf_map_delete_batch (int fd,void *keys,__u32 *count, +int bpf_map_delete_batch (int fd,const void *keys,__u32 *count,const struct bpf_map_batch_opts *opts) { return bpf_map_batch_common(BPF_MAP_DELETE_BATCH, fd, NULL,
@@ -715,7 +715,7 @@ int bpf_map_lookup_and_delete_batch(int fd, void *in_batch, void *out_batch, count, opts); } -int bpf_map_update_batch (int fd,void *keys,void *values,__u32 *count, +int bpf_map_update_batch (int fd,const void *keys,const void *values,__u32 *count,const struct bpf_map_batch_opts *opts) { return bpf_map_batch_common(BPF_MAP_UPDATE_BATCH, fd, NULL, NULL,
tools/lib/bpf/bpf.h +110 -2
130 lines not on this page · raw message
Signature · 1 line
2.33.1
kernel test robot
build botThank you for the patch! Yet something to improve:
Hi grantseltzer,
Thank you for the patch! Yet something to improve:
[auto build test ERROR on bpf-next/master]
url: https://github.com/0day-ci/linux/commits/grantseltzer/libbpf-Add-documentation-for-bpf_map-batch-operations/20211226-043930 base: https://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf-next.git master config: x86_64-randconfig-a004-20211227 (https://download.01.org/0day-ci/archive/20211227/202112271230.YWo0e6o5-lkp(a)intel.com/config) compiler: clang version 14.0.0 (https://github.com/llvm/llvm-project 511726c64d3b6cca66f7c54d457d586aa3129f67)
reproduce (this is a W=1 build):
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross
# https://github.com/0day-ci/linux/commit/f8daffaa56bc1d00f28a1bc7db7ca91d98ae3c53
git remote add linux-review https://github.com/0day-ci/linux
git fetch --no-tags linux-review grantseltzer/libbpf-Add-documentation-for-bpf_map-batch-operations/20211226-043930 git checkout f8daffaa56bc1d00f28a1bc7db7ca91d98ae3c53
# save the config file to linux build tree
mkdir build_dir
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross W=1 O=build_dir ARCH=x86_64 SHELL=/bin/bash
If you fix the issue, kindly add following tag as appropriate
All errors (new ones prefixed by >>):
>> bpf.c:698:15: error: passing 'const void *' to parameter of type 'void *' discards qualifiers [-Werror,-Wincompatible-pointer-types-discards-qualifiers]
NULL, keys, NULL, count, opts);
^~~~
bpf.c:668:28: note: passing argument to parameter 'keys' here
void *out_batch, void *keys, void *values,
^
bpf.c:722:9: error: passing 'const void *' to parameter of type 'void *' discards qualifiers [-Werror,-Wincompatible-pointer-types-discards-qualifiers]
keys, values, count, opts);
^~~~
bpf.c:668:28: note: passing argument to parameter 'keys' here
void *out_batch, void *keys, void *values,
^
bpf.c:722:15: error: passing 'const void *' to parameter of type 'void *' discards qualifiers [-Werror,-Wincompatible-pointer-types-discards-qualifiers]
keys, values, count, opts);
^~~~~~ bpf.c:668:40: note: passing argument to parameter 'values' here
void *out_batch, void *keys, void *values,
^
3 errors generated.
make[6]: *** [tools/build/Makefile.build:97: kernel/bpf/preload/libbpf/staticobjs/bpf.o] Error 1 make[6]: Target '__build' not remade because of errors.
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org
Quoted 20 lines · grantseltzer
From: Grant Seltzer <[email protected]>
This adds documentation for:
-
bpf_map_delete_batch()
-bpf_map_lookup_batch()
-bpf_map_lookup_and_delete_batch()
-bpf_map_update_batch()Signed-off-by Grant Seltzer <[email protected]>--- tools/lib/bpf/bpf.c | 4 +- tools/lib/bpf/bpf.h | 112 +++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 112 insertions(+), 4 deletions(-)tools/lib/bpf/bpf.c +0
-0
tools/lib/bpf/bpf.c static int bpf_map_batch_common(int cmd, int fd, void *in_batch, · line 694
Quoted 5 lines
tools/lib/bpf/bpf.c +1
-1@@ -691,7 +691,7 @@ static int bpf_map_batch_common(int cmd, int fd, void *in_batch,return libbpf_err_errno (ret); } -int bpf_map_delete_batch(int fd, void *keys, __u32 *count, +int bpf_map_delete_batch(int fd, const void *keys, __u32 *count,
Maybe you should drop these const qualifier changes.
All batch operations use bpf_map_batch_common, which has the following signature:
static int bpf_map_batch_common(int cmd, int fd, void *in_batch,
void *out_batch, void *keys, void *values, __u32 *count,
const struct bpf_map_batch_opts *opts)
Adding these const qualifiers causes the following error:
bpf.c:698:15: error: passing argument 5 of ‘bpf_map_batch_common’ discards ‘const’ qualifier from pointer target type [-Werror=discarded-qualifiers]
Quoted 147 lines
tools/lib/bpf/bpf.c +1
-1const struct bpf_map_batch_opts *opts) { return bpf_map_batch_common(BPF_MAP_DELETE_BATCH, fd, NULL,@@ -715,7 +715,7 @@ int bpf_map_lookup_and_delete_batch(int fd, void *in_batch, void *out_batch, count, opts); } -int bpf_map_update_batch (int fd,void *keys,void *values,__u32 *count, +int bpf_map_update_batch (int fd,const void *keys,const void *values,__u32 *count,const struct bpf_map_batch_opts *opts) { return bpf_map_batch_common(BPF_MAP_UPDATE_BATCH, fd, NULL, NULL,tools/lib/bpf/bpf.h +110
-2@@ -254,20 +254,128 @@ struct bpf_map_batch_opts { };#define bpf_map_batch_opts__last_field flags -LIBBPF_API int bpf_map_delete_batch(int fd, void *keys, + +/** +* @brief **bpf_map_delete_batch()** allows for batch deletion of multiple +* elements in a BPF map. +* +* @param fd BPF map file descriptor +* @param keys pointer to an array of *count* keys +* @param count number of elements in the map to sequentially delete +* @param opts options for configuring the way the batch deletion works +* @return 0, on success; negative error code, otherwise (errno is also set to +* the error code) +*/ +LIBBPF_API int bpf_map_delete_batch(int fd, const void *keys,__u32 *count,const struct bpf_map_batch_opts *opts); + +/** +* @brief **bpf_map_lookup_batch()** allows for batch lookup of BPF map elements. +* +* The parameter *in_batch* is the address of the first element in the batch to read. +* *out_batch* is an output parameter that should be passed as *in_batch* to subsequent +* calls to **bpf_map_lookup_batch()**. NULL can be passed for *in_batch* to indicate +* that the batched lookup starts from the beginning of the map. +* +* The *keys* and *values* are output parameters which must point to memory large enough to +* hold *count* items based on the key and value size of the map *map_fd*. The *keys* +* buffer must be of *key_size* * *count*. The *values* buffer must be of +* *value_size* * *count*. +* +* @param fd BPF map file descriptor +* @param in_batch address of the first element in batch to read, can pass NULL to +* indicate that the batched lookup starts from the beginning of the map. +* @param out_batch output parameter that should be passed to next call as *in_batch* +* @param keys pointer to an array large enough for *count* keys +* @param values pointer to an array large enough for *count* values +* @param count number of elements in the map to read in batch. If ENOENT is +* returned, count will be set as the number of elements that were read before +* running out of entries in the map +* @param opts options for configuring the way the batch lookup works +* @return 0, on success; negative error code, otherwise (errno is also set to +* the error code) +*/ LIBBPF_API int bpf_map_lookup_batch(int fd, void *in_batch, void *out_batch,void *keys,void *values,__u32 *count,const struct bpf_map_batch_opts *opts); + +/** +* @brief **bpf_map_lookup_and_delete_batch()** allows for batch lookup and deletion +* of BPF map elements where each element is deleted after being retrieved. +* +* Note that *count* is an input and output parameter, where on output it +* represents how many elements were successfully deleted. Also note that if +* **EFAULT** is returned up to *count* elements may have been deleted without +* being returned via the *keys* and *values* output parameters. If **ENOENT** +* is returned then *count* will be set to the number of elements that were read +* before running out of entries in the map. +* +* @param fd BPF map file descriptor +* @param in_batch address of the first element in batch to read, can pass NULL to +* get address of the first element in *out_batch* +* @param out_batch output parameter that should be passed to next call as *in_batch* +* @param keys pointer to an array of *count* keys +* @param values pointer to an array large enough for *count* values +* @param count input and output parameter; on input it's the number of elements +* in the map to read and delete in batch; on output it represents number of elements +* that were successfully read and deleted +* If ENOENT is returned, count will be set as the number of elements that were +* read before running out of entries in the map +* @param opts options for configuring the way the batch lookup and delete works +* @return 0, on success; negative error code, otherwise (errno is also set to +* the error code) +*/ LIBBPF_API int bpf_map_lookup_and_delete_batch(int fd, void *in_batch,void *out_batch,void *keys,void *values,__u32 *count,const struct bpf_map_batch_opts *opts); -LIBBPF_API int bpf_map_update_batch(int fd, void *keys, void *values, + +/** +* @brief **bpf_map_update_batch()** updates multiple elements in a map +* by specifying keys and their corresponding values. +* +* The *keys* and *values* parameters must point to memory large enough +* to hold *count* items based on the key and value size of the map. +* +* The *opts* parameter can be used to control how *bpf_map_update_batch()* +* should handle keys that either do or do not already exist in the map. +* In particular the *flags* parameter of *bpf_map_batch_opts* can be +* one of the following: +* +* Note that *count* is an input and output parameter, where on output it +* represents how many elements were successfully updated. Also note that if +* **EFAULT** then *count* should not be trusted to be correct. +* +* **BPF_ANY** +* Create new elements or update existing. +* +* **BPF_NOEXIST** +* Create new elements only if they do not exist. +* +* **BPF_EXIST** +* Update existing elements. +* +* **BPF_F_LOCK** +* Update spin_lock-ed map elements. This must be +* specified if the map value contains a spinlock. +* +* @param fd BPF map file descriptor +* @param keys pointer to an array of *count* keys +* @param values pointer to an array of *count* values +* @param count input and output parameter; on input it's the number of elements +* in the map to update in batch; on output it represents the number of elements +* that were successfully updated. If EFAULT is returned, *count* should not +* be trusted to be correct. +* @param opts options for configuring the way the batch update works +* @return 0, on success; negative error code, otherwise (errno is also set to +* the error code) +*/ +LIBBPF_API int bpf_map_update_batch(int fd, const void *keys, const void *values,__u32 *count,const struct bpf_map_batch_opts *opts); + LIBBPF_API int bpf_obj_pin(int fd, const char *pathname); LIBBPF_API int bpf_obj_get(const char *pathname);
Quoted 27 lines · Hengqi Chen
Quoted 23 lines · grantseltzer
From: Grant Seltzer <[email protected]>
This adds documentation for:
-
bpf_map_delete_batch()
-bpf_map_lookup_batch()
-bpf_map_lookup_and_delete_batch()
-bpf_map_update_batch()Signed-off-by Grant Seltzer <[email protected]>--- tools/lib/bpf/bpf.c | 4 +- tools/lib/bpf/bpf.h | 112 +++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 112 insertions(+), 4 deletions(-)tools/lib/bpf/bpf.c +0
-0@@ -691,7 +691,7 @@ static int bpf_map_batch_common(int cmd, int fd, void *in_batch,return libbpf_err_errno (ret); }
Quoted 4 lines
tools/lib/bpf/bpf.c static int bpf_map_batch_common(int cmd, int fd, void *in_batch, · line 694
Quoted 2 lines
tools/lib/bpf/bpf.c +1
-1-int bpf_map_delete_batch(int fd, void *keys, __u32 *count, +int bpf_map_delete_batch(int fd, const void *keys, __u32 *count,Maybe you should drop these const qualifier changes.
Can you help me understand the benefit of using the const qualifier in this context? I added it at Andrii's suggestion without proper understanding. I understand that it will properly convey that the keys or values aren't output parameters like in other batch operation functions, I don't think it would change where the underlying data is stored, just the pointer variable.
Is it worth it to have seperate 'common' functions for the sake of having a const qualifier?
Quoted 160 lines
All batch operations use
bpf_map_batch_common, which has the following signature:static int bpf_map_batch_common(int cmd, int fd, void
*in_batch,
void*out_batch, void *keys, void *values,__u32*count,
const structbpf_map_batch_opts*opts)Adding these const qualifiers causes the following error:
bpf.c:698:15: error: passing argument 5 of ‘bpf_map_batch_common’ discards ‘const’ qualifier from pointer target type [-Werror=discarded-qualifiers]
Quoted 147 lines
tools/lib/bpf/bpf.c +1
-1const struct bpf_map_batch_opts *opts) { return bpf_map_batch_common(BPF_MAP_DELETE_BATCH, fd, NULL,@@ -715,7 +715,7 @@ int bpf_map_lookup_and_delete_batch(int fd, void *in_batch, void *out_batch, count, opts); } -int bpf_map_update_batch (int fd,void *keys,void *values,__u32 *count, +int bpf_map_update_batch (int fd,const void *keys,const void *values,__u32 *count,const struct bpf_map_batch_opts *opts) { return bpf_map_batch_common(BPF_MAP_UPDATE_BATCH, fd, NULL, NULL,tools/lib/bpf/bpf.h +110
-2@@ -254,20 +254,128 @@ struct bpf_map_batch_opts { };#define bpf_map_batch_opts__last_field flags -LIBBPF_API int bpf_map_delete_batch(int fd, void *keys, + +/** +* @brief **bpf_map_delete_batch()** allows for batch deletion of multiple +* elements in a BPF map. +* +* @param fd BPF map file descriptor +* @param keys pointer to an array of *count* keys +* @param count number of elements in the map to sequentially delete +* @param opts options for configuring the way the batch deletion works +* @return 0, on success; negative error code, otherwise (errno is also set to +* the error code) +*/ +LIBBPF_API int bpf_map_delete_batch(int fd, const void *keys,__u32 *count,const struct bpf_map_batch_opts *opts); + +/** +* @brief **bpf_map_lookup_batch()** allows for batch lookup of BPF map elements. +* +* The parameter *in_batch* is the address of the first element in the batch to read. +* *out_batch* is an output parameter that should be passed as *in_batch* to subsequent +* calls to **bpf_map_lookup_batch()**. NULL can be passed for *in_batch* to indicate +* that the batched lookup starts from the beginning of the map. +* +* The *keys* and *values* are output parameters which must point to memory large enough to +* hold *count* items based on the key and value size of the map *map_fd*. The *keys* +* buffer must be of *key_size* * *count*. The *values* buffer must be of +* *value_size* * *count*. +* +* @param fd BPF map file descriptor +* @param in_batch address of the first element in batch to read, can pass NULL to +* indicate that the batched lookup starts from the beginning of the map. +* @param out_batch output parameter that should be passed to next call as *in_batch* +* @param keys pointer to an array large enough for *count* keys +* @param values pointer to an array large enough for *count* values +* @param count number of elements in the map to read in batch. If ENOENT is +* returned, count will be set as the number of elements that were read before +* running out of entries in the map +* @param opts options for configuring the way the batch lookup works +* @return 0, on success; negative error code, otherwise (errno is also set to +* the error code) +*/ LIBBPF_API int bpf_map_lookup_batch(int fd, void *in_batch, void *out_batch,void *keys,void *values,__u32 *count,const struct bpf_map_batch_opts *opts); + +/** +* @brief **bpf_map_lookup_and_delete_batch()** allows for batch lookup and deletion +* of BPF map elements where each element is deleted after being retrieved. +* +* Note that *count* is an input and output parameter, where on output it +* represents how many elements were successfully deleted. Also note that if +* **EFAULT** is returned up to *count* elements may have been deleted without +* being returned via the *keys* and *values* output parameters. If **ENOENT** +* is returned then *count* will be set to the number of elements that were read +* before running out of entries in the map. +* +* @param fd BPF map file descriptor +* @param in_batch address of the first element in batch to read, can pass NULL to +* get address of the first element in *out_batch* +* @param out_batch output parameter that should be passed to next call as *in_batch* +* @param keys pointer to an array of *count* keys +* @param values pointer to an array large enough for *count* values +* @param count input and output parameter; on input it's the number of elements +* in the map to read and delete in batch; on output it represents number of elements +* that were successfully read and deleted +* If ENOENT is returned, count will be set as the number of elements that were +* read before running out of entries in the map +* @param opts options for configuring the way the batch lookup and delete works +* @return 0, on success; negative error code, otherwise (errno is also set to +* the error code) +*/ LIBBPF_API int bpf_map_lookup_and_delete_batch(int fd, void *in_batch,void *out_batch,void *keys,void *values,__u32 *count,const struct bpf_map_batch_opts *opts); -LIBBPF_API int bpf_map_update_batch(int fd, void *keys, void *values, + +/** +* @brief **bpf_map_update_batch()** updates multiple elements in a map +* by specifying keys and their corresponding values. +* +* The *keys* and *values* parameters must point to memory large enough +* to hold *count* items based on the key and value size of the map. +* +* The *opts* parameter can be used to control how *bpf_map_update_batch()* +* should handle keys that either do or do not already exist in the map. +* In particular the *flags* parameter of *bpf_map_batch_opts* can be +* one of the following: +* +* Note that *count* is an input and output parameter, where on output it +* represents how many elements were successfully updated. Also note that if +* **EFAULT** then *count* should not be trusted to be correct. +* +* **BPF_ANY** +* Create new elements or update existing. +* +* **BPF_NOEXIST** +* Create new elements only if they do not exist. +* +* **BPF_EXIST** +* Update existing elements. +* +* **BPF_F_LOCK** +* Update spin_lock-ed map elements. This must be +* specified if the map value contains a spinlock. +* +* @param fd BPF map file descriptor +* @param keys pointer to an array of *count* keys +* @param values pointer to an array of *count* values +* @param count input and output parameter; on input it's the number of elements +* in the map to update in batch; on output it represents the number of elements +* that were successfully updated. If EFAULT is returned, *count* should not +* be trusted to be correct. +* @param opts options for configuring the way the batch update works +* @return 0, on success; negative error code, otherwise (errno is also set to +* the error code) +*/ +LIBBPF_API int bpf_map_update_batch(int fd, const void *keys, const void *values,__u32 *count,const struct bpf_map_batch_opts *opts); + LIBBPF_API int bpf_obj_pin(int fd, const char *pathname); LIBBPF_API int bpf_obj_get(const char *pathname);
Quoted 41 lines · Grant Seltzer Richman
Quoted 27 lines · Hengqi Chen
Quoted 23 lines · grantseltzer
From: Grant Seltzer <[email protected]>
This adds documentation for:
-
bpf_map_delete_batch()
-bpf_map_lookup_batch()
-bpf_map_lookup_and_delete_batch()
-bpf_map_update_batch()Signed-off-by Grant Seltzer <[email protected]>--- tools/lib/bpf/bpf.c | 4 +- tools/lib/bpf/bpf.h | 112 +++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 112 insertions(+), 4 deletions(-)tools/lib/bpf/bpf.c +0
-0@@ -691,7 +691,7 @@ static int bpf_map_batch_common(int cmd, int fd, void *in_batch,return libbpf_err_errno (ret); }Quoted 4 lines
tools/lib/bpf/bpf.c static int bpf_map_batch_common(int cmd, int fd, void *in_batch, · line 694
Quoted 2 lines
tools/lib/bpf/bpf.c +1
-1-int bpf_map_delete_batch(int fd, void *keys, __u32 *count, +int bpf_map_delete_batch(int fd, const void *keys, __u32 *count,Maybe you should drop these const qualifier changes.
Can you help me understand the benefit of using the const qualifier in this context? I added it at Andrii's suggestion without proper understanding. I understand that it will properly convey that the keys or values aren't output parameters like in other batch operation functions, I don't think it would change where the underlying data is stored, just the pointer variable.
Quoted 14 lines
Is it worth it to have seperate 'common' functions for the sake of having a const qualifier?
Quoted 12 lines
All batch operations use
bpf_map_batch_common, which has the following signature:static int bpf_map_batch_common(int cmd, int fd, void
*in_batch,
void*out_batch, void *keys, void *values,__u32*count,
const structbpf_map_batch_opts*opts)Adding these const qualifiers causes the following error:
bpf.c:698:15: error: passing argument 5 of ‘bpf_map_batch_common’ discards ‘const’ qualifier from pointer target type [-Werror=discarded-qualifiers]
we can either forcefully cast to (void *) internally when calling bpf_map_batch_common(), or just make bpf_map_batch_common() take const void *. It's a bit misleading, but either way it just gets converted to u64.
I think it's more important to have public API reflect the guarantees correctly, so if public API specifies that something is const void * that means that no one is overwriting the contents of that memory.
Quoted 8 lines
Quoted 8 lines
Quoted 8 lines
tools/lib/bpf/bpf.c +0
-0const struct bpf_map_batch_opts *opts) { return bpf_map_batch_common(BPF_MAP_DELETE_BATCH, fd, NULL,@@ -715,7 +715,7 @@ int bpf_map_lookup_and_delete_batch(int fd, void *in_batch, void *out_batch, count, opts); }
[...]
Quoted 45 lines · grantseltzer
From: Grant Seltzer <[email protected]>
This adds documentation for:
-
bpf_map_delete_batch()
-bpf_map_lookup_batch()
-bpf_map_lookup_and_delete_batch()
-bpf_map_update_batch()Signed-off-by Grant Seltzer <[email protected]>--- tools/lib/bpf/bpf.c | 4 +- tools/lib/bpf/bpf.h | 112 +++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 112 insertions(+), 4 deletions(-)tools/lib/bpf/bpf.c +2
-2@@ -691,7 +691,7 @@ static int bpf_map_batch_common(int cmd, int fd, void *in_batch,return libbpf_err_errno (ret); } -int bpf_map_delete_batch (int fd,void *keys,__u32 *count, +int bpf_map_delete_batch (int fd,const void *keys,__u32 *count,const struct bpf_map_batch_opts *opts) { return bpf_map_batch_common(BPF_MAP_DELETE_BATCH, fd, NULL,@@ -715,7 +715,7 @@ int bpf_map_lookup_and_delete_batch(int fd, void *in_batch, void *out_batch, count, opts); } -int bpf_map_update_batch (int fd,void *keys,void *values,__u32 *count, +int bpf_map_update_batch (int fd,const void *keys,const void *values,__u32 *count,const struct bpf_map_batch_opts *opts) { return bpf_map_batch_common(BPF_MAP_UPDATE_BATCH, fd, NULL, NULL,tools/lib/bpf/bpf.h +0
-0@@ -254,20 +254,128 @@ struct bpf_map_batch_opts { };#define bpf_map_batch_opts__last_field flags
tools/lib/bpf/bpf.h struct bpf_map_batch_opts { · line 264
Quoted 10 lines
tools/lib/bpf/bpf.h +8
-1-LIBBPF_API int bpf_map_delete_batch(int fd, void *keys, + +/** +* @brief **bpf_map_delete_batch()** allows for batch deletion of multiple +* elements in a BPF map. +* +* @param fd BPF map file descriptor +* @param keys pointer to an array of *count* keys +* @param count number of elements in the map to sequentially delete
it's important to mention that count is updated after bpf_map_delete_batch() returns with the actual number of elements that were deleted. Please double-check the other APIs as well whether there are important points to mention. These batch APIs are one of the trickiest ones in bpf() syscall, let's do a thorough job documenting them so that users don't have to read kernel code each time they want to use it
But other than that, great job! I've CC'ed Yonghong to take another look, as he should know the semantics of batch APIs much better. Yonghong, please take a look when you can. Thanks!
Quoted 7 lines
tools/lib/bpf/bpf.h +5
-0+* @param opts options for configuring the way the batch deletion works +* @return 0, on success; negative error code, otherwise (errno is also set to +* the error code) +*/ +LIBBPF_API int bpf_map_delete_batch(int fd, const void *keys,__u32 *count,const struct bpf_map_batch_opts *opts);
[...]
Quoted 65 lines · Andrii Nakryiko
Quoted 45 lines · grantseltzer
From: Grant Seltzer <[email protected]>
This adds documentation for:
-
bpf_map_delete_batch()
-bpf_map_lookup_batch()
-bpf_map_lookup_and_delete_batch()
-bpf_map_update_batch()Signed-off-by Grant Seltzer <[email protected]>--- tools/lib/bpf/bpf.c | 4 +- tools/lib/bpf/bpf.h | 112 +++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 112 insertions(+), 4 deletions(-)tools/lib/bpf/bpf.c +2
-2@@ -691,7 +691,7 @@ static int bpf_map_batch_common(int cmd, int fd, void *in_batch,return libbpf_err_errno (ret); } -int bpf_map_delete_batch (int fd,void *keys,__u32 *count, +int bpf_map_delete_batch (int fd,const void *keys,__u32 *count,const struct bpf_map_batch_opts *opts) { return bpf_map_batch_common(BPF_MAP_DELETE_BATCH, fd, NULL,@@ -715,7 +715,7 @@ int bpf_map_lookup_and_delete_batch(int fd, void *in_batch, void *out_batch, count, opts); } -int bpf_map_update_batch (int fd,void *keys,void *values,__u32 *count, +int bpf_map_update_batch (int fd,const void *keys,const void *values,__u32 *count,const struct bpf_map_batch_opts *opts) { return bpf_map_batch_common(BPF_MAP_UPDATE_BATCH, fd, NULL, NULL,tools/lib/bpf/bpf.h +0
-0@@ -254,20 +254,128 @@ struct bpf_map_batch_opts { };#define bpf_map_batch_opts__last_field flagstools/lib/bpf/bpf.h struct bpf_map_batch_opts { · line 264
Quoted 10 lines
tools/lib/bpf/bpf.h +8
-1-LIBBPF_API int bpf_map_delete_batch(int fd, void *keys, + +/** +* @brief **bpf_map_delete_batch()** allows for batch deletion of multiple +* elements in a BPF map. +* +* @param fd BPF map file descriptor +* @param keys pointer to an array of *count* keys +* @param count number of elements in the map to sequentially delete it's important to mention that count is updated after
bpf_map_delete_batch()returns with the actual number of elements that were deleted. Please double-check the other APIs as well whether there are important points to mention. These batch APIs are one of the trickiest ones inbpf()syscall, let's do a thorough job documenting them so that users don't have to read kernel code each time they want to use it
Quoted 3 lines
But other than that, great job! I've CC'ed Yonghong to take another look, as he should know the semantics of batch APIs much better. Yonghong, please take a look when you can. Thanks!
Will take a look later today.
Quoted 11 lines
Quoted 9 lines
tools/lib/bpf/bpf.h +5
-0+* @param opts options for configuring the way the batch deletion works +* @return 0, on success; negative error code, otherwise (errno is also set to +* the error code) +*/ +LIBBPF_API int bpf_map_delete_batch(int fd, const void *keys,__u32 *count,const struct bpf_map_batch_opts *opts);[...]
Quoted 44 lines · grantseltzer
From: Grant Seltzer <[email protected]>
This adds documentation for:
-
bpf_map_delete_batch()
-bpf_map_lookup_batch()
-bpf_map_lookup_and_delete_batch()
-bpf_map_update_batch()Signed-off-by Grant Seltzer <[email protected]>--- tools/lib/bpf/bpf.c | 4 +- tools/lib/bpf/bpf.h | 112 +++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 112 insertions(+), 4 deletions(-)tools/lib/bpf/bpf.c +2
-2@@ -691,7 +691,7 @@ static int bpf_map_batch_common(int cmd, int fd, void *in_batch,return libbpf_err_errno (ret); } -int bpf_map_delete_batch (int fd,void *keys,__u32 *count, +int bpf_map_delete_batch (int fd,const void *keys,__u32 *count,const struct bpf_map_batch_opts *opts) { return bpf_map_batch_common(BPF_MAP_DELETE_BATCH, fd, NULL,@@ -715,7 +715,7 @@ int bpf_map_lookup_and_delete_batch(int fd, void *in_batch, void *out_batch, count, opts); } -int bpf_map_update_batch (int fd,void *keys,void *values,__u32 *count, +int bpf_map_update_batch (int fd,const void *keys,const void *values,__u32 *count,const struct bpf_map_batch_opts *opts) { return bpf_map_batch_common(BPF_MAP_UPDATE_BATCH, fd, NULL, NULL,tools/lib/bpf/bpf.h +0
-0@@ -254,20 +254,128 @@ struct bpf_map_batch_opts { };#define bpf_map_batch_opts__last_field flags
tools/lib/bpf/bpf.h struct bpf_map_batch_opts { · line 264
Quoted 10 lines
tools/lib/bpf/bpf.h +8
-1-LIBBPF_API int bpf_map_delete_batch(int fd, void *keys, + +/** +* @brief **bpf_map_delete_batch()** allows for batch deletion of multiple +* elements in a BPF map. +* +* @param fd BPF map file descriptor +* @param keys pointer to an array of *count* keys +* @param count number of elements in the map to sequentially delete
Here, "count" is an input/output parameter. We can describe its output semantics like below.
When on output, if an error returns, **count** represents the number of deleted elements if the output **count** value is not equal to the input **count** value and if the error code is not EFAULT.
Quoted 35 lines
tools/lib/bpf/bpf.h +32
-0+* @param opts options for configuring the way the batch deletion works +* @return 0, on success; negative error code, otherwise (errno is also set to +* the error code) +*/ +LIBBPF_API int bpf_map_delete_batch(int fd, const void *keys,__u32 *count,const struct bpf_map_batch_opts *opts); + +/** +* @brief **bpf_map_lookup_batch()** allows for batch lookup of BPF map elements. +* +* The parameter *in_batch* is the address of the first element in the batch to read. +* *out_batch* is an output parameter that should be passed as *in_batch* to subsequent +* calls to **bpf_map_lookup_batch()**. NULL can be passed for *in_batch* to indicate +* that the batched lookup starts from the beginning of the map. +* +* The *keys* and *values* are output parameters which must point to memory large enough to +* hold *count* items based on the key and value size of the map *map_fd*. The *keys* +* buffer must be of *key_size* * *count*. The *values* buffer must be of +* *value_size* * *count*. +* +* @param fd BPF map file descriptor +* @param in_batch address of the first element in batch to read, can pass NULL to +* indicate that the batched lookup starts from the beginning of the map. +* @param out_batch output parameter that should be passed to next call as *in_batch* +* @param keys pointer to an array large enough for *count* keys +* @param values pointer to an array large enough for *count* values +* @param count number of elements in the map to read in batch. If ENOENT is +* returned, count will be set as the number of elements that were read before +* running out of entries in the map +* @param opts options for configuring the way the batch lookup works +* @return 0, on success; negative error code, otherwise (errno is also set to +* the error code) +*/ LIBBPF_API int bpf_map_lookup_batch(int fd, void *in_batch, void *out_batch,
tools/lib/bpf/bpf.h struct bpf_map_batch_opts { · line 309
Quoted 10 lines
tools/lib/bpf/bpf.h +8
-0void *keys, void *values, __u32 *count, const struct bpf_map_batch_opts *opts); + +/** +* @brief **bpf_map_lookup_and_delete_batch()** allows for batch lookup and deletion +* of BPF map elements where each element is deleted after being retrieved. +* +* Note that *count* is an input and output parameter, where on output it +* represents how many elements were successfully deleted. Also note that if +* **EFAULT** is returned up to *count* elements may have been deleted without
if an non-**EFAULT** error code is returned and if the output **count** value is not equal to the input **count** value, up to **count** elements may have been deleted.
This applies to the above bpf_map_lookup_batch as well.
Quoted 30 lines
tools/lib/bpf/bpf.h +25
-1+* being returned via the *keys* and *values* output parameters. If **ENOENT** +* is returned then *count* will be set to the number of elements that were read +* before running out of entries in the map. +* +* @param fd BPF map file descriptor +* @param in_batch address of the first element in batch to read, can pass NULL to +* get address of the first element in *out_batch* +* @param out_batch output parameter that should be passed to next call as *in_batch* +* @param keys pointer to an array of *count* keys +* @param values pointer to an array large enough for *count* values +* @param count input and output parameter; on input it's the number of elements +* in the map to read and delete in batch; on output it represents number of elements +* that were successfully read and deleted +* If ENOENT is returned, count will be set as the number of elements that were +* read before running out of entries in the map +* @param opts options for configuring the way the batch lookup and delete works +* @return 0, on success; negative error code, otherwise (errno is also set to +* the error code) +*/ LIBBPF_API int bpf_map_lookup_and_delete_batch(int fd, void *in_batch,void *out_batch,void *keys,void *values,__u32 *count,const struct bpf_map_batch_opts *opts); -LIBBPF_API int bpf_map_update_batch(int fd, void *keys, void *values, + +/** +* @brief **bpf_map_update_batch()** updates multiple elements in a map +* by specifying keys and their corresponding values. +* +* The *keys* and *values* parameters must point to memory large enough
tools/lib/bpf/bpf.h struct bpf_map_batch_opts { · line 348
Quoted 10 lines
tools/lib/bpf/bpf.h +10
-0+* to hold *count* items based on the key and value size of the map. +* +* The *opts* parameter can be used to control how *bpf_map_update_batch()* +* should handle keys that either do or do not already exist in the map. +* In particular the *flags* parameter of *bpf_map_batch_opts* can be +* one of the following: +* +* Note that *count* is an input and output parameter, where on output it +* represents how many elements were successfully updated. Also note that if +* **EFAULT** then *count* should not be trusted to be correct.
The semantics of **count** here is similar to bpf_map_delete_batch() above.
When on output, if an error returns, **count** represents the number of deleted elements if the output **count** value is not equal to the input **count** value and if the error code is not EFAULT.
Quoted 33 lines
tools/lib/bpf/bpf.h +27
-0+* +* **BPF_ANY** +* Create new elements or update existing. +* +* **BPF_NOEXIST** +* Create new elements only if they do not exist. +* +* **BPF_EXIST** +* Update existing elements. +* +* **BPF_F_LOCK** +* Update spin_lock-ed map elements. This must be +* specified if the map value contains a spinlock. +* +* @param fd BPF map file descriptor +* @param keys pointer to an array of *count* keys +* @param values pointer to an array of *count* values +* @param count input and output parameter; on input it's the number of elements +* in the map to update in batch; on output it represents the number of elements +* that were successfully updated. If EFAULT is returned, *count* should not +* be trusted to be correct. +* @param opts options for configuring the way the batch update works +* @return 0, on success; negative error code, otherwise (errno is also set to +* the error code) +*/ +LIBBPF_API int bpf_map_update_batch(int fd, const void *keys, const void *values,__u32 *count,const struct bpf_map_batch_opts *opts); + LIBBPF_API int bpf_obj_pin(int fd, const char *pathname); LIBBPF_API int bpf_obj_get(const char *pathname);