25 Nov, 2020

1 commit

  • In some modes of operation, Kbuild allows to build modules without having
    vmlinux image around. In such case, generation of module BTF is impossible.
    This patch changes the behavior to emit a warning about impossibility of
    generating kernel module BTF, instead of breaking the build. This is especially
    important for out-of-tree external module builds.

    In vmlinux-less mode:

    $ make clean
    $ make modules_prepare
    $ touch drivers/acpi/button.c
    $ make M=drivers/acpi
    ...
    CC [M] drivers/acpi/button.o
    MODPOST drivers/acpi/Module.symvers
    LD [M] drivers/acpi/button.ko
    BTF [M] drivers/acpi/button.ko
    Skipping BTF generation for drivers/acpi/button.ko due to unavailability of vmlinux
    ...
    $ readelf -S ~/linux-build/default/drivers/acpi/button.ko | grep BTF -A1
    ... empty ...

    Now with normal build:

    $ make all
    ...
    LD [M] drivers/acpi/button.ko
    BTF [M] drivers/acpi/button.ko
    ...
    $ readelf -S ~/linux-build/default/drivers/acpi/button.ko | grep BTF -A1
    [60] .BTF PROGBITS 0000000000000000 00029310
    000000000000ab3f 0000000000000000 0 0 1

    Fixes: 5f9ae91f7c0d ("kbuild: Build kernel module BTFs if BTF is enabled and pahole supports it")
    Reported-by: Bruce Allan
    Signed-off-by: Andrii Nakryiko
    Signed-off-by: Daniel Borkmann
    Cc: Jessica Yu
    Cc: Greg Kroah-Hartman
    Cc: Masahiro Yamada
    Link: https://lore.kernel.org/bpf/20201121070829.2612884-1-andrii@kernel.org

    Andrii Nakryiko
     

11 Nov, 2020

1 commit

  • Detect if pahole supports split BTF generation, and generate BTF for each
    selected kernel module, if it does. This is exposed to Makefiles and C code as
    CONFIG_DEBUG_INFO_BTF_MODULES flag.

    Kernel module BTF has to be re-generated if either vmlinux's BTF changes or
    module's .ko changes. To achieve that, I needed a helper similar to
    if_changed, but that would allow to filter out vmlinux from the list of
    updated dependencies for .ko building. I've put it next to the only place that
    uses and needs it, but it might be a better idea to just add it along the
    other if_changed variants into scripts/Kbuild.include.

    Each kernel module's BTF deduplication is pretty fast, as it does only
    incremental BTF deduplication on top of already deduplicated vmlinux BTF. To
    show the added build time, I've first ran make only just built kernel (to
    establish the baseline) and then forced only BTF re-generation, without
    regenerating .ko files. The build was performed with -j60 parallelization on
    56-core machine. The final time also includes bzImage building, so it's not
    a pure BTF overhead.

    $ time make -j60
    ...
    make -j60 27.65s user 10.96s system 782% cpu 4.933 total
    $ touch ~/linux-build/default/vmlinux && time make -j60
    ...
    make -j60 123.69s user 27.85s system 1566% cpu 9.675 total

    So 4.6 seconds real time, with noticeable part spent in compressed vmlinux and
    bzImage building.

    To show size savings, I've built my kernel configuration with about 700 kernel
    modules with full BTF per each kernel module (without deduplicating against
    vmlinux) and with split BTF against deduplicated vmlinux (approach in this
    patch). Below are top 10 modules with biggest BTF sizes. And total size of BTF
    data across all kernel modules.

    It shows that split BTF "compresses" 115MB down to 5MB total. And the biggest
    kernel modules get a downsize from 500-570KB down to 200-300KB.

    FULL BTF
    ========

    $ for f in $(find . -name '*.ko'); do size -A -d $f | grep BTF | awk '{print $2}'; done | awk '{ s += $1 } END { print s }'
    115710691

    $ for f in $(find . -name '*.ko'); do printf "%s %d\n" $f $(size -A -d $f | grep BTF | awk '{print $2}'); done | sort -nr -k2 | head -n10
    ./drivers/gpu/drm/i915/i915.ko 570570
    ./drivers/net/ethernet/mellanox/mlx5/core/mlx5_core.ko 520240
    ./drivers/gpu/drm/radeon/radeon.ko 503849
    ./drivers/infiniband/hw/mlx5/mlx5_ib.ko 491777
    ./fs/xfs/xfs.ko 411544
    ./drivers/net/ethernet/intel/i40e/i40e.ko 403904
    ./drivers/net/ethernet/broadcom/bnx2x/bnx2x.ko 398754
    ./drivers/infiniband/core/ib_core.ko 397224
    ./fs/cifs/cifs.ko 386249
    ./fs/nfsd/nfsd.ko 379738

    SPLIT BTF
    =========

    $ for f in $(find . -name '*.ko'); do size -A -d $f | grep BTF | awk '{print $2}'; done | awk '{ s += $1 } END { print s }'
    5194047

    $ for f in $(find . -name '*.ko'); do printf "%s %d\n" $f $(size -A -d $f | grep BTF | awk '{print $2}'); done | sort -nr -k2 | head -n10
    ./drivers/gpu/drm/i915/i915.ko 293206
    ./drivers/gpu/drm/radeon/radeon.ko 282103
    ./fs/xfs/xfs.ko 222150
    ./drivers/net/ethernet/mellanox/mlx5/core/mlx5_core.ko 198503
    ./drivers/infiniband/hw/mlx5/mlx5_ib.ko 198356
    ./drivers/net/ethernet/broadcom/bnx2x/bnx2x.ko 113444
    ./fs/cifs/cifs.ko 109379
    ./arch/x86/kvm/kvm.ko 100225
    ./drivers/gpu/drm/drm.ko 94827
    ./drivers/infiniband/core/ib_core.ko 91188

    Signed-off-by: Andrii Nakryiko
    Signed-off-by: Alexei Starovoitov
    Link: https://lore.kernel.org/bpf/20201110011932.3201430-4-andrii@kernel.org

    Andrii Nakryiko
     

24 Sep, 2020

1 commit

  • There was a request to preprocess the module linker script like we
    do for the vmlinux one. (https://lkml.org/lkml/2020/8/21/512)

    The difference between vmlinux.lds and module.lds is that the latter
    is needed for external module builds, thus must be cleaned up by
    'make mrproper' instead of 'make clean'. Also, it must be created
    by 'make modules_prepare'.

    You cannot put it in arch/$(SRCARCH)/kernel/, which is cleaned up by
    'make clean'. I moved arch/$(SRCARCH)/kernel/module.lds to
    arch/$(SRCARCH)/include/asm/module.lds.h, which is included from
    scripts/module.lds.S.

    scripts/module.lds is fine because 'make clean' keeps all the
    build artifacts under scripts/.

    You can add arch-specific sections in .

    Signed-off-by: Masahiro Yamada
    Tested-by: Jessica Yu
    Acked-by: Will Deacon
    Acked-by: Geert Uytterhoeven
    Acked-by: Palmer Dabbelt
    Reviewed-by: Kees Cook
    Acked-by: Jessica Yu

    Masahiro Yamada
     

22 Aug, 2019

2 commits