]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
bpf: Migrate dynptr file to kmalloc_nolock
authorMykyta Yatsenko <yatsenko@meta.com>
Mon, 30 Mar 2026 22:27:57 +0000 (15:27 -0700)
committerAlexei Starovoitov <ast@kernel.org>
Thu, 2 Apr 2026 16:31:42 +0000 (09:31 -0700)
Replace bpf_mem_alloc/bpf_mem_free with kmalloc_nolock/kfree_nolock for
bpf_dynptr_file_impl, continuing the migration away from bpf_mem_alloc
now that kmalloc can be used from NMI context.

freader_cleanup() runs before kfree_nolock() while the dynptr still
holds exclusive access, so plain kfree_nolock() is safe — no concurrent
readers can access the object.

Signed-off-by: Mykyta Yatsenko <yatsenko@meta.com>
Acked-by: Andrii Nakryiko <andrii@kernel.org>
Acked-by: Kumar Kartikeya Dwivedi <memxor@gmail.com>
Link: https://lore.kernel.org/r/20260330-kmalloc_special-v2-2-c90403f92ff0@meta.com
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
kernel/bpf/helpers.c

index 48680dbd4a0249b4728ee78b2e078744cf1acc65..8352b7ee0f4d13457c804c0721cedc2346bf2df3 100644 (file)
@@ -4565,7 +4565,7 @@ static int make_file_dynptr(struct file *file, u32 flags, bool may_sleep,
                return -EINVAL;
        }
 
-       state = bpf_mem_alloc(&bpf_global_ma, sizeof(struct bpf_dynptr_file_impl));
+       state = kmalloc_nolock(sizeof(*state), 0, NUMA_NO_NODE);
        if (!state) {
                bpf_dynptr_set_null(ptr);
                return -ENOMEM;
@@ -4597,7 +4597,7 @@ __bpf_kfunc int bpf_dynptr_file_discard(struct bpf_dynptr *dynptr)
                return 0;
 
        freader_cleanup(&df->freader);
-       bpf_mem_free(&bpf_global_ma, df);
+       kfree_nolock(df);
        bpf_dynptr_set_null(ptr);
        return 0;
 }