]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
bpf: use kvzmalloc to allocate BPF verifier environment
authorRik van Riel <riel@surriel.com>
Tue, 8 Oct 2024 21:07:35 +0000 (17:07 -0400)
committerAlexei Starovoitov <ast@kernel.org>
Thu, 10 Oct 2024 01:13:05 +0000 (18:13 -0700)
The kzmalloc call in bpf_check can fail when memory is very fragmented,
which in turn can lead to an OOM kill.

Use kvzmalloc to fall back to vmalloc when memory is too fragmented to
allocate an order 3 sized bpf verifier environment.

Admittedly this is not a very common case, and only happens on systems
where memory has already been squeezed close to the limit, but this does
not seem like much of a hot path, and it's a simple enough fix.

Signed-off-by: Rik van Riel <riel@surriel.com>
Reviewed-by: Shakeel Butt <shakeel.butt@linux.dev>
Link: https://lore.kernel.org/r/20241008170735.16766766@imladris.surriel.com
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
kernel/bpf/verifier.c

index 434de48cd24bd8d9fb008e4a1e9e0ab4d75ef90a..633fd6da40c2460094b82ca7c2b9305eade05cf6 100644 (file)
@@ -22315,7 +22315,7 @@ int bpf_check(struct bpf_prog **prog, union bpf_attr *attr, bpfptr_t uattr, __u3
        /* 'struct bpf_verifier_env' can be global, but since it's not small,
         * allocate/free it every time bpf_check() is called
         */
-       env = kzalloc(sizeof(struct bpf_verifier_env), GFP_KERNEL);
+       env = kvzalloc(sizeof(struct bpf_verifier_env), GFP_KERNEL);
        if (!env)
                return -ENOMEM;
 
@@ -22551,6 +22551,6 @@ err_unlock:
                mutex_unlock(&bpf_verifier_lock);
        vfree(env->insn_aux_data);
 err_free_env:
-       kfree(env);
+       kvfree(env);
        return ret;
 }