Re: [PATCH v2 bpf-next 2/2] bpf: Add __bpf_hook_{start,end} macros

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

 



On Wed, Nov 1, 2023 at 7:03 AM Jiri Olsa <olsajiri@xxxxxxxxx> wrote:
>
> On Tue, Oct 31, 2023 at 02:56:25PM -0700, Dave Marchevsky wrote:
> > Not all uses of __diag_ignore_all(...) in BPF-related code in order to
> > suppress warnings are wrapping kfunc definitions. Some "hook point"
> > definitions - small functions meant to be used as attach points for
> > fentry and similar BPF progs - need to suppress -Wmissing-declarations.
> >
> > We could use __bpf_kfunc_{start,end}_defs added in the previous patch in
> > such cases, but this might be confusing to someone unfamiliar with BPF
> > internals. Instead, this patch adds __bpf_hook_{start,end} macros,
> > currently having the same effect as __bpf_kfunc_{start,end}_defs, then
> > uses them to suppress warnings for two hook points in the kernel itself
> > and some bpf_testmod hook points as well.
> >
> > Signed-off-by: Dave Marchevsky <davemarchevsky@xxxxxx>
> > Cc: Yafang Shao <laoar.shao@xxxxxxxxx>
>
> Acked-by: Jiri Olsa <jolsa@xxxxxxxxxx>

Acked-by: Yafang Shao <laoar.shao@xxxxxxxxx>

>
> jirka
>
> > ---
> >
> > This patch was added in v2 in response to convo on v1's thread.
> >
> >  include/linux/btf.h                                   | 2 ++
> >  kernel/cgroup/rstat.c                                 | 9 +++------
> >  net/socket.c                                          | 8 ++------
> >  tools/testing/selftests/bpf/bpf_testmod/bpf_testmod.c | 6 ++----
> >  4 files changed, 9 insertions(+), 16 deletions(-)
> >
> > diff --git a/include/linux/btf.h b/include/linux/btf.h
> > index dc5ce962f600..59d404e22814 100644
> > --- a/include/linux/btf.h
> > +++ b/include/linux/btf.h
> > @@ -92,6 +92,8 @@
> >                         "Global kfuncs as their definitions will be in BTF")
> >
> >  #define __bpf_kfunc_end_defs() __diag_pop()
> > +#define __bpf_hook_start() __bpf_kfunc_start_defs()
> > +#define __bpf_hook_end() __bpf_kfunc_end_defs()
> >
> >  /*
> >   * Return the name of the passed struct, if exists, or halt the build if for
> > diff --git a/kernel/cgroup/rstat.c b/kernel/cgroup/rstat.c
> > index d80d7a608141..c0adb7254b45 100644
> > --- a/kernel/cgroup/rstat.c
> > +++ b/kernel/cgroup/rstat.c
> > @@ -156,19 +156,16 @@ static struct cgroup *cgroup_rstat_cpu_pop_updated(struct cgroup *pos,
> >   * optimize away the callsite. Therefore, __weak is needed to ensure that the
> >   * call is still emitted, by telling the compiler that we don't know what the
> >   * function might eventually be.
> > - *
> > - * __diag_* below are needed to dismiss the missing prototype warning.
> >   */
> > -__diag_push();
> > -__diag_ignore_all("-Wmissing-prototypes",
> > -               "kfuncs which will be used in BPF programs");
> > +
> > +__bpf_hook_start();
> >
> >  __weak noinline void bpf_rstat_flush(struct cgroup *cgrp,
> >                                    struct cgroup *parent, int cpu)
> >  {
> >  }
> >
> > -__diag_pop();
> > +__bpf_hook_end();
> >
> >  /* see cgroup_rstat_flush() */
> >  static void cgroup_rstat_flush_locked(struct cgroup *cgrp)
> > diff --git a/net/socket.c b/net/socket.c
> > index c4a6f5532955..cd4d9ae2144f 100644
> > --- a/net/socket.c
> > +++ b/net/socket.c
> > @@ -1685,20 +1685,16 @@ struct file *__sys_socket_file(int family, int type, int protocol)
> >   *   Therefore, __weak is needed to ensure that the call is still
> >   *   emitted, by telling the compiler that we don't know what the
> >   *   function might eventually be.
> > - *
> > - *   __diag_* below are needed to dismiss the missing prototype warning.
> >   */
> >
> > -__diag_push();
> > -__diag_ignore_all("-Wmissing-prototypes",
> > -               "A fmod_ret entry point for BPF programs");
> > +__bpf_hook_start();
> >
> >  __weak noinline int update_socket_protocol(int family, int type, int protocol)
> >  {
> >       return protocol;
> >  }
> >
> > -__diag_pop();
> > +__bpf_hook_end();
> >
> >  int __sys_socket(int family, int type, int protocol)
> >  {
> > diff --git a/tools/testing/selftests/bpf/bpf_testmod/bpf_testmod.c b/tools/testing/selftests/bpf/bpf_testmod/bpf_testmod.c
> > index a5e246f7b202..91907b321f91 100644
> > --- a/tools/testing/selftests/bpf/bpf_testmod/bpf_testmod.c
> > +++ b/tools/testing/selftests/bpf/bpf_testmod/bpf_testmod.c
> > @@ -39,9 +39,7 @@ struct bpf_testmod_struct_arg_4 {
> >       int b;
> >  };
> >
> > -__diag_push();
> > -__diag_ignore_all("-Wmissing-prototypes",
> > -               "Global functions as their definitions will be in bpf_testmod.ko BTF");
> > +__bpf_hook_start();
> >
> >  noinline int
> >  bpf_testmod_test_struct_arg_1(struct bpf_testmod_struct_arg_2 a, int b, int c) {
> > @@ -335,7 +333,7 @@ noinline int bpf_fentry_shadow_test(int a)
> >  }
> >  EXPORT_SYMBOL_GPL(bpf_fentry_shadow_test);
> >
> > -__diag_pop();
> > +__bpf_hook_end();
> >
> >  static struct bin_attribute bin_attr_bpf_testmod_file __ro_after_init = {
> >       .attr = { .name = "bpf_testmod", .mode = 0666, },
> > --
> > 2.34.1
> >
> >



-- 
Regards
Yafang





[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