On 07/09/2026 20:34, Alexei Starovoitov wrote: > 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 >
Will do. > 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. > Definitely, good idea. > Some of AI bug reports sound valid. Pls address and respin. > Let's start landing it asap. > Sure; what do you think about splitting into 2 series, with pahole support landing once the first series does (so we have libbpf support for the inline APIs)? patches 1-11: support for inline info across UAPI, kernel, libbpf, bpftool and tests patches 12- 18 kbuild support, sysfs availability ?
