On Tue Sep 1, 2026 at 9:57 AM PDT, Alan Maguire wrote: > Expose BTF inline-location information from vmlinux/module .BTF.inline > sections in /sys/kernel/btf using a ".inline" suffix. > > vmlinux inline BTF is split relative to vmlinux BTF and can be examined > with: > > bpftool btf dump file /sys/kernel/btf/vmlinux.inline > > Register the sysfs attribute only when the embedded .BTF.inline section > is non-empty. > > Module inline BTF is split relative to the module BTF, which in turn may > be split relative to its distilled base BTF. For example: > > bpftool btf dump -B /sys/kernel/btf/vmlinux -B /sys/kernel/btf/xfs \ > file /sys/kernel/btf/xfs.inline > > Copy the inline BTF data into a private buffer for its sysfs lifetime > and remove the attribute and buffer when the module is unloaded. > > Signed-off-by: Alan Maguire <[email protected]> > --- > include/linux/btf.h | 1 + > include/linux/module.h | 4 ++ > kernel/bpf/Makefile | 1 + > kernel/bpf/btf.c | 109 ++++++++++++++++++++++++++------ > kernel/bpf/btf_vmlinux_inline.c | 30 +++++++++ > kernel/module/main.c | 4 ++ > 6 files changed, 128 insertions(+), 21 deletions(-) > create mode 100644 kernel/bpf/btf_vmlinux_inline.c > > diff --git a/include/linux/btf.h b/include/linux/btf.h > index a4412bc16688..93f10d3ccabe 100644 > --- a/include/linux/btf.h > +++ b/include/linux/btf.h > @@ -617,6 +617,7 @@ int get_kern_ctx_btf_id(struct bpf_verifier_log *log, > enum bpf_prog_type prog_ty > bool btf_types_are_same(const struct btf *btf1, u32 id1, > const struct btf *btf2, u32 id2); > int btf_check_iter_arg(struct btf *btf, const struct btf_type *func, int > arg_idx); > +struct bin_attribute *sysfs_btf_add(const char *name, void *data, size_t > data_size); > > static inline bool btf_type_is_struct_ptr(struct btf *btf, const struct > btf_type *t) > { > diff --git a/include/linux/module.h b/include/linux/module.h > index 7566815fabbe..3d32c4e86f44 100644 > --- a/include/linux/module.h > +++ b/include/linux/module.h > @@ -507,6 +507,10 @@ struct module { > void *btf_data; > void *btf_base_data; > #endif > +#if IS_ENABLED(CONFIG_DEBUG_INFO_BTF_INLINE) > + unsigned int btf_inline_data_size; > + void *btf_inline_data; > +#endif > #ifdef CONFIG_JUMP_LABEL > struct jump_entry *jump_entries; > unsigned int num_jump_entries; > diff --git a/kernel/bpf/Makefile b/kernel/bpf/Makefile > index 9a92c348bbda..60aa5adb0354 100644 > --- a/kernel/bpf/Makefile > +++ b/kernel/bpf/Makefile > @@ -42,6 +42,7 @@ obj-$(CONFIG_BPF_SYSCALL) += reuseport_array.o > endif > ifeq ($(CONFIG_SYSFS),y) > obj-$(CONFIG_DEBUG_INFO_BTF) += sysfs_btf.o > +obj-$(CONFIG_DEBUG_INFO_BTF_INLINE) += btf_vmlinux_inline.o > endif > ifeq ($(CONFIG_BPF_JIT),y) > obj-$(CONFIG_BPF_SYSCALL) += bpf_struct_ops.o > diff --git a/kernel/bpf/btf.c b/kernel/bpf/btf.c > index d74c8668aa3f..3e5890aed2db 100644 > --- a/kernel/bpf/btf.c > +++ b/kernel/bpf/btf.c > @@ -8735,12 +8735,69 @@ enum { > BTF_MODULE_F_LIVE = (1 << 0), > }; > > +#if IS_ENABLED(CONFIG_SYSFS) > +struct bin_attribute *sysfs_btf_add(const char *name, void *data, size_t > data_size) > +{ > + struct bin_attribute *attr; > + int err; > + > + attr = kzalloc_obj(*attr); > + if (!attr) > + return ERR_PTR(-ENOMEM); > + > + sysfs_bin_attr_init(attr); > + attr->attr.mode = 0444; > + attr->size = data_size; > + attr->private = data; > + attr->read = sysfs_bin_attr_simple_read; > + attr->attr.name = kstrdup(name, GFP_KERNEL); > + if (!attr->attr.name) { > + err = -ENOMEM; > + goto err_free; > + } > + err = sysfs_create_bin_file(btf_kobj, attr); > + if (err) { > + pr_warn("failed to register [%s] BTF in sysfs: %d\n", name, > err); > + goto err_free; > + } > + return attr; > + > +err_free: > + kfree(attr->attr.name); > + kfree(attr); > + return ERR_PTR(err); > +} > + > +#else > +struct bin_attribute *sysfs_btf_add(const char *name, void *data, size_t > data_size) > +{ > + return NULL; > +} > +#endif
We do ifeq ($(CONFIG_SYSFS),y) obj-$(CONFIG_DEBUG_INFO_BTF) += sysfs_btf.o endif I would do the same here and avoid ifdef inside .c Also consider adding support for mmaping of vmlinux.inline from the start. It was useful for regular BTF. BTF.inline is bigger, so it will benefit more. Some of AI bug reports sound valid. Pls address and respin. Let's start landing it asap. pw-bot: cr
