Re: [PATCH v5] bpf: Fix smp_processor_id() call trace for preemptible kernels
From: Edward Adam Davis <hidden>
Date: 2026-07-02 04:35:02
Also in:
bpf, lkml, sashiko-reviews
On Wed, 1 Jul 2026 12:57:52 -0700, Andrii Nakryiko wrote:
quoted
bpf_mem_cache_free_rcu() maybe called in preemptible context, this will trigger the below warning message: BUG: using smp_processor_id() in preemptible [00000000] code: syz.0.17/5820 caller is bpf_mem_cache_free_rcu+0x48/0xc0 kernel/bpf/memalloc.c:954 Call Trace: check_preemption_disabled+0xd3/0xe0 lib/smp_processor_id.c:47 bpf_mem_cache_free_rcu+0x48/0xc0 kernel/bpf/memalloc.c:954 rhtab_delete_elem+0x185a/0x1b30 kernel/bpf/hashtab.c:2969 __rhtab_map_lookup_and_delete_batch+0x935/0xcb0 kernel/bpf/hashtab.c:3349 bpf_map_do_batch+0x445/0x630 kernel/bpf/syscall.c:-1 __sys_bpf+0x906/0xd90 kernel/bpf/syscall.c:-1 this_cpu_ptr() requires the caller to prevent task migration. These helpers currently do not enforce that requirement and may be invoked from preemptible contexts, leading to accesses to another CPU's per-CPU cache after migration. Use get_cpu_ptr()/put_cpu_ptr() to pin the task while accessing the per-CPU allocator state. Fixes: 5af6807bdb10 ("bpf: Introduce bpf_mem_free_rcu() similar to kfree_rcu().") Fixes: 7c8199e24fa0 ("bpf: Introduce any context BPF specific memory allocator.") Reported-by: syzbot+fd7e415d891073b83e1f@syzkaller.appspotmail.com Closes: https://syzkaller.appspot.com/bug?extid=fd7e415d891073b83e1f Signed-off-by: Edward Adam Davis <redacted> ---from what I can see, bpf_mem_free() is called through bpf kfuncs only, and all BPF programs run with migration disabled. So this seems like a false positive. For per-cpu checking, it should probably check that either preemption is disabled or migration is disabled. tl;dr, there doesn't seem to be any
Today, I researched the call sites of bpf_mem_free() in detail; it is called directly by bpf kfuns only. Different BPF program types execute in distinct kernel contexts: for instance, XDP and TC typically run in non-sleepable networking contexts, whereas `raw_tp`, `tracing`, `LSM`, `syscall` and especially sleepable BPF programs may run in contexts where preemption and migration are enabled. Consequently, any shared BPF code (such as a helper or kfunc) that accesses per-CPU data must not rely on the caller having disabled migration; instead, it must internally ensure that CPU migration does not occur during the access. Taking into account the CI reviewer's feedback [1] and my further investigation into BPF programs as described above, the adjustments related to bpf_mem_free() should be retained. [1] https://lore.kernel.org/all/20260630094823.897BD1F00A3D@smtp.kernel.org (local)
pw-bot: crquoted
v1 -> v2: using guard against preemption v2 -> v3: replace get/put_cpu() to bpf_disable/enable_instrumentation() v3 -> v4: disable preempt to make this_cpu_ptr() work v4 -> v5: in mem free disable preemptionmaybe throttle your patch resubmission spree a bit?..
My earlier actions were driven by a desire to keep pace with the CI reviewer's response speed. Moving forward, I will slow down the cadence of new patch submissions, as you suggested.