bpf.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH RESEND bpf-next 1/2] kbuild: skip module BTF generation for out-of-tree external modules
@ 2020-11-21  7:08 Andrii Nakryiko
  2020-11-21  7:08 ` [PATCH RESEND bpf-next 2/2] bpf: sanitize BTF data pointer after module is loaded Andrii Nakryiko
  2020-11-25  0:50 ` [PATCH RESEND bpf-next 1/2] kbuild: skip module BTF generation for out-of-tree external modules patchwork-bot+netdevbpf
  0 siblings, 2 replies; 3+ messages in thread
From: Andrii Nakryiko @ 2020-11-21  7:08 UTC (permalink / raw)
  To: bpf
  Cc: andrii, kernel-team, Bruce Allan, Jessica Yu, Greg Kroah-Hartman,
	Masahiro Yamada

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

Reported-by: Bruce Allan <bruce.w.allan@intel.com>
Fixes: 5f9ae91f7c0d ("kbuild: Build kernel module BTFs if BTF is enabled and pahole supports it")
Cc: Jessica Yu <jeyu@kernel.org>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: Masahiro Yamada <yamada.masahiro@socionext.com>
Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
---
 scripts/Makefile.modfinal | 9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)

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))
-- 
2.24.1


^ permalink raw reply related	[flat|nested] 3+ messages in thread

* [PATCH RESEND bpf-next 2/2] bpf: sanitize BTF data pointer after module is loaded
  2020-11-21  7:08 [PATCH RESEND bpf-next 1/2] kbuild: skip module BTF generation for out-of-tree external modules Andrii Nakryiko
@ 2020-11-21  7:08 ` Andrii Nakryiko
  2020-11-25  0:50 ` [PATCH RESEND bpf-next 1/2] kbuild: skip module BTF generation for out-of-tree external modules patchwork-bot+netdevbpf
  1 sibling, 0 replies; 3+ messages in thread
From: Andrii Nakryiko @ 2020-11-21  7:08 UTC (permalink / raw)
  To: bpf
  Cc: andrii, kernel-team, Bruce Allan, Jessica Yu, Greg Kroah-Hartman,
	Masahiro Yamada

Given .BTF section is not allocatable, it will get trimmed after module is
loaded. BPF system handles that properly by creating an independent copy of
data. But prevent any accidental misused by resetting the pointer to BTF data.

Suggested-by: Jessica Yu <jeyu@kernel.org>
Fixes: 36e68442d1af ("bpf: Load and verify kernel module BTFs")
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Acked-by: Jessica Yu <jeyu@kernel.org>
Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
---
 kernel/module.c | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/kernel/module.c b/kernel/module.c
index f2996b02ab2e..18f259d61d14 100644
--- a/kernel/module.c
+++ b/kernel/module.c
@@ -3709,6 +3709,11 @@ static noinline int do_init_module(struct module *mod)
 	mod->init_layout.ro_size = 0;
 	mod->init_layout.ro_after_init_size = 0;
 	mod->init_layout.text_size = 0;
+#ifdef CONFIG_DEBUG_INFO_BTF_MODULES
+	/* .BTF is not SHF_ALLOC and will get removed, so sanitize pointer */
+	mod->btf_data = NULL;
+	mod->btf_data_size = 0;
+#endif
 	/*
 	 * We want to free module_init, but be aware that kallsyms may be
 	 * walking this with preempt disabled.  In all the failure paths, we
-- 
2.24.1


^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [PATCH RESEND bpf-next 1/2] kbuild: skip module BTF generation for out-of-tree external modules
  2020-11-21  7:08 [PATCH RESEND bpf-next 1/2] kbuild: skip module BTF generation for out-of-tree external modules Andrii Nakryiko
  2020-11-21  7:08 ` [PATCH RESEND bpf-next 2/2] bpf: sanitize BTF data pointer after module is loaded Andrii Nakryiko
@ 2020-11-25  0:50 ` patchwork-bot+netdevbpf
  1 sibling, 0 replies; 3+ messages in thread
From: patchwork-bot+netdevbpf @ 2020-11-25  0:50 UTC (permalink / raw)
  To: Andrii Nakryiko
  Cc: bpf, kernel-team, bruce.w.allan, jeyu, gregkh, yamada.masahiro

Hello:

This series was applied to bpf/bpf-next.git (refs/heads/master):

On Fri, 20 Nov 2020 23:08:28 -0800 you wrote:
> 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:
> 
> [...]

Here is the summary with links:
  - [RESEND,bpf-next,1/2] kbuild: skip module BTF generation for out-of-tree external modules
    https://git.kernel.org/bpf/bpf-next/c/e732b538f455
  - [RESEND,bpf-next,2/2] bpf: sanitize BTF data pointer after module is loaded
    https://git.kernel.org/bpf/bpf-next/c/607c543f939d

You are awesome, thank you!
--
Deet-doot-dot, I am a bot.
https://korg.docs.kernel.org/patchwork/pwbot.html



^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2020-11-25  0:50 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-11-21  7:08 [PATCH RESEND bpf-next 1/2] kbuild: skip module BTF generation for out-of-tree external modules Andrii Nakryiko
2020-11-21  7:08 ` [PATCH RESEND bpf-next 2/2] bpf: sanitize BTF data pointer after module is loaded Andrii Nakryiko
2020-11-25  0:50 ` [PATCH RESEND bpf-next 1/2] kbuild: skip module BTF generation for out-of-tree external modules patchwork-bot+netdevbpf

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).