Re: [RESEND][PATCH v3 bpf-next] btf: expose BTF info through sysfs

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

 



On 8/12/19 8:39 PM, Andrii Nakryiko wrote:
Make .BTF section allocated and expose its contents through sysfs.

/sys/kernel/btf directory is created to contain all the BTFs present
inside kernel. Currently there is only kernel's main BTF, represented as
/sys/kernel/btf/kernel file. Once kernel modules' BTFs are supported,
each module will expose its BTF as /sys/kernel/btf/<module-name> file.

Current approach relies on a few pieces coming together:
1. pahole is used to take almost final vmlinux image (modulo .BTF and
    kallsyms) and generate .BTF section by converting DWARF info into
    BTF. This section is not allocated and not mapped to any segment,
    though, so is not yet accessible from inside kernel at runtime.
2. objcopy dumps .BTF contents into binary file and subsequently
    convert binary file into linkable object file with automatically
    generated symbols _binary__btf_kernel_bin_start and
    _binary__btf_kernel_bin_end, pointing to start and end, respectively,
    of BTF raw data.
3. final vmlinux image is generated by linking this object file (and
    kallsyms, if necessary). sysfs_btf.c then creates
    /sys/kernel/btf/kernel file and exposes embedded BTF contents through
    it. This allows, e.g., libbpf and bpftool access BTF info at
    well-known location, without resorting to searching for vmlinux image
    on disk (location of which is not standardized and vmlinux image
    might not be even available in some scenarios, e.g., inside qemu
    during testing).

Small question: given modules will be covered later, would it not be more
obvious to name it /sys/kernel/btf/vmlinux instead?

Alternative approach using .incbin assembler directive to embed BTF
contents directly was attempted but didn't work, because sysfs_proc.o is
not re-compiled during link-vmlinux.sh stage. This is required, though,
to update embedded BTF data (initially empty data is embedded, then
pahole generates BTF info and we need to regenerate sysfs_btf.o with
updated contents, but it's too late at that point).

If BTF couldn't be generated due to missing or too old pahole,
sysfs_btf.c handles that gracefully by detecting that
_binary__btf_kernel_bin_start (weak symbol) is 0 and not creating
/sys/kernel/btf at all.

v2->v3:
- added Documentation/ABI/testing/sysfs-kernel-btf (Greg K-H);
- created proper kobject (btf_kobj) for btf directory (Greg K-H);
- undo v2 change of reusing vmlinux, as it causes extra kallsyms pass
   due to initially missing  __binary__btf_kernel_bin_{start/end} symbols;

v1->v2:
- allow kallsyms stage to re-use vmlinux generated by gen_btf();

Reviewed-by: Greg Kroah-Hartman <gregkh@xxxxxxxxxxxxxxxxxxx>
Signed-off-by: Andrii Nakryiko <andriin@xxxxxx>

In any case, this is great progress, applied thanks!



[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