Re: [PATCH bpf-next] bpftool: add support for split BTF to gen min_core_btf

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

 




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@xxxxxxxxxxxxx>
---
  .../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));

[...]





[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