bpf: save extended inner map info for percpu array maps as well
authorAndrii Nakryiko <andrii@kernel.org>
Wed, 15 May 2024 06:24:39 +0000 (23:24 -0700)
committerAlexei Starovoitov <ast@kernel.org>
Wed, 15 May 2024 16:34:54 +0000 (09:34 -0700)
ARRAY_OF_MAPS and HASH_OF_MAPS map types have special logic to save
a few extra fields required for correct operations of ARRAY maps, when
they are used as inner maps. PERCPU_ARRAY maps have similar
requirements as they now support generating inline element lookup
logic. So make sure that both classes of maps are handled correctly.

Reported-by: Jakub Kicinski <kuba@kernel.org>
Fixes: db69718b8efa ("bpf: inline bpf_map_lookup_elem() for PERCPU_ARRAY maps")
Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
Acked-by: Kumar Kartikeya Dwivedi <memxor@gmail.com>
Link: https://lore.kernel.org/r/20240515062440.846086-1-andrii@kernel.org
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
kernel/bpf/map_in_map.c

index 8ef269e66ba5020a21762038468f748375d3011b..b4f18c85d7bc7190224eca7b50c0a8413bbbaba1 100644 (file)
@@ -32,7 +32,7 @@ struct bpf_map *bpf_map_meta_alloc(int inner_map_ufd)
 
        inner_map_meta_size = sizeof(*inner_map_meta);
        /* In some cases verifier needs to access beyond just base map. */
-       if (inner_map->ops == &array_map_ops)
+       if (inner_map->ops == &array_map_ops || inner_map->ops == &percpu_array_map_ops)
                inner_map_meta_size = sizeof(struct bpf_array);
 
        inner_map_meta = kzalloc(inner_map_meta_size, GFP_USER);
@@ -68,7 +68,7 @@ struct bpf_map *bpf_map_meta_alloc(int inner_map_ufd)
 
        /* Misc members not needed in bpf_map_meta_equal() check. */
        inner_map_meta->ops = inner_map->ops;
-       if (inner_map->ops == &array_map_ops) {
+       if (inner_map->ops == &array_map_ops || inner_map->ops == &percpu_array_map_ops) {
                struct bpf_array *inner_array_meta =
                        container_of(inner_map_meta, struct bpf_array, map);
                struct bpf_array *inner_array = container_of(inner_map, struct bpf_array, map);