Linus, Greg, Masahiro, Here are some simple fixes for the kheaders feature. Please consider these patches for an rc release. They are based on Linus's master branch. Thanks!
Joel Fernandes (Google) (3): kheaders: Move from proc to sysfs kheaders: Do not regenerate archive if config is not changed kheaders: Make it depend on sysfs
init/Kconfig | 17 +++++---- kernel/Makefile | 4 +-- kernel/{gen_ikh_data.sh => gen_kheaders.sh} | 17 ++++++--- kernel/kheaders.c | 40 +++++++++------------ 4 files changed, 38 insertions(+), 40 deletions(-) rename kernel/{gen_ikh_data.sh => gen_kheaders.sh} (82%)
-- 2.21.0.1020.gf2820cf01a-goog
The kheaders archive consisting of the kernel headers used for compiling bpf programs is in /proc. However there is concern that moving it here will make it permanent. Let us move it to /sys/kernel as discussed [1].
[1] https://lore.kernel.org/patchwork/patch/1067310/#1265969
Suggested-by: Steven Rostedt rostedt@goodmis.org Acked-by: Steven Rostedt rostedt@goodmis.org Signed-off-by: Joel Fernandes (Google) joel@joelfernandes.org ---
Changes to this patch since initial posting: Fixed sysfs file mode nit (Greg). Fixed some kconfig nits (Masami).
init/Kconfig | 16 ++++----- kernel/Makefile | 4 +-- kernel/{gen_ikh_data.sh => gen_kheaders.sh} | 2 +- kernel/kheaders.c | 40 +++++++++------------ 4 files changed, 26 insertions(+), 36 deletions(-) rename kernel/{gen_ikh_data.sh => gen_kheaders.sh} (98%)
diff --git a/init/Kconfig b/init/Kconfig index 82b84e5ee30d..ce08adf0f637 100644 --- a/init/Kconfig +++ b/init/Kconfig @@ -579,15 +579,13 @@ config IKCONFIG_PROC This option enables access to the kernel configuration file through /proc/config.gz.
-config IKHEADERS_PROC - tristate "Enable kernel header artifacts through /proc/kheaders.tar.xz" - depends on PROC_FS - help - This option enables access to the kernel header and other artifacts that - are generated during the build process. These can be used to build eBPF - tracing programs, or similar programs. If you build the headers as a - module, a module called kheaders.ko is built which can be loaded on-demand - to get access to the headers. +config IKHEADERS + tristate "Enable kernel headers through /sys/kernel/kheaders.tar.xz" + help + This option enables access to the in-kernel headers that are generated during + the build process. These can be used to build eBPF tracing programs, + or similar programs. If you build the headers as a module, a module called + kheaders.ko is built which can be loaded on-demand to get access to headers.
config LOG_BUF_SHIFT int "Kernel log buffer size (16 => 64KB, 17 => 128KB)" diff --git a/kernel/Makefile b/kernel/Makefile index 298437bb2c6a..60e3057c780e 100644 --- a/kernel/Makefile +++ b/kernel/Makefile @@ -71,7 +71,7 @@ obj-$(CONFIG_UTS_NS) += utsname.o obj-$(CONFIG_USER_NS) += user_namespace.o obj-$(CONFIG_PID_NS) += pid_namespace.o obj-$(CONFIG_IKCONFIG) += configs.o -obj-$(CONFIG_IKHEADERS_PROC) += kheaders.o +obj-$(CONFIG_IKHEADERS) += kheaders.o obj-$(CONFIG_SMP) += stop_machine.o obj-$(CONFIG_KPROBES_SANITY_TEST) += test_kprobes.o obj-$(CONFIG_AUDIT) += audit.o auditfilter.o @@ -127,7 +127,7 @@ $(obj)/config_data.gz: $(KCONFIG_CONFIG) FORCE $(obj)/kheaders.o: $(obj)/kheaders_data.tar.xz
quiet_cmd_genikh = CHK $(obj)/kheaders_data.tar.xz -cmd_genikh = $(srctree)/kernel/gen_ikh_data.sh $@ +cmd_genikh = $(srctree)/kernel/gen_kheaders.sh $@ $(obj)/kheaders_data.tar.xz: FORCE $(call cmd,genikh)
diff --git a/kernel/gen_ikh_data.sh b/kernel/gen_kheaders.sh similarity index 98% rename from kernel/gen_ikh_data.sh rename to kernel/gen_kheaders.sh index 591a94f7b387..581b83534587 100755 --- a/kernel/gen_ikh_data.sh +++ b/kernel/gen_kheaders.sh @@ -2,7 +2,7 @@ # SPDX-License-Identifier: GPL-2.0
# This script generates an archive consisting of kernel headers -# for CONFIG_IKHEADERS_PROC. +# for CONFIG_IKHEADERS. set -e spath="$(dirname "$(readlink -f "$0")")" kroot="$spath/.." diff --git a/kernel/kheaders.c b/kernel/kheaders.c index 70ae6052920d..8f69772af77b 100644 --- a/kernel/kheaders.c +++ b/kernel/kheaders.c @@ -8,9 +8,8 @@
#include <linux/kernel.h> #include <linux/module.h> -#include <linux/proc_fs.h> +#include <linux/kobject.h> #include <linux/init.h> -#include <linux/uaccess.h>
/* * Define kernel_headers_data and kernel_headers_data_end, within which the @@ -31,39 +30,32 @@ extern char kernel_headers_data; extern char kernel_headers_data_end;
static ssize_t -ikheaders_read_current(struct file *file, char __user *buf, - size_t len, loff_t *offset) +ikheaders_read(struct file *file, struct kobject *kobj, + struct bin_attribute *bin_attr, + char *buf, loff_t off, size_t len) { - return simple_read_from_buffer(buf, len, offset, - &kernel_headers_data, - &kernel_headers_data_end - - &kernel_headers_data); + memcpy(buf, &kernel_headers_data + off, len); + return len; }
-static const struct file_operations ikheaders_file_ops = { - .read = ikheaders_read_current, - .llseek = default_llseek, +static struct bin_attribute kheaders_attr __ro_after_init = { + .attr = { + .name = "kheaders.tar.xz", + .mode = 0444, + }, + .read = &ikheaders_read, };
static int __init ikheaders_init(void) { - struct proc_dir_entry *entry; - - /* create the current headers file */ - entry = proc_create("kheaders.tar.xz", S_IRUGO, NULL, - &ikheaders_file_ops); - if (!entry) - return -ENOMEM; - - proc_set_size(entry, - &kernel_headers_data_end - - &kernel_headers_data); - return 0; + kheaders_attr.size = (&kernel_headers_data_end - + &kernel_headers_data); + return sysfs_create_bin_file(kernel_kobj, &kheaders_attr); }
static void __exit ikheaders_cleanup(void) { - remove_proc_entry("kheaders.tar.xz", NULL); + sysfs_remove_bin_file(kernel_kobj, &kheaders_attr); }
module_init(ikheaders_init);
Linus reported an issue that doing an allmodconfig was causing the kheaders archive to be regenerated even though the config is the same. This patch fixes the issue by ignoring the config-related header files for "knowing when to regenerate based on timestamps". Instead, if the CONFIG_X_Y option really changes, then we there are the include/config/X/Y.h which will already tells us "if a config really changed". So we don't really need these files for regeneration detection anyway, and ignoring them fixes Linus's issue.
Reported-by: Linus Torvalds torvalds@linux-foundation.org Signed-off-by: Joel Fernandes (Google) joel@joelfernandes.org --- kernel/gen_kheaders.sh | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-)
diff --git a/kernel/gen_kheaders.sh b/kernel/gen_kheaders.sh index 581b83534587..9a34e1d9bd7f 100755 --- a/kernel/gen_kheaders.sh +++ b/kernel/gen_kheaders.sh @@ -31,9 +31,8 @@ arch/$SRCARCH/include/
# This block is useful for debugging the incremental builds. # Uncomment it for debugging. -# iter=1 -# if [ ! -f /tmp/iter ]; then echo 1 > /tmp/iter; -# else; iter=$(($(cat /tmp/iter) + 1)); fi +# if [ ! -f /tmp/iter ]; then iter=1; echo 1 > /tmp/iter; +# else iter=$(($(cat /tmp/iter) + 1)); echo $iter > /tmp/iter; fi # find $src_file_list -type f | xargs ls -lR > /tmp/src-ls-$iter # find $obj_file_list -type f | xargs ls -lR > /tmp/obj-ls-$iter
@@ -43,10 +42,18 @@ arch/$SRCARCH/include/ pushd $kroot > /dev/null src_files_md5="$(find $src_file_list -type f | grep -v "include/generated/compile.h" | + grep -v "include/generated/autoconf.h" | + grep -v "include/config/auto.conf" | + grep -v "include/config/auto.conf.cmd" | + grep -v "include/config/tristate.conf" | xargs ls -lR | md5sum | cut -d ' ' -f1)" popd > /dev/null obj_files_md5="$(find $obj_file_list -type f | grep -v "include/generated/compile.h" | + grep -v "include/generated/autoconf.h" | + grep -v "include/config/auto.conf" | + grep -v "include/config/auto.conf.cmd" | + grep -v "include/config/tristate.conf" | xargs ls -lR | md5sum | cut -d ' ' -f1)"
if [ -f $tarfile ]; then tarfile_md5="$(md5sum $tarfile | cut -d ' ' -f1)"; fi @@ -82,7 +89,7 @@ find $cpio_dir -type f -print0 |
tar -Jcf $tarfile -C $cpio_dir/ . > /dev/null
-echo "$src_files_md5" > kernel/kheaders.md5 +echo "$src_files_md5" > kernel/kheaders.md5 echo "$obj_files_md5" >> kernel/kheaders.md5 echo "$(md5sum $tarfile | cut -d ' ' -f1)" >> kernel/kheaders.md5
The kheaders archive is exposed through SYSFS in /sys/kernel/. Make it depend on SYSFS as it makes no sense to enable this feature without it.
Suggested-by: Masahiro Yamada yamada.masahiro@socionext.com Signed-off-by: Joel Fernandes (Google) joel@joelfernandes.org --- init/Kconfig | 1 + 1 file changed, 1 insertion(+)
diff --git a/init/Kconfig b/init/Kconfig index ce08adf0f637..f27138a8cf28 100644 --- a/init/Kconfig +++ b/init/Kconfig @@ -581,6 +581,7 @@ config IKCONFIG_PROC
config IKHEADERS tristate "Enable kernel headers through /sys/kernel/kheaders.tar.xz" + depends on SYSFS help This option enables access to the in-kernel headers that are generated during the build process. These can be used to build eBPF tracing programs,
On Sat, May 11, 2019 at 6:05 AM Joel Fernandes (Google) joel@joelfernandes.org wrote:
The kheaders archive is exposed through SYSFS in /sys/kernel/. Make it depend on SYSFS as it makes no sense to enable this feature without it.
And, it also makes no sense to break the feature by 1/3, then fix it by 3/3.
Why don't you squash this?
Suggested-by: Masahiro Yamada yamada.masahiro@socionext.com Signed-off-by: Joel Fernandes (Google) joel@joelfernandes.org
init/Kconfig | 1 + 1 file changed, 1 insertion(+)
diff --git a/init/Kconfig b/init/Kconfig index ce08adf0f637..f27138a8cf28 100644 --- a/init/Kconfig +++ b/init/Kconfig @@ -581,6 +581,7 @@ config IKCONFIG_PROC
config IKHEADERS tristate "Enable kernel headers through /sys/kernel/kheaders.tar.xz"
depends on SYSFS help This option enables access to the in-kernel headers that are generated during the build process. These can be used to build eBPF tracing programs,
-- 2.21.0.1020.gf2820cf01a-goog
On Sat, May 11, 2019 at 09:52:04AM +0900, Masahiro Yamada wrote:
On Sat, May 11, 2019 at 6:05 AM Joel Fernandes (Google) joel@joelfernandes.org wrote:
The kheaders archive is exposed through SYSFS in /sys/kernel/. Make it depend on SYSFS as it makes no sense to enable this feature without it.
And, it also makes no sense to break the feature by 1/3, then fix it by 3/3.
Why don't you squash this?
I agree, this belongs in patch 1/3.
On Sat, May 11, 2019 at 08:02:03AM +0200, Greg Kroah-Hartman wrote:
On Sat, May 11, 2019 at 09:52:04AM +0900, Masahiro Yamada wrote:
On Sat, May 11, 2019 at 6:05 AM Joel Fernandes (Google) joel@joelfernandes.org wrote:
The kheaders archive is exposed through SYSFS in /sys/kernel/. Make it depend on SYSFS as it makes no sense to enable this feature without it.
And, it also makes no sense to break the feature by 1/3, then fix it by 3/3.
Why don't you squash this?
I agree, this belongs in patch 1/3.
Fine with me. The reason I split it this way is I already had posted 1/3 recently for the driver tree [1], and I did not want to confuse Greg since he was in the process of picking it up [2].
Anyway, I can resend the series soon with 1/3 and 3/3 squashed unless anyone applying this is Ok with squashing it in their trees. thanks!
[1] https://lore.kernel.org/patchwork/patch/1070005/ [2] https://lore.kernel.org/patchwork/patch/1070005/#1267273
thanks,
- Joel
linux-kselftest-mirror@lists.linaro.org