forked from mirrors/linux
		
	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:
		
							parent
							
								
									a188339ca5
								
							
						
					
					
						commit
						f7b101d330
					
				
					 4 changed files with 26 additions and 35 deletions
				
			
		
							
								
								
									
										15
									
								
								init/Kconfig
									
									
									
									
									
								
							
							
						
						
									
										15
									
								
								init/Kconfig
									
									
									
									
									
								
							| 
						 | 
				
			
			@ -579,15 +579,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
 | 
			
		||||
config IKHEADERS
 | 
			
		||||
	tristate "Enable kernel headers through /sys/kernel/kheaders.tar.xz"
 | 
			
		||||
	depends on SYSFS
 | 
			
		||||
	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.
 | 
			
		||||
	  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)"
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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 = $(CONFIG_SHELL) $(srctree)/kernel/gen_ikh_data.sh $@
 | 
			
		||||
cmd_genikh = $(CONFIG_SHELL) $(srctree)/kernel/gen_kheaders.sh $@
 | 
			
		||||
$(obj)/kheaders_data.tar.xz: FORCE
 | 
			
		||||
	$(call cmd,genikh)
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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/.."
 | 
			
		||||
| 
						 | 
				
			
			@ -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);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue