[PATCH bpf-next 1/8] bpf/verifier: Handle BPF_LOAD_ACQ instructions in insn_def_regno()

Peilin Ye yepeilin at google.com
Tue May 6 17:18:43 PDT 2025


Hi Lehui,

On Tue, May 06, 2025 at 10:03:59PM +0800, Pu Lehui wrote:
> On 2025/4/30 8:50, Peilin Ye wrote:
> > --- a/kernel/bpf/verifier.c
> > +++ b/kernel/bpf/verifier.c
> > @@ -3649,13 +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;
> >   		} else {
> >   			return -1;
> >   		}
> 
> How about simplify like this:
> ```
> static int insn_def_regno(const struct bpf_insn *insn)
> {
>         switch (BPF_CLASS(insn->code)) {
>         case BPF_JMP:
>         case BPF_JMP32:
>         case BPF_ST:
>                 return -1;
>         case BPF_STX:
>                 if (BPF_MODE(insn->code) == BPF_ATOMIC ||
>                     BPF_MODE(insn->code) == BPF_PROBE_ATOMIC) {
>                         if (insn->imm == BPF_CMPXCHG)
>                                 return BPF_REG_0;
>                         else if (insn->imm == BPF_LOAD_ACQ)
>                                 return insn->dst_reg;
>                         else if (insn->imm & BPF_FETCH)
>                                 return insn->src_reg;
>                 }
>                 return -1;
>         default:
>                 return insn->dst_reg;
>         }
> }
> ```

I see, I'll change it in v2.  Thanks for the suggestion!

Peilin Ye




More information about the linux-riscv mailing list