| From 536b523b407397c8d3967c020ce7aad70a0ea030 Mon Sep 17 00:00:00 2001 |
| From: Chen Pei <cp0613@linux.alibaba.com> |
| Date: Wed, 2 Sep 2026 14:14:51 +0800 |
| Subject: bpf, riscv: Make arena support depend on ZACAS |
| MIME-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| From: Chen Pei <cp0613@linux.alibaba.com> |
| |
| commit 536b523b407397c8d3967c020ce7aad70a0ea030 upstream. |
| |
| The arena range tree allocates its nodes with kmalloc_nolock() since |
| commit f8c67d8550ee ("bpf: Use kmalloc_nolock() in range tree"). |
| kmalloc_nolock() requires slab caches with cmpxchg128 support |
| (__CMPXCHG_DOUBLE); on riscv cmpxchg128 is provided by the ZACAS |
| extension. On systems without ZACAS every arena map creation fails |
| with a misleading -ENOMEM. |
| |
| Report the missing support instead: make bpf_jit_supports_arena() |
| return system_has_cmpxchg128() where it is defined, so arena map |
| creation fails with -EOPNOTSUPP on systems without ZACAS. The macro |
| is only defined when both CONFIG_RISCV_ISA_ZACAS and |
| CONFIG_TOOLCHAIN_HAS_ZACAS are enabled, so guard it with #ifdef the |
| same way mm/slab.h consumes it, and reject arena otherwise. This |
| matches how arena BPF_CMPXCHG instructions are already gated on ZACAS |
| in bpf_jit_supports_insn(). |
| |
| Fixes: f8c67d8550ee ("bpf: Use kmalloc_nolock() in range tree") |
| Signed-off-by: Chen Pei <cp0613@linux.alibaba.com> |
| Acked-by: Pu Lehui <pulehui@huawei.com> |
| Acked-by: Björn Töpel <bjorn@kernel.org> |
| Cc: stable@vger.kernel.org |
| Link: https://lore.kernel.org/bpf/20260902061451.1416-1-cp0613@linux.alibaba.com |
| Signed-off-by: Kumar Kartikeya Dwivedi <memxor@gmail.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| arch/riscv/net/bpf_jit_comp64.c | 10 +++++++++- |
| 1 file changed, 9 insertions(+), 1 deletion(-) |
| |
| --- a/arch/riscv/net/bpf_jit_comp64.c |
| +++ b/arch/riscv/net/bpf_jit_comp64.c |
| @@ -2114,7 +2114,15 @@ bool bpf_jit_supports_ptr_xchg(void) |
| |
| bool bpf_jit_supports_arena(void) |
| { |
| - return true; |
| + /* |
| + * The arena range tree uses kmalloc_nolock(), which needs |
| + * cmpxchg128, provided by ZACAS on riscv. |
| + */ |
| +#ifdef system_has_cmpxchg128 |
| + return system_has_cmpxchg128(); |
| +#else |
| + return false; |
| +#endif |
| } |
| |
| bool bpf_jit_supports_insn(struct bpf_insn *insn, bool in_arena) |