Re: [PATCH bpf-next 1/2] btf: allow mmap of vmlinux btf

2025-05-02 Thread Lorenz Bauer
On Thu, May 1, 2025 at 9:26 PM Alexei Starovoitov
 wrote:
> > +
> > +   return vm_iomap_memory(vma, virt_to_phys(__start_BTF), btf_size);
>
> and this one should probably be vm_insert_pages().
> Since it's not an IO area.

FYI I went with open coding with remap_pfn_range since that allows me
to avoid struct page.

Lorenz



Re: [PATCH bpf-next 1/2] btf: allow mmap of vmlinux btf

2025-05-01 Thread Alexei Starovoitov
On Thu, May 1, 2025 at 7:28 AM Lorenz Bauer  wrote:
>
> User space needs access to kernel BTF for many modern features of BPF.
> Right now each process needs to read the BTF blob either in pieces or
> as a whole. Allow mmaping the sysfs file so that processes can directly
> access the memory allocated for it in the kernel.
>
> Signed-off-by: Lorenz Bauer 
> ---
>  include/asm-generic/vmlinux.lds.h |  3 ++-
>  kernel/bpf/sysfs_btf.c| 25 +++--
>  2 files changed, 25 insertions(+), 3 deletions(-)
>
> diff --git a/include/asm-generic/vmlinux.lds.h 
> b/include/asm-generic/vmlinux.lds.h
> index 
> 58a635a6d5bdf0c53c267c2a3d21a5ed8678ce73..1750390735fac7637cc4d2fa05f96cb2a36aa448
>  100644
> --- a/include/asm-generic/vmlinux.lds.h
> +++ b/include/asm-generic/vmlinux.lds.h
> @@ -667,10 +667,11 @@ defined(CONFIG_AUTOFDO_CLANG) || 
> defined(CONFIG_PROPELLER_CLANG)
>   */
>  #ifdef CONFIG_DEBUG_INFO_BTF
>  #define BTF\
> +   . = ALIGN(PAGE_SIZE);   \
> .BTF : AT(ADDR(.BTF) - LOAD_OFFSET) {   \
> BOUNDED_SECTION_BY(.BTF, _BTF)  \
> }   \
> -   . = ALIGN(4);   \
> +   . = ALIGN(PAGE_SIZE);   \
> .BTF_ids : AT(ADDR(.BTF_ids) - LOAD_OFFSET) {   \
> *(.BTF_ids) \
> }
> diff --git a/kernel/bpf/sysfs_btf.c b/kernel/bpf/sysfs_btf.c
> index 
> 81d6cf90584a7157929c50f62a5c6862e7a3d081..7651f37b82c78b8afd96078567a5b6612f5f4d97
>  100644
> --- a/kernel/bpf/sysfs_btf.c
> +++ b/kernel/bpf/sysfs_btf.c
> @@ -7,18 +7,39 @@
>  #include 
>  #include 
>  #include 
> +#include 
> +#include 
>
>  /* See scripts/link-vmlinux.sh, gen_btf() func for details */
>  extern char __start_BTF[];
>  extern char __stop_BTF[];
>
> +struct kobject *btf_kobj;
> +
> +static int btf_vmlinux_mmap(struct file *filp, struct kobject *kobj,
> +   const struct bin_attribute *attr,
> +   struct vm_area_struct *vma)
> +{
> +   size_t btf_size = __stop_BTF - __start_BTF;
> +
> +   if (kobj != btf_kobj)
> +   return -EINVAL;
> +
> +   if (vma->vm_flags & (VM_WRITE|VM_EXEC|VM_MAYSHARE))
> +   return -EACCES;
> +
> +   vm_flags_clear(vma, VM_MAYEXEC);
> +   vm_flags_clear(vma, VM_MAYWRITE);

Probably should set VM_DONTDUMP to avoid being in the core dump.
vm_flags_mod() can set and clear in one operation.

> +
> +   return vm_iomap_memory(vma, virt_to_phys(__start_BTF), btf_size);

and this one should probably be vm_insert_pages().
Since it's not an IO area.

Overall I think it's a good idea.
As Daniel suggested pls make use of it in libbpf too.
That exercise will make sure that feature probing works
with fallback.

pw-bot: cr



[PATCH bpf-next 1/2] btf: allow mmap of vmlinux btf

2025-05-01 Thread Lorenz Bauer
User space needs access to kernel BTF for many modern features of BPF.
Right now each process needs to read the BTF blob either in pieces or
as a whole. Allow mmaping the sysfs file so that processes can directly
access the memory allocated for it in the kernel.

Signed-off-by: Lorenz Bauer 
---
 include/asm-generic/vmlinux.lds.h |  3 ++-
 kernel/bpf/sysfs_btf.c| 25 +++--
 2 files changed, 25 insertions(+), 3 deletions(-)

diff --git a/include/asm-generic/vmlinux.lds.h 
b/include/asm-generic/vmlinux.lds.h
index 
58a635a6d5bdf0c53c267c2a3d21a5ed8678ce73..1750390735fac7637cc4d2fa05f96cb2a36aa448
 100644
--- a/include/asm-generic/vmlinux.lds.h
+++ b/include/asm-generic/vmlinux.lds.h
@@ -667,10 +667,11 @@ defined(CONFIG_AUTOFDO_CLANG) || 
defined(CONFIG_PROPELLER_CLANG)
  */
 #ifdef CONFIG_DEBUG_INFO_BTF
 #define BTF\
+   . = ALIGN(PAGE_SIZE);   \
.BTF : AT(ADDR(.BTF) - LOAD_OFFSET) {   \
BOUNDED_SECTION_BY(.BTF, _BTF)  \
}   \
-   . = ALIGN(4);   \
+   . = ALIGN(PAGE_SIZE);   \
.BTF_ids : AT(ADDR(.BTF_ids) - LOAD_OFFSET) {   \
*(.BTF_ids) \
}
diff --git a/kernel/bpf/sysfs_btf.c b/kernel/bpf/sysfs_btf.c
index 
81d6cf90584a7157929c50f62a5c6862e7a3d081..7651f37b82c78b8afd96078567a5b6612f5f4d97
 100644
--- a/kernel/bpf/sysfs_btf.c
+++ b/kernel/bpf/sysfs_btf.c
@@ -7,18 +7,39 @@
 #include 
 #include 
 #include 
+#include 
+#include 
 
 /* See scripts/link-vmlinux.sh, gen_btf() func for details */
 extern char __start_BTF[];
 extern char __stop_BTF[];
 
+struct kobject *btf_kobj;
+
+static int btf_vmlinux_mmap(struct file *filp, struct kobject *kobj,
+   const struct bin_attribute *attr,
+   struct vm_area_struct *vma)
+{
+   size_t btf_size = __stop_BTF - __start_BTF;
+
+   if (kobj != btf_kobj)
+   return -EINVAL;
+
+   if (vma->vm_flags & (VM_WRITE|VM_EXEC|VM_MAYSHARE))
+   return -EACCES;
+
+   vm_flags_clear(vma, VM_MAYEXEC);
+   vm_flags_clear(vma, VM_MAYWRITE);
+
+   return vm_iomap_memory(vma, virt_to_phys(__start_BTF), btf_size);
+}
+
 static struct bin_attribute bin_attr_btf_vmlinux __ro_after_init = {
.attr = { .name = "vmlinux", .mode = 0444, },
.read_new = sysfs_bin_attr_simple_read,
+   .mmap = btf_vmlinux_mmap,
 };
 
-struct kobject *btf_kobj;
-
 static int __init btf_vmlinux_init(void)
 {
bin_attr_btf_vmlinux.private = __start_BTF;

-- 
2.49.0