bpf/verifier: Handle BPF_LOAD_ACQ instructions in insn_def_regno()
authorPeilin Ye <yepeilin@google.com>
Wed, 7 May 2025 03:42:45 +0000 (03:42 +0000)
committerAlexei Starovoitov <ast@kernel.org>
Fri, 9 May 2025 17:05:26 +0000 (10:05 -0700)
In preparation for supporting BPF load-acquire and store-release
instructions for architectures where bpf_jit_needs_zext() returns true
(e.g. riscv64), make insn_def_regno() handle load-acquires properly.

Acked-by: Björn Töpel <bjorn@kernel.org>
Tested-by: Björn Töpel <bjorn@rivosinc.com> # QEMU/RVA23
Signed-off-by: Peilin Ye <yepeilin@google.com>
Reviewed-by: Pu Lehui <pulehui@huawei.com>
Link: https://lore.kernel.org/r/09cb2aec979aaed9d16db41f0f5b364de39377c0.1746588351.git.yepeilin@google.com
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
kernel/bpf/verifier.c

index 99aa2c890e7bd4d8cde57d9d5944d35798d69369..28f5a7899bd6763cf02cccd995671c31aadf1280 100644 (file)
@@ -3649,16 +3649,16 @@ static int insn_def_regno(const struct bpf_insn *insn)
        case BPF_ST:
                return -1;
        case BPF_STX:
-               if ((BPF_MODE(insn->code) == BPF_ATOMIC ||
-                    BPF_MODE(insn->code) == BPF_PROBE_ATOMIC) &&
-                   (insn->imm & BPF_FETCH)) {
+               if (BPF_MODE(insn->code) == BPF_ATOMIC ||
+                   BPF_MODE(insn->code) == BPF_PROBE_ATOMIC) {
                        if (insn->imm == BPF_CMPXCHG)
                                return BPF_REG_0;
-                       else
+                       else if (insn->imm == BPF_LOAD_ACQ)
+                               return insn->dst_reg;
+                       else if (insn->imm & BPF_FETCH)
                                return insn->src_reg;
-               } else {
-                       return -1;
                }
+               return -1;
        default:
                return insn->dst_reg;
        }