Skip to content

Commit 44481e4

Browse files
aspskAlexei Starovoitov
authored andcommitted
bpf: generalize and export map_get_next_key for arrays
The kernel/bpf/array.c file defines the array_map_get_next_key() function which finds the next key for array maps. It actually doesn't use any map fields besides the generic max_entries field. Generalize it, and export as bpf_array_get_next_key() such that it can be re-used by other array-like maps. Signed-off-by: Anton Protopopov <[email protected]> Acked-by: Eduard Zingerman <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Alexei Starovoitov <[email protected]>
1 parent f7d72d0 commit 44481e4

File tree

2 files changed

+15
-10
lines changed

2 files changed

+15
-10
lines changed

include/linux/bpf.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2107,6 +2107,12 @@ struct bpf_array {
21072107
};
21082108
};
21092109

2110+
/*
2111+
* The bpf_array_get_next_key() function may be used for all array-like
2112+
* maps, i.e., maps with u32 keys with range [0 ,..., max_entries)
2113+
*/
2114+
int bpf_array_get_next_key(struct bpf_map *map, void *key, void *next_key);
2115+
21102116
#define BPF_COMPLEXITY_LIMIT_INSNS 1000000 /* yes. 1M insns */
21112117
#define MAX_TAIL_CALL_CNT 33
21122118

kernel/bpf/arraymap.c

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -335,18 +335,17 @@ int bpf_percpu_array_copy(struct bpf_map *map, void *key, void *value)
335335
}
336336

337337
/* Called from syscall */
338-
static int array_map_get_next_key(struct bpf_map *map, void *key, void *next_key)
338+
int bpf_array_get_next_key(struct bpf_map *map, void *key, void *next_key)
339339
{
340-
struct bpf_array *array = container_of(map, struct bpf_array, map);
341340
u32 index = key ? *(u32 *)key : U32_MAX;
342341
u32 *next = (u32 *)next_key;
343342

344-
if (index >= array->map.max_entries) {
343+
if (index >= map->max_entries) {
345344
*next = 0;
346345
return 0;
347346
}
348347

349-
if (index == array->map.max_entries - 1)
348+
if (index == map->max_entries - 1)
350349
return -ENOENT;
351350

352351
*next = index + 1;
@@ -789,7 +788,7 @@ const struct bpf_map_ops array_map_ops = {
789788
.map_alloc_check = array_map_alloc_check,
790789
.map_alloc = array_map_alloc,
791790
.map_free = array_map_free,
792-
.map_get_next_key = array_map_get_next_key,
791+
.map_get_next_key = bpf_array_get_next_key,
793792
.map_release_uref = array_map_free_internal_structs,
794793
.map_lookup_elem = array_map_lookup_elem,
795794
.map_update_elem = array_map_update_elem,
@@ -815,7 +814,7 @@ const struct bpf_map_ops percpu_array_map_ops = {
815814
.map_alloc_check = array_map_alloc_check,
816815
.map_alloc = array_map_alloc,
817816
.map_free = array_map_free,
818-
.map_get_next_key = array_map_get_next_key,
817+
.map_get_next_key = bpf_array_get_next_key,
819818
.map_lookup_elem = percpu_array_map_lookup_elem,
820819
.map_gen_lookup = percpu_array_map_gen_lookup,
821820
.map_update_elem = array_map_update_elem,
@@ -1204,7 +1203,7 @@ const struct bpf_map_ops prog_array_map_ops = {
12041203
.map_poke_track = prog_array_map_poke_track,
12051204
.map_poke_untrack = prog_array_map_poke_untrack,
12061205
.map_poke_run = prog_array_map_poke_run,
1207-
.map_get_next_key = array_map_get_next_key,
1206+
.map_get_next_key = bpf_array_get_next_key,
12081207
.map_lookup_elem = fd_array_map_lookup_elem,
12091208
.map_delete_elem = fd_array_map_delete_elem,
12101209
.map_fd_get_ptr = prog_fd_array_get_ptr,
@@ -1308,7 +1307,7 @@ const struct bpf_map_ops perf_event_array_map_ops = {
13081307
.map_alloc_check = fd_array_map_alloc_check,
13091308
.map_alloc = array_map_alloc,
13101309
.map_free = perf_event_fd_array_map_free,
1311-
.map_get_next_key = array_map_get_next_key,
1310+
.map_get_next_key = bpf_array_get_next_key,
13121311
.map_lookup_elem = fd_array_map_lookup_elem,
13131312
.map_delete_elem = fd_array_map_delete_elem,
13141313
.map_fd_get_ptr = perf_event_fd_array_get_ptr,
@@ -1344,7 +1343,7 @@ const struct bpf_map_ops cgroup_array_map_ops = {
13441343
.map_alloc_check = fd_array_map_alloc_check,
13451344
.map_alloc = array_map_alloc,
13461345
.map_free = cgroup_fd_array_free,
1347-
.map_get_next_key = array_map_get_next_key,
1346+
.map_get_next_key = bpf_array_get_next_key,
13481347
.map_lookup_elem = fd_array_map_lookup_elem,
13491348
.map_delete_elem = fd_array_map_delete_elem,
13501349
.map_fd_get_ptr = cgroup_fd_array_get_ptr,
@@ -1429,7 +1428,7 @@ const struct bpf_map_ops array_of_maps_map_ops = {
14291428
.map_alloc_check = fd_array_map_alloc_check,
14301429
.map_alloc = array_of_map_alloc,
14311430
.map_free = array_of_map_free,
1432-
.map_get_next_key = array_map_get_next_key,
1431+
.map_get_next_key = bpf_array_get_next_key,
14331432
.map_lookup_elem = array_of_map_lookup_elem,
14341433
.map_delete_elem = fd_array_map_delete_elem,
14351434
.map_fd_get_ptr = bpf_map_fd_get_ptr,

0 commit comments

Comments
 (0)