Re: [PATCH v4 bpf-next 3/5] kbuild: build kernel module BTFs if BTF is enabled and pahole supports it
On 11/9/20 6:19 PM, Andrii Nakryiko wrote: > diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug > index d7a7bc3b6098..1e78faaf20a5 100644 > --- a/lib/Kconfig.debug > +++ b/lib/Kconfig.debug > @@ -274,6 +274,15 @@ config DEBUG_INFO_BTF > Turning this on expects presence of pahole tool, which will convert > DWARF type info into equivalent deduplicated BTF type info. > > +config PAHOLE_HAS_SPLIT_BTF > + def_bool $(success, test `$(PAHOLE) --version | sed -E > 's/v([0-9]+)\.([0-9]+)/\1\2/'` -ge "119") > + > +config DEBUG_INFO_BTF_MODULES > + def_bool y > + depends on DEBUG_INFO_BTF && MODULES && PAHOLE_HAS_SPLIT_BTF > + help > + Generate compact split BTF type information for kernel modules. > + > config GDB_SCRIPTS > bool "Provide GDB scripts for kernel debugging" > help Thank you for adding a config option for this feature vs bumping the required pahole version in scripts/link-vmlinux.sh. This is a much more friendly way of handling kernel features that require support from build tools.
Re: [PATCH v4 bpf-next 3/5] kbuild: build kernel module BTFs if BTF is enabled and pahole supports it
On Mon, Nov 16, 2020 at 1:24 PM Jakub Kicinski wrote: > > On Mon, 16 Nov 2020 12:34:17 -0800 Andrii Nakryiko wrote: > > > This change, commit 5f9ae91f7c0d ("kbuild: Build kernel module BTFs if > > > BTF is enabled and pahole > > > supports it") currently in net-next, linux-next, etc. breaks the use-case > > > of compiling only a specific > > > kernel module (both in-tree and out-of-tree, e.g. 'make > > > M=drivers/net/ethernet/intel/ice') after > > > first doing a 'make modules_prepare'. Previously, that use-case would > > > result in a warning noting > > > "Symbol info of vmlinux is missing. Unresolved symbol check will be > > > entirely skipped" but now it > > > errors out after noting "No rule to make target 'vmlinux', needed by > > > '<...>.ko'. Stop." > > > > > > Is that intentional? > > > > I wasn't aware of such a use pattern, so definitely not intentional. > > But vmlinux is absolutely necessary to generate the module BTF. So I'm > > wondering what's the proper fix here? Leave it as is (that error > > message is actually surprisingly descriptive, btw)? Force vmlinux > > build? Or skip BTF generation for that module? > > For an external out-of-tree module there is no guarantee that vmlinux > will even be on the system, no? So only the last option can work in > that case. Ok, how about something like the patch below. With that I seem to be getting the desired behavior: $ make clean $ touch drivers/acpi/button.c $ make M=drivers/acpi make[1]: Entering directory `/data/users/andriin/linux-build/default-x86_64' 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 make[1]: Leaving directory `/data/users/andriin/linux-build/default-x86_64' $ 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 00029310 ab3f 0 0 1 diff --git a/scripts/Makefile.modfinal b/scripts/Makefile.modfinal index 02b892421f7a..d49ec001825d 100644 --- a/scripts/Makefile.modfinal +++ b/scripts/Makefile.modfinal @@ -38,7 +38,12 @@ quiet_cmd_ld_ko_o = LD [M] $@ $(if $(ARCH_POSTLINK), $(MAKE) -f $(ARCH_POSTLINK) $@, true) quiet_cmd_btf_ko = BTF [M] $@ - cmd_btf_ko = LLVM_OBJCOPY=$(OBJCOPY) $(PAHOLE) -J --btf_base vmlinux $@ + cmd_btf_ko = \ +if [ -f vmlinux ]; then\ +LLVM_OBJCOPY=$(OBJCOPY) $(PAHOLE) -J --btf_base vmlinux $@; \ +else\ +printf "Skipping BTF generation for %s due to unavailability of vmlinux\n" $@ 1>&2; \ +fi; # Same as newer-prereqs, but allows to exclude specified extra dependencies newer_prereqs_except = $(filter-out $(PHONY) $(1),$?) @@ -49,7 +54,7 @@ if_changed_except = $(if $(call newer_prereqs_except,$(2))$(cmd-check), \ printf '%s\n' 'cmd_$@ := $(make-cmd)' > $(dot-target).cmd, @:) # Re-generate module BTFs if either module's .ko or vmlinux changed -$(modules): %.ko: %.o %.mod.o scripts/module.lds vmlinux FORCE +$(modules): %.ko: %.o %.mod.o scripts/module.lds $(if $(KBUILD_BUILTIN),vmlinux) FORCE +$(call if_changed_except,ld_ko_o,vmlinux) ifdef CONFIG_DEBUG_INFO_BTF_MODULES +$(if $(newer-prereqs),$(call cmd,btf_ko))
Re: [PATCH v4 bpf-next 3/5] kbuild: build kernel module BTFs if BTF is enabled and pahole supports it
On Mon, 16 Nov 2020 12:34:17 -0800 Andrii Nakryiko wrote: > > This change, commit 5f9ae91f7c0d ("kbuild: Build kernel module BTFs if BTF > > is enabled and pahole > > supports it") currently in net-next, linux-next, etc. breaks the use-case > > of compiling only a specific > > kernel module (both in-tree and out-of-tree, e.g. 'make > > M=drivers/net/ethernet/intel/ice') after > > first doing a 'make modules_prepare'. Previously, that use-case would > > result in a warning noting > > "Symbol info of vmlinux is missing. Unresolved symbol check will be > > entirely skipped" but now it > > errors out after noting "No rule to make target 'vmlinux', needed by > > '<...>.ko'. Stop." > > > > Is that intentional? > > I wasn't aware of such a use pattern, so definitely not intentional. > But vmlinux is absolutely necessary to generate the module BTF. So I'm > wondering what's the proper fix here? Leave it as is (that error > message is actually surprisingly descriptive, btw)? Force vmlinux > build? Or skip BTF generation for that module? For an external out-of-tree module there is no guarantee that vmlinux will even be on the system, no? So only the last option can work in that case.
Re: [PATCH v4 bpf-next 3/5] kbuild: build kernel module BTFs if BTF is enabled and pahole supports it
On Mon, Nov 16, 2020 at 11:55 AM Allan, Bruce W wrote: > > > -Original Message- > > From: Song Liu > > Sent: Tuesday, November 10, 2020 5:05 PM > > To: Andrii Nakryiko > > Cc: bpf ; Networking ; > > Starovoitov, Alexei ; Daniel Borkmann ; > > Kernel Team ; open list > ker...@vger.kernel.org>; raf...@kernel.org; j...@kernel.org; Arnaldo > > Carvalho de Melo ; Greg Kroah-Hartman > > ; Masahiro Yamada > > > > Subject: Re: [PATCH v4 bpf-next 3/5] kbuild: build kernel module BTFs if > > BTF is > > enabled and pahole supports it > > > > > > > > > On Nov 9, 2020, at 5:19 PM, Andrii Nakryiko wrote: > > > > [...] > > > > > 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 > > > > > > Cc: Masahiro Yamada > > > Signed-off-by: Andrii Nakryiko > > > > Acked-by: Song Liu > > This change, commit 5f9ae91f7c0d ("kbuild: Build kernel module BTFs if BTF is > enabled and pahole > supports it") currently in net-next, linux-next, etc. breaks the use-case of > compiling only a specific > kernel module (both in-tree and out-of-tree, e.g. 'make > M=drivers/net/ethernet/intel/ice') after > first doing a 'make modules_prepare'. Previously, that use-case would result > in a warning noting > "Symbol info of vmlinux is missing. Unresolved symbol check will be entirely > skipped" but now it > errors out after noting "No rule to make target 'vmlinux', needed by > '<...>.ko'. Stop." > > Is that intentional? I wasn't aware of such a use pattern, so definitely not intentional. But vmlinux is absolutely necessary to generate the module BTF. So I'm wondering what's the proper fix here? Leave it as is (that error message is actually surprisingly descriptive, btw)? Force vmlinux build? Or skip BTF generation for that module? > > Thanks, > Bruce.
RE: [PATCH v4 bpf-next 3/5] kbuild: build kernel module BTFs if BTF is enabled and pahole supports it
> -Original Message- > From: Song Liu > Sent: Tuesday, November 10, 2020 5:05 PM > To: Andrii Nakryiko > Cc: bpf ; Networking ; > Starovoitov, Alexei ; Daniel Borkmann ; > Kernel Team ; open list ker...@vger.kernel.org>; raf...@kernel.org; j...@kernel.org; Arnaldo > Carvalho de Melo ; Greg Kroah-Hartman > ; Masahiro Yamada > > Subject: Re: [PATCH v4 bpf-next 3/5] kbuild: build kernel module BTFs if BTF > is > enabled and pahole supports it > > > > > On Nov 9, 2020, at 5:19 PM, Andrii Nakryiko wrote: > > [...] > > > 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 > > > > Cc: Masahiro Yamada > > Signed-off-by: Andrii Nakryiko > > Acked-by: Song Liu This change, commit 5f9ae91f7c0d ("kbuild: Build kernel module BTFs if BTF is enabled and pahole supports it") currently in net-next, linux-next, etc. breaks the use-case of compiling only a specific kernel module (both in-tree and out-of-tree, e.g. 'make M=drivers/net/ethernet/intel/ice') after first doing a 'make modules_prepare'. Previously, that use-case would result in a warning noting "Symbol info of vmlinux is missing. Unresolved symbol check will be entirely skipped" but now it errors out after noting "No rule to make target 'vmlinux', needed by '<...>.ko'. Stop." Is that intentional? Thanks, Bruce.
Re: [PATCH v4 bpf-next 3/5] kbuild: build kernel module BTFs if BTF is enabled and pahole supports it
> On Nov 9, 2020, at 5:19 PM, Andrii Nakryiko wrote: [...] > 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 > > Cc: Masahiro Yamada > Signed-off-by: Andrii Nakryiko Acked-by: Song Liu