bpf: Remove prealloc-only restriction for sleepable bpf programs.
authorAlexei Starovoitov <ast@kernel.org>
Fri, 2 Sep 2022 21:10:56 +0000 (14:10 -0700)
committerDaniel Borkmann <daniel@iogearbox.net>
Mon, 5 Sep 2022 13:33:06 +0000 (15:33 +0200)
Since hash map is now converted to bpf_mem_alloc and it's waiting for rcu and
rcu_tasks_trace GPs before freeing elements into global memory slabs it's safe
to use dynamically allocated hash maps in sleepable bpf programs.

Signed-off-by: Alexei Starovoitov <ast@kernel.org>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Acked-by: Kumar Kartikeya Dwivedi <memxor@gmail.com>
Acked-by: Andrii Nakryiko <andrii@kernel.org>
Link: https://lore.kernel.org/bpf/20220902211058.60789-15-alexei.starovoitov@gmail.com
kernel/bpf/verifier.c

index 57ec06b..068b20e 100644 (file)
@@ -12586,14 +12586,6 @@ err_put:
        return err;
 }
 
-static int check_map_prealloc(struct bpf_map *map)
-{
-       return (map->map_type != BPF_MAP_TYPE_HASH &&
-               map->map_type != BPF_MAP_TYPE_PERCPU_HASH &&
-               map->map_type != BPF_MAP_TYPE_HASH_OF_MAPS) ||
-               !(map->map_flags & BPF_F_NO_PREALLOC);
-}
-
 static bool is_tracing_prog_type(enum bpf_prog_type type)
 {
        switch (type) {
@@ -12608,15 +12600,6 @@ static bool is_tracing_prog_type(enum bpf_prog_type type)
        }
 }
 
-static bool is_preallocated_map(struct bpf_map *map)
-{
-       if (!check_map_prealloc(map))
-               return false;
-       if (map->inner_map_meta && !check_map_prealloc(map->inner_map_meta))
-               return false;
-       return true;
-}
-
 static int check_map_prog_compatibility(struct bpf_verifier_env *env,
                                        struct bpf_map *map,
                                        struct bpf_prog *prog)
@@ -12669,12 +12652,6 @@ static int check_map_prog_compatibility(struct bpf_verifier_env *env,
                case BPF_MAP_TYPE_LRU_PERCPU_HASH:
                case BPF_MAP_TYPE_ARRAY_OF_MAPS:
                case BPF_MAP_TYPE_HASH_OF_MAPS:
-                       if (!is_preallocated_map(map)) {
-                               verbose(env,
-                                       "Sleepable programs can only use preallocated maps\n");
-                               return -EINVAL;
-                       }
-                       break;
                case BPF_MAP_TYPE_RINGBUF:
                case BPF_MAP_TYPE_INODE_STORAGE:
                case BPF_MAP_TYPE_SK_STORAGE: