kheaders: Move from proc to sysfs

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>
Signed-off-by: Joel Fernandes (Google) <joel@joelfernandes.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
Joel Fernandes (Google) 2019-05-15 17:35:51 -04:00 committed by Greg Kroah-Hartman
parent a188339ca5
commit f7b101d330
4 changed files with 26 additions and 35 deletions

View File

@ -579,15 +579,14 @@ config IKCONFIG_PROC
This option enables access to the kernel configuration file This option enables access to the kernel configuration file
through /proc/config.gz. through /proc/config.gz.
config IKHEADERS_PROC config IKHEADERS
tristate "Enable kernel header artifacts through /proc/kheaders.tar.xz" tristate "Enable kernel headers through /sys/kernel/kheaders.tar.xz"
depends on PROC_FS depends on SYSFS
help help
This option enables access to the kernel header and other artifacts that This option enables access to the in-kernel headers that are generated during
are generated during the build process. These can be used to build eBPF the build process. These can be used to build eBPF tracing programs,
tracing programs, or similar programs. If you build the headers as a or similar programs. If you build the headers as a module, a module called
module, a module called kheaders.ko is built which can be loaded on-demand kheaders.ko is built which can be loaded on-demand to get access to headers.
to get access to the headers.
config LOG_BUF_SHIFT config LOG_BUF_SHIFT
int "Kernel log buffer size (16 => 64KB, 17 => 128KB)" int "Kernel log buffer size (16 => 64KB, 17 => 128KB)"

View File

@ -71,7 +71,7 @@ obj-$(CONFIG_UTS_NS) += utsname.o
obj-$(CONFIG_USER_NS) += user_namespace.o obj-$(CONFIG_USER_NS) += user_namespace.o
obj-$(CONFIG_PID_NS) += pid_namespace.o obj-$(CONFIG_PID_NS) += pid_namespace.o
obj-$(CONFIG_IKCONFIG) += configs.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_SMP) += stop_machine.o
obj-$(CONFIG_KPROBES_SANITY_TEST) += test_kprobes.o obj-$(CONFIG_KPROBES_SANITY_TEST) += test_kprobes.o
obj-$(CONFIG_AUDIT) += audit.o auditfilter.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 $(obj)/kheaders.o: $(obj)/kheaders_data.tar.xz
quiet_cmd_genikh = CHK $(obj)/kheaders_data.tar.xz quiet_cmd_genikh = CHK $(obj)/kheaders_data.tar.xz
cmd_genikh = $(CONFIG_SHELL) $(srctree)/kernel/gen_ikh_data.sh $@ cmd_genikh = $(CONFIG_SHELL) $(srctree)/kernel/gen_kheaders.sh $@
$(obj)/kheaders_data.tar.xz: FORCE $(obj)/kheaders_data.tar.xz: FORCE
$(call cmd,genikh) $(call cmd,genikh)

View File

@ -2,7 +2,7 @@
# SPDX-License-Identifier: GPL-2.0 # SPDX-License-Identifier: GPL-2.0
# This script generates an archive consisting of kernel headers # This script generates an archive consisting of kernel headers
# for CONFIG_IKHEADERS_PROC. # for CONFIG_IKHEADERS.
set -e set -e
spath="$(dirname "$(readlink -f "$0")")" spath="$(dirname "$(readlink -f "$0")")"
kroot="$spath/.." kroot="$spath/.."

View File

@ -8,9 +8,8 @@
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/proc_fs.h> #include <linux/kobject.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/uaccess.h>
/* /*
* Define kernel_headers_data and kernel_headers_data_end, within which the * 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; extern char kernel_headers_data_end;
static ssize_t static ssize_t
ikheaders_read_current(struct file *file, char __user *buf, ikheaders_read(struct file *file, struct kobject *kobj,
size_t len, loff_t *offset) struct bin_attribute *bin_attr,
char *buf, loff_t off, size_t len)
{ {
return simple_read_from_buffer(buf, len, offset, memcpy(buf, &kernel_headers_data + off, len);
&kernel_headers_data, return len;
&kernel_headers_data_end -
&kernel_headers_data);
} }
static const struct file_operations ikheaders_file_ops = { static struct bin_attribute kheaders_attr __ro_after_init = {
.read = ikheaders_read_current, .attr = {
.llseek = default_llseek, .name = "kheaders.tar.xz",
.mode = 0444,
},
.read = &ikheaders_read,
}; };
static int __init ikheaders_init(void) static int __init ikheaders_init(void)
{ {
struct proc_dir_entry *entry; kheaders_attr.size = (&kernel_headers_data_end -
/* 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); &kernel_headers_data);
return 0; return sysfs_create_bin_file(kernel_kobj, &kheaders_attr);
} }
static void __exit ikheaders_cleanup(void) 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); module_init(ikheaders_init);