From: Yonghong Song <yonghong.song@linux.dev>
To: Bryce Kahle <bryce.kahle@datadoghq.com>, bpf@vger.kernel.org
Cc: quentin@isovalent.com, ast@kernel.org, daniel@iogearbox.net
Subject: Re: [PATCH bpf-next] bpftool: add support for split BTF to gen min_core_btf
Date: Sun, 21 Jan 2024 22:44:01 -0800 [thread overview]
Message-ID: <7fb4e5c0-3f9f-428d-80b9-a9727dd1dbd7@linux.dev> (raw)
In-Reply-To: <CALvGib8483xSN1VWqxc4XN98k6Di2cNtW76UH_2Vmyft5WQpkQ@mail.gmail.com>
On 1/19/24 1:18 PM, Bryce Kahle wrote:
> Enables a user to generate minimized kernel module BTF.
>
> If an eBPF program probes a function within a kernel module or uses
> types that come from a kernel module, split BTF is required. The split
> module BTF contains only the BTF types that are unique to the module.
> It will reference the base/vmlinux BTF types and always starts its type
> IDs at X+1 where X is the largest type ID in the base BTF.
>
> Minimization allows a user to ship only the types necessary to do
> relocations for the program(s) in the provided eBPF object file(s). A
> minimized module BTF will still not contain vmlinux BTF types, so you
> should always minimize the vmlinux file first, and then minimize the
> kernel module file.
>
> Example:
>
> bpftool gen min_core_btf vmlinux.btf vm-min.btf prog.bpf.o
> bpftool -B vm-min.btf gen min_core_btf mod.btf mod-min.btf prog.bpf.o
>
> Signed-off-by: Bryce Kahle <bryce.kahle@datadoghq.com>
> ---
> .../bpf/bpftool/Documentation/bpftool-gen.rst | 18 +++++++++++++++++-
> tools/bpf/bpftool/gen.c | 17 ++++++++++++-----
> 2 files changed, 29 insertions(+), 6 deletions(-)
>
> diff --git a/tools/bpf/bpftool/Documentation/bpftool-gen.rst
> b/tools/bpf/bpftool/Documentation/bpftool-gen.rst
> index 5006e724d1bc..9c357d339000 100644
> --- a/tools/bpf/bpftool/Documentation/bpftool-gen.rst
> +++ b/tools/bpf/bpftool/Documentation/bpftool-gen.rst
> @@ -16,7 +16,7 @@ SYNOPSIS
>
> **bpftool** [*OPTIONS*] **gen** *COMMAND*
>
> - *OPTIONS* := { |COMMON_OPTIONS| | { **-L** | **--use-loader** } }
> + *OPTIONS* := { |COMMON_OPTIONS| | { **-B** | **--base-btf** } | {
> **-L** | **--use-loader** } }
>
> *COMMAND* := { **object** | **skeleton** | **help** }
>
> @@ -202,6 +202,14 @@ OPTIONS
> =======
> .. include:: common_options.rst
>
> + -B, --base-btf *FILE*
> + Pass a base BTF object. Base BTF objects are typically used
> + with BTF objects for kernel modules. To avoid duplicating
> + all kernel symbols required by modules, BTF objects for
> + modules are "split", they are built incrementally on top of
> + the kernel (vmlinux) BTF object. So the base BTF reference
> + should usually point to the kernel BTF.
> +
> -L, --use-loader
> For skeletons, generate a "light" skeleton (also known as "loader"
> skeleton). A light skeleton contains a loader eBPF program. It does
> @@ -444,3 +452,11 @@ ones given to min_core_btf.
> obj = bpf_object__open_file("one.bpf.o", &opts);
>
> ...
> +
> +Kernel module BTF may also be minimized by using the -B option:
> +
> +**$ bpftool -B 5.4.0-smaller.btf gen min_core_btf 5.4.0-module.btf
> 5.4.0-module-smaller.btf one.bpf.o**
> +
> +A minimized module BTF will still not contain vmlinux BTF types, so you
> +should always minimize the vmlinux file first, and then minimize the
> +kernel module file.
> diff --git a/tools/bpf/bpftool/gen.c b/tools/bpf/bpftool/gen.c
> index ee3ce2b8000d..634c809a5173 100644
> --- a/tools/bpf/bpftool/gen.c
> +++ b/tools/bpf/bpftool/gen.c
> @@ -1630,6 +1630,7 @@ static int do_help(int argc, char **argv)
> " %1$s %2$s help\n"
> "\n"
> " " HELP_SPEC_OPTIONS " |\n"
> + " {-B|--base-btf} |\n"
> " {-L|--use-loader} }\n"
> "",
> bin_name, "gen");
> @@ -1695,14 +1696,14 @@ btfgen_new_info(const char *targ_btf_path)
> if (!info)
> return NULL;
>
> - info->src_btf = btf__parse(targ_btf_path, NULL);
> + info->src_btf = btf__parse_split(targ_btf_path, base_btf);
> if (!info->src_btf) {
> err = -errno;
Looks like you have formating issues here. The proper identation is gone.
> p_err("failed parsing '%s' BTF file: %s", targ_btf_path, strerror(errno));
> goto err_out;
> }
>
> - info->marked_btf = btf__parse(targ_btf_path, NULL);
> + info->marked_btf = btf__parse_split(targ_btf_path, base_btf);
> if (!info->marked_btf) {
> err = -errno;
> p_err("failed parsing '%s' BTF file: %s", targ_btf_path, strerror(errno));
[...]
prev parent reply other threads:[~2024-01-22 6:44 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-01-19 21:18 [PATCH bpf-next] bpftool: add support for split BTF to gen min_core_btf Bryce Kahle
2024-01-22 6:44 ` Yonghong Song [this message]
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=7fb4e5c0-3f9f-428d-80b9-a9727dd1dbd7@linux.dev \
--to=yonghong.song@linux.dev \
--cc=ast@kernel.org \
--cc=bpf@vger.kernel.org \
--cc=bryce.kahle@datadoghq.com \
--cc=daniel@iogearbox.net \
--cc=quentin@isovalent.com \
/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.