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

?
 


Reply via email to