From: Jiri Olsa <olsajiri@gmail.com>
To: Daniel Xu <dxu@dxuuu.xyz>
Cc: quentin@isovalent.com, daniel@iogearbox.net, ast@kernel.org,
andrii@kernel.org, alexei.starovoitov@gmail.com,
olsajiri@gmail.com, alan.maguire@oracle.com, memxor@gmail.com,
martin.lau@linux.dev, eddyz87@gmail.com, song@kernel.org,
yonghong.song@linux.dev, john.fastabend@gmail.com,
kpsingh@kernel.org, sdf@google.com, haoluo@google.com,
bpf@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH bpf-next] bpftool: Support dumping kfunc prototypes from BTF
Date: Mon, 29 Jan 2024 13:11:17 +0100 [thread overview]
Message-ID: <ZbeV5adWhiNZu5xj@krava> (raw)
In-Reply-To: <373d86f4c26c0ebf5046b6627c8988fa75ea7a1d.1706492080.git.dxu@dxuuu.xyz>
On Sun, Jan 28, 2024 at 06:35:33PM -0700, Daniel Xu wrote:
> This patch enables dumping kfunc prototypes from bpftool. This is useful
> b/c with this patch, end users will no longer have to manually define
> kfunc prototypes. For the kernel tree, this also means we can drop
> kfunc prototypes from:
>
> tools/testing/selftests/bpf/bpf_kfuncs.h
> tools/testing/selftests/bpf/bpf_experimental.h
>
> Example usage:
>
> $ make PAHOLE=/home/dxu/dev/pahole/build/pahole -j30 vmlinux
>
> $ ./tools/bpf/bpftool/bpftool btf dump file ./vmlinux format c | rg "__ksym;" | head -3
> extern void cgroup_rstat_updated(struct cgroup * cgrp, int cpu) __ksym;
> extern void cgroup_rstat_flush(struct cgroup * cgrp) __ksym;
> extern struct bpf_key * bpf_lookup_user_key(u32 serial, u64 flags) __ksym;
hi,
I'm getting following declaration for bpf_rbtree_add_impl:
extern int bpf_rbtree_add_impl(struct bpf_rb_root * root, struct bpf_rb_node * node, bool (struct bpf_rb_node *, const struct bpf_rb_node *)* less, void * meta__ign, u64 off) __ksym;
and it fails to compile with:
In file included from skeleton/pid_iter.bpf.c:3:
./vmlinux.h:164511:141: error: expected ')'
164511 | extern int bpf_rbtree_add_impl(struct bpf_rb_root * root, struct bpf_rb_node * node, bool (struct bpf_rb_node *, const struct bpf_rb_node *)* less, void * meta__ign, u64 off) __ksym;
| ^
./vmlinux.h:164511:31: note: to match this '('
164511 | extern int bpf_rbtree_add_impl(struct bpf_rb_root * root, struct bpf_rb_node * node, bool (struct bpf_rb_node *, const struct bpf_rb_node *)* less, void * meta__ign, u64 off) __ksym;
looks like the btf_dumper_type_only won't dump function pointer argument
properly.. I guess we should fix that, but looking at the other stuff in
vmlinux.h like *_ops struct we can print function pointers properly, so
perhaps another way around is to use btf_dumper interface instead
jirka
>
> Note that this patch is only effective after enabling pahole [0]
> and kernel [1] changes are merged.
>
> [0]: https://lore.kernel.org/bpf/0f25134ec999e368478c4ca993b3b729c2a03383.1706491733.git.dxu@dxuuu.xyz/
> [1]: https://lore.kernel.org/bpf/cover.1706491398.git.dxu@dxuuu.xyz/
>
> Signed-off-by: Daniel Xu <dxu@dxuuu.xyz>
> ---
> tools/bpf/bpftool/btf.c | 29 +++++++++++++++++++++++++++++
> 1 file changed, 29 insertions(+)
>
> diff --git a/tools/bpf/bpftool/btf.c b/tools/bpf/bpftool/btf.c
> index 91fcb75babe3..9ab26ed12733 100644
> --- a/tools/bpf/bpftool/btf.c
> +++ b/tools/bpf/bpftool/btf.c
> @@ -20,6 +20,8 @@
> #include "json_writer.h"
> #include "main.h"
>
> +#define KFUNC_DECL_TAG "bpf_kfunc"
> +
> static const char * const btf_kind_str[NR_BTF_KINDS] = {
> [BTF_KIND_UNKN] = "UNKNOWN",
> [BTF_KIND_INT] = "INT",
> @@ -454,6 +456,28 @@ static int dump_btf_raw(const struct btf *btf,
> return 0;
> }
>
> +static void dump_btf_kfuncs(const struct btf *btf)
> +{
> + int cnt = btf__type_cnt(btf);
> + int i;
> +
> + for (i = 1; i < cnt; i++) {
> + const struct btf_type *t = btf__type_by_id(btf, i);
> + char kfunc_sig[1024];
> + const char *name;
> +
> + if (!btf_is_decl_tag(t))
> + continue;
> +
> + name = btf__name_by_offset(btf, t->name_off);
> + if (strncmp(name, KFUNC_DECL_TAG, sizeof(KFUNC_DECL_TAG)))
> + continue;
> +
> + btf_dumper_type_only(btf, t->type, kfunc_sig, sizeof(kfunc_sig));
> + printf("extern %s __ksym;\n\n", kfunc_sig);
> + }
> +}
> +
> static void __printf(2, 0) btf_dump_printf(void *ctx,
> const char *fmt, va_list args)
> {
> @@ -476,6 +500,9 @@ static int dump_btf_c(const struct btf *btf,
> printf("#ifndef BPF_NO_PRESERVE_ACCESS_INDEX\n");
> printf("#pragma clang attribute push (__attribute__((preserve_access_index)), apply_to = record)\n");
> printf("#endif\n\n");
> + printf("#ifndef __ksym\n");
> + printf("#define __ksym __attribute__((section(\".ksyms\")))\n");
> + printf("#endif\n\n");
>
> if (root_type_cnt) {
> for (i = 0; i < root_type_cnt; i++) {
> @@ -491,6 +518,8 @@ static int dump_btf_c(const struct btf *btf,
> if (err)
> goto done;
> }
> +
> + dump_btf_kfuncs(btf);
> }
>
> printf("#ifndef BPF_NO_PRESERVE_ACCESS_INDEX\n");
> --
> 2.42.1
>
next prev parent reply other threads:[~2024-01-29 12:11 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-01-29 1:35 [PATCH bpf-next] bpftool: Support dumping kfunc prototypes from BTF Daniel Xu
2024-01-29 12:11 ` Jiri Olsa [this message]
2024-01-29 16:13 ` Daniel Xu
2024-01-30 8:15 ` Jiri Olsa
2024-01-30 4:33 ` Andrii Nakryiko
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=ZbeV5adWhiNZu5xj@krava \
--to=olsajiri@gmail.com \
--cc=alan.maguire@oracle.com \
--cc=alexei.starovoitov@gmail.com \
--cc=andrii@kernel.org \
--cc=ast@kernel.org \
--cc=bpf@vger.kernel.org \
--cc=daniel@iogearbox.net \
--cc=dxu@dxuuu.xyz \
--cc=eddyz87@gmail.com \
--cc=haoluo@google.com \
--cc=john.fastabend@gmail.com \
--cc=kpsingh@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=martin.lau@linux.dev \
--cc=memxor@gmail.com \
--cc=quentin@isovalent.com \
--cc=sdf@google.com \
--cc=song@kernel.org \
--cc=yonghong.song@linux.dev \
/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.