Re: [PATCH bpf-next v3 2/6] bpf/verifier: refactor checks for range computation

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Fri, Apr 26, 2024 at 9:12 AM Andrii Nakryiko
<andrii.nakryiko@xxxxxxxxx> wrote:
>
> On Fri, Apr 26, 2024 at 3:20 AM Cupertino Miranda
> <cupertino.miranda@xxxxxxxxxx> wrote:
> >
> >
> > Andrii Nakryiko writes:
> >
> > > On Wed, Apr 24, 2024 at 3:41 PM Cupertino Miranda
> > > <cupertino.miranda@xxxxxxxxxx> wrote:
> > >>
> > >> Split range computation checks in its own function, isolating pessimitic
> > >> range set for dst_reg and failing return to a single point.
> > >>
> > >> Signed-off-by: Cupertino Miranda <cupertino.miranda@xxxxxxxxxx>
> > >> Cc: Yonghong Song <yonghong.song@xxxxxxxxx>
> > >> Cc: Alexei Starovoitov <alexei.starovoitov@xxxxxxxxx>
> > >> Cc: David Faust <david.faust@xxxxxxxxxx>
> > >> Cc: Jose Marchesi <jose.marchesi@xxxxxxxxxx>
> > >> Cc: Elena Zannoni <elena.zannoni@xxxxxxxxxx>
> > >> ---
> > >>  kernel/bpf/verifier.c | 141 +++++++++++++++++++++++-------------------
> > >>  1 file changed, 77 insertions(+), 64 deletions(-)
> > >>
> > >
> > > I know you are moving around pre-existing code, so a bunch of nits
> > > below are to pre-existing code, but let's use this as an opportunity
> > > to clean it up a bit.
> > >
> > >> diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c
> > >> index 6fe641c8ae33..829a12d263a5 100644
> > >> --- a/kernel/bpf/verifier.c
> > >> +++ b/kernel/bpf/verifier.c
> > >> @@ -13695,6 +13695,82 @@ static void scalar_min_max_arsh(struct bpf_reg_state *dst_reg,
> > >>         __update_reg_bounds(dst_reg);
> > >>  }
> > >>
> > >> +static bool is_const_reg_and_valid(struct bpf_reg_state reg, bool alu32,
> > >
> > > hm.. why passing reg_state by value? Use pointer?
> > >
> > Someone mentioned this in a review already and I forgot to change it.
> > Apologies if I did not reply on this.
> >
> > The reason why I pass by value, is more of an approach to programming.
> > I do it as guarantee to the caller that there is no mutation of
> > the value.
> > If it is better or worst from a performance point of view it is
> > arguable, since although it might appear to copy the value it also provides
> > more information to the compiler of the intent of the callee function,
> > allowing it to optimize further.
> > I personally would leave the copy by value, but I understand if you want
> > to keep having the same code style.
>
> It's a pretty big 120-byte structure, so maybe the compiler can
> optimize it very well, but I'd still be concerned. Hopefully it can
> optimize well even with (const) pointer, if inlining.
>
> But I do insist, if you look at (most? I haven't checked every single
> function, of course) other uses in verifier.c, we pass things like
> that by pointer. I understand the desire to specify the intent to not
> modify it, but that's why you are passing `const struct bpf_reg_state
> *reg`, so I think you don't lose anything with that.

+1
that "struct bpf_reg_state src_reg" code was written 7 years ago
when bpf_reg_state was small.
We definitely need to fix it. It might even bring
a noticeable runtime improvement.





[Index of Archives]     [Linux Samsung SoC]     [Linux Rockchip SoC]     [Linux Actions SoC]     [Linux for Synopsys ARC Processors]     [Linux NFS]     [Linux NILFS]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]


  Powered by Linux