All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jiri Olsa <olsajiri@gmail.com>
To: Jiri Olsa <olsajiri@gmail.com>
Cc: Tao Chen <chen.dylane@gmail.com>,
	ast@kernel.org, daniel@iogearbox.net, andrii@kernel.org,
	eddyz87@gmail.com, haoluo@google.com, qmo@kernel.org,
	bpf@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [RFC PATCH bpf-next 1/2] libbpf: Add libbpf_probe_bpf_kfunc API
Date: Thu, 23 Jan 2025 21:11:58 +0100	[thread overview]
Message-ID: <Z5Kijmlt9vrSyslv@krava> (raw)
In-Reply-To: <Z5Khb2qaSJCo16Yf@krava>

On Thu, Jan 23, 2025 at 09:07:11PM +0100, Jiri Olsa wrote:
> On Thu, Jan 23, 2025 at 01:06:19AM +0800, Tao Chen wrote:
> > Similarly to libbpf_probe_bpf_helper, the libbpf_probe_bpf_kfunc
> > used to test the availability of the different eBPF kfuncs on the
> > current system.
> 
> hi,
> there's "bpf_kfunc" DECL_TAG for each kfunc in BTF data,
> I think that should do the same job? please check [1] and
> related commits for details

nah there's v2 with support for modules.. makes sense then, will check

sorry for noise ;-)

jirka

> 
> jirka
> 
> 
> [1] 770abbb5a25a bpftool: Support dumping kfunc prototypes from BTF
> 
> > 
> > Signed-off-by: Tao Chen <chen.dylane@gmail.com>
> > ---
> >  tools/lib/bpf/libbpf.h        | 16 +++++++++++++++-
> >  tools/lib/bpf/libbpf.map      |  1 +
> >  tools/lib/bpf/libbpf_probes.c | 36 +++++++++++++++++++++++++++++++++++
> >  3 files changed, 52 insertions(+), 1 deletion(-)
> > 
> > diff --git a/tools/lib/bpf/libbpf.h b/tools/lib/bpf/libbpf.h
> > index 3020ee45303a..3b6d33578a16 100644
> > --- a/tools/lib/bpf/libbpf.h
> > +++ b/tools/lib/bpf/libbpf.h
> > @@ -1680,7 +1680,21 @@ LIBBPF_API int libbpf_probe_bpf_map_type(enum bpf_map_type map_type, const void
> >   */
> >  LIBBPF_API int libbpf_probe_bpf_helper(enum bpf_prog_type prog_type,
> >  				       enum bpf_func_id helper_id, const void *opts);
> > -
> > +/**
> > + * @brief **libbpf_probe_bpf_kfunc()** detects if host kernel supports the
> > + * use of a given BPF kfunc from specified BPF program type.
> > + * @param prog_type BPF program type used to check the support of BPF kfunc
> > + * @param kfunc_id The btf ID of BPF kfunc to check support for
> > + * @param opts reserved for future extensibility, should be NULL
> > + * @return 1, if given combination of program type and kfunc is supported; 0,
> > + * if the combination is not supported; negative error code if feature
> > + * detection for provided input arguments failed or can't be performed
> > + *
> > + * Make sure the process has required set of CAP_* permissions (or runs as
> > + * root) when performing feature checking.
> > + */
> > +LIBBPF_API int libbpf_probe_bpf_kfunc(enum bpf_prog_type prog_type,
> > +				      int kfunc_id, const void *opts);
> >  /**
> >   * @brief **libbpf_num_possible_cpus()** is a helper function to get the
> >   * number of possible CPUs that the host kernel supports and expects.
> > diff --git a/tools/lib/bpf/libbpf.map b/tools/lib/bpf/libbpf.map
> > index a8b2936a1646..e93fae101efd 100644
> > --- a/tools/lib/bpf/libbpf.map
> > +++ b/tools/lib/bpf/libbpf.map
> > @@ -436,4 +436,5 @@ LIBBPF_1.6.0 {
> >  		bpf_linker__add_buf;
> >  		bpf_linker__add_fd;
> >  		bpf_linker__new_fd;
> > +		libbpf_probe_bpf_kfunc;
> >  } LIBBPF_1.5.0;
> > diff --git a/tools/lib/bpf/libbpf_probes.c b/tools/lib/bpf/libbpf_probes.c
> > index 9dfbe7750f56..bc1cf2afbe87 100644
> > --- a/tools/lib/bpf/libbpf_probes.c
> > +++ b/tools/lib/bpf/libbpf_probes.c
> > @@ -413,6 +413,42 @@ int libbpf_probe_bpf_map_type(enum bpf_map_type map_type, const void *opts)
> >  	return libbpf_err(ret);
> >  }
> >  
> > +int libbpf_probe_bpf_kfunc(enum bpf_prog_type prog_type, int kfunc_id,
> > +			   const void *opts)
> > +{
> > +	struct bpf_insn insns[] = {
> > +		BPF_EXIT_INSN(),
> > +		BPF_EXIT_INSN(),
> > +	};
> > +	const size_t insn_cnt = ARRAY_SIZE(insns);
> > +	int err;
> > +	char buf[4096];
> > +
> > +	if (opts)
> > +		return libbpf_err(-EINVAL);
> > +
> > +	insns[0].code = BPF_JMP | BPF_CALL;
> > +	insns[0].src_reg = BPF_PSEUDO_KFUNC_CALL;
> > +	insns[0].imm = kfunc_id;
> > +
> > +	/* Now only support kfunc from vmlinux */
> > +	insns[0].off = 0;
> > +
> > +	buf[0] = '\0';
> > +	err = probe_prog_load(prog_type, insns, insn_cnt, buf, sizeof(buf));
> > +	if (err < 0)
> > +		return libbpf_err(err);
> > +
> > +	/* If BPF verifier recognizes BPF kfunc but it's not supported for
> > +	 * given BPF program type, it will emit "calling kernel function
> > +	 * bpf_cpumask_create is not allowed"
> > +	 */
> > +	if (err == 0 && strstr(buf, "not allowed"))
> > +		return 0;
> > +
> > +	return 1; /* assume supported */
> > +}
> > +
> >  int libbpf_probe_bpf_helper(enum bpf_prog_type prog_type, enum bpf_func_id helper_id,
> >  			    const void *opts)
> >  {
> > -- 
> > 2.43.0
> > 

  reply	other threads:[~2025-01-23 20:12 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-01-22 17:06 [RFC PATCH bpf-next 1/2] libbpf: Add libbpf_probe_bpf_kfunc API Tao Chen
2025-01-22 17:06 ` [RFC PATCH bpf-next 2/2] selftests/bpf: Add libbpf_probe_bpf_kfunc API selftests Tao Chen
2025-01-23 20:07 ` [RFC PATCH bpf-next 1/2] libbpf: Add libbpf_probe_bpf_kfunc API Jiri Olsa
2025-01-23 20:11   ` Jiri Olsa [this message]
  -- strict thread matches above, loose matches on Subject: below --
2025-01-22 17:13 [RFC PATCH bpf-next 0/2] Add prog_kfunc feature probe Tao Chen
2025-01-22 17:13 ` [RFC PATCH bpf-next 1/2] libbpf: Add libbpf_probe_bpf_kfunc API Tao Chen
2025-01-22 22:22   ` Andrii Nakryiko
2025-01-23  3:06     ` Tao Chen

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=Z5Kijmlt9vrSyslv@krava \
    --to=olsajiri@gmail.com \
    --cc=andrii@kernel.org \
    --cc=ast@kernel.org \
    --cc=bpf@vger.kernel.org \
    --cc=chen.dylane@gmail.com \
    --cc=daniel@iogearbox.net \
    --cc=eddyz87@gmail.com \
    --cc=haoluo@google.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=qmo@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.