Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b727e0a0 authored by Joel Fernandes (Google)'s avatar Joel Fernandes (Google) Committed by Joel Fernandes
Browse files

BACKPORT: 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



(cherry picked from commit f7b101d33046a837c2aa4526cef28a3c785d7af2)
Bug: 78013494
Suggested-by: default avatarSteven Rostedt <rostedt@goodmis.org>
Signed-off-by: default avatarJoel Fernandes (Google) <joel@joelfernandes.org>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>

Change-Id: I3bf86d0b0f2b73094c2ed29bfda1a57436f9d956
parent 3e6be4ff
Loading
Loading
Loading
Loading
+8 −9
Original line number Diff line number Diff line
@@ -575,15 +575,14 @@ 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"
	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,
	  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)"
+2 −2
Original line number Diff line number Diff line
@@ -76,7 +76,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
@@ -136,7 +136,7 @@ $(obj)/config_data.h: $(obj)/config_data.gz 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 = $(CONFIG_SHELL) $(srctree)/kernel/gen_kheaders.sh $@
$(obj)/kheaders_data.tar.xz: FORCE
	$(call cmd,genikh)

+1 −1
Original line number Diff line number Diff line
@@ -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/.."
+16 −24
Original line number Diff line number Diff line
@@ -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 -
	kheaders_attr.size = (&kernel_headers_data_end -
			      &kernel_headers_data);
	return 0;
	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);