Message ID | 20201106222512.52454-2-jolsa@kernel.org (mailing list archive) |
---|---|
State | Not Applicable |
Delegated to: | BPF |
Headers | show |
Series | pahole/kernel: Workaround dwarf bug for function encoding | expand |
Em Fri, Nov 06, 2020 at 11:25:10PM +0100, Jiri Olsa escreveu: > With upcoming changes to pahole, that change the way how and > which kernel functions are stored in BTF data, we need a way > to recognize iterator functions. > > Iterator functions need to be in BTF data, but have no real > body and are currently placed in .init.text section, so they > are freed after kernel init and are filtered out of BTF data > because of that. > > The solution is to place these functions under new section: > .init.bpf.preserve_type > > And add 2 new symbols to mark that area: > __init_bpf_preserve_type_begin > __init_bpf_preserve_type_end > > The code in pahole responsible for picking up the functions will > be able to recognize functions from this section and add them to > the BTF data and filter out all other .init.text functions. This isn't applying on torvalds/master: [acme@five linux]$ patch -p1 < /wb/1.patch patching file include/asm-generic/vmlinux.lds.h Hunk #2 succeeded at 754 (offset 1 line). patching file include/linux/bpf.h Hunk #1 succeeded at 1276 (offset -1 lines). patching file include/linux/init.h Hunk #1 FAILED at 52. 1 out of 1 hunk FAILED -- saving rejects to file include/linux/init.h.rej [acme@five linux]$ [acme@five linux]$ cat include/linux/init.h.rej --- include/linux/init.h +++ include/linux/init.h @@ -52,6 +52,7 @@ #define __initconst __section(.init.rodata) #define __exitdata __section(.exit.data) #define __exit_call __used __section(.exitcall.exit) +#define __init_bpf_preserve_type __section(.init.bpf.preserve_type) /* * modpost check for section mismatches during the kernel build. [acme@five linux]$ I'm fixing it up by hand to try together with pahole's patches. - Arnaldo > Suggested-by: Yonghong Song <yhs@fb.com> > Acked-by: Song Liu <songliubraving@fb.com> > Signed-off-by: Jiri Olsa <jolsa@redhat.com> > --- > include/asm-generic/vmlinux.lds.h | 16 +++++++++++++++- > include/linux/bpf.h | 8 +++++++- > include/linux/init.h | 1 + > 3 files changed, 23 insertions(+), 2 deletions(-) > > diff --git a/include/asm-generic/vmlinux.lds.h b/include/asm-generic/vmlinux.lds.h > index cd14444bf600..e18e1030dabf 100644 > --- a/include/asm-generic/vmlinux.lds.h > +++ b/include/asm-generic/vmlinux.lds.h > @@ -685,8 +685,21 @@ > .BTF_ids : AT(ADDR(.BTF_ids) - LOAD_OFFSET) { \ > *(.BTF_ids) \ > } > + > +/* > + * .init.bpf.preserve_type > + * > + * This section store special BPF function and marks them > + * with begin/end symbols pair for the sake of pahole tool. > + */ > +#define INIT_BPF_PRESERVE_TYPE \ > + __init_bpf_preserve_type_begin = .; \ > + *(.init.bpf.preserve_type) \ > + __init_bpf_preserve_type_end = .; \ > + MEM_DISCARD(init.bpf.preserve_type) > #else > #define BTF > +#define INIT_BPF_PRESERVE_TYPE > #endif > > /* > @@ -740,7 +753,8 @@ > #define INIT_TEXT \ > *(.init.text .init.text.*) \ > *(.text.startup) \ > - MEM_DISCARD(init.text*) > + MEM_DISCARD(init.text*) \ > + INIT_BPF_PRESERVE_TYPE > > #define EXIT_DATA \ > *(.exit.data .exit.data.*) \ > diff --git a/include/linux/bpf.h b/include/linux/bpf.h > index 73d5381a5d5c..894f66c7703e 100644 > --- a/include/linux/bpf.h > +++ b/include/linux/bpf.h > @@ -1277,10 +1277,16 @@ struct bpf_link *bpf_link_get_from_fd(u32 ufd); > int bpf_obj_pin_user(u32 ufd, const char __user *pathname); > int bpf_obj_get_user(const char __user *pathname, int flags); > > +#ifdef CONFIG_DEBUG_INFO_BTF > +#define BPF_INIT __init_bpf_preserve_type > +#else > +#define BPF_INIT __init > +#endif > + > #define BPF_ITER_FUNC_PREFIX "bpf_iter_" > #define DEFINE_BPF_ITER_FUNC(target, args...) \ > extern int bpf_iter_ ## target(args); \ > - int __init bpf_iter_ ## target(args) { return 0; } > + int BPF_INIT bpf_iter_ ## target(args) { return 0; } > > struct bpf_iter_aux_info { > struct bpf_map *map; > diff --git a/include/linux/init.h b/include/linux/init.h > index 212fc9e2f691..133462863711 100644 > --- a/include/linux/init.h > +++ b/include/linux/init.h > @@ -52,6 +52,7 @@ > #define __initconst __section(.init.rodata) > #define __exitdata __section(.exit.data) > #define __exit_call __used __section(.exitcall.exit) > +#define __init_bpf_preserve_type __section(.init.bpf.preserve_type) > > /* > * modpost check for section mismatches during the kernel build. > -- > 2.26.2 >
Em Mon, Nov 09, 2020 at 03:05:00PM -0300, Arnaldo Carvalho de Melo escreveu: > Em Fri, Nov 06, 2020 at 11:25:10PM +0100, Jiri Olsa escreveu: > > With upcoming changes to pahole, that change the way how and > > which kernel functions are stored in BTF data, we need a way > > to recognize iterator functions. > > > > Iterator functions need to be in BTF data, but have no real > > body and are currently placed in .init.text section, so they > > are freed after kernel init and are filtered out of BTF data > > because of that. > > > > The solution is to place these functions under new section: > > .init.bpf.preserve_type > > > > And add 2 new symbols to mark that area: > > __init_bpf_preserve_type_begin > > __init_bpf_preserve_type_end > > > > The code in pahole responsible for picking up the functions will > > be able to recognize functions from this section and add them to > > the BTF data and filter out all other .init.text functions. > > This isn't applying on torvalds/master: > > [acme@five linux]$ patch -p1 < /wb/1.patch > patching file include/asm-generic/vmlinux.lds.h > Hunk #2 succeeded at 754 (offset 1 line). > patching file include/linux/bpf.h > Hunk #1 succeeded at 1276 (offset -1 lines). > patching file include/linux/init.h > Hunk #1 FAILED at 52. > 1 out of 1 hunk FAILED -- saving rejects to file include/linux/init.h.rej > [acme@five linux]$ > [acme@five linux]$ cat include/linux/init.h.rej > --- include/linux/init.h > +++ include/linux/init.h > @@ -52,6 +52,7 @@ > #define __initconst __section(.init.rodata) > #define __exitdata __section(.exit.data) > #define __exit_call __used __section(.exitcall.exit) > +#define __init_bpf_preserve_type __section(.init.bpf.preserve_type) > > /* > * modpost check for section mismatches during the kernel build. > [acme@five linux]$ > > > I'm fixing it up by hand to try together with pahole's patches. Due to: 33def8498fdde180 ("treewide: Convert macro and uses of __section(foo) to __section("foo")") I'm using this now: diff --git a/include/linux/init.h b/include/linux/init.h index 7b53cb3092ee9956..a7c71e3b5f9a1d65 100644 --- a/include/linux/init.h +++ b/include/linux/init.h @@ -52,6 +52,7 @@ #define __initconst __section(".init.rodata") #define __exitdata __section(".exit.data") #define __exit_call __used __section(".exitcall.exit") +#define __init_bpf_preserve_type __section(".init.bpf.preserve_type") /* * modpost check for section mismatches during the kernel build.
Em Mon, Nov 09, 2020 at 03:06:55PM -0300, Arnaldo Carvalho de Melo escreveu: > > I'm fixing it up by hand to try together with pahole's patches. > Due to: > 33def8498fdde180 ("treewide: Convert macro and uses of __section(foo) to __section("foo")") > For convenience: asm-generic/vmlinux.lds.h | 16 +++++++++++++++- linux/bpf.h | 8 +++++++- linux/init.h | 1 + 3 files changed, 23 insertions(+), 2 deletions(-) --- diff --git a/include/asm-generic/vmlinux.lds.h b/include/asm-generic/vmlinux.lds.h index b2b3d81b1535a5ab..f91029b3443bf0d2 100644 --- a/include/asm-generic/vmlinux.lds.h +++ b/include/asm-generic/vmlinux.lds.h @@ -685,8 +685,21 @@ .BTF_ids : AT(ADDR(.BTF_ids) - LOAD_OFFSET) { \ *(.BTF_ids) \ } + +/* + * .init.bpf.preserve_type + * + * This section store special BPF function and marks them + * with begin/end symbols pair for the sake of pahole tool. + */ +#define INIT_BPF_PRESERVE_TYPE \ + __init_bpf_preserve_type_begin = .; \ + *(.init.bpf.preserve_type) \ + __init_bpf_preserve_type_end = .; \ + MEM_DISCARD(init.bpf.preserve_type) #else #define BTF +#define INIT_BPF_PRESERVE_TYPE #endif /* @@ -741,7 +754,8 @@ #define INIT_TEXT \ *(.init.text .init.text.*) \ *(.text.startup) \ - MEM_DISCARD(init.text*) + MEM_DISCARD(init.text*) \ + INIT_BPF_PRESERVE_TYPE #define EXIT_DATA \ *(.exit.data .exit.data.*) \ diff --git a/include/linux/bpf.h b/include/linux/bpf.h index 2b16bf48aab61a1f..73e8ededde3e9c09 100644 --- a/include/linux/bpf.h +++ b/include/linux/bpf.h @@ -1276,10 +1276,16 @@ struct bpf_link *bpf_link_get_from_fd(u32 ufd); int bpf_obj_pin_user(u32 ufd, const char __user *pathname); int bpf_obj_get_user(const char __user *pathname, int flags); +#ifdef CONFIG_DEBUG_INFO_BTF +#define BPF_INIT __init_bpf_preserve_type +#else +#define BPF_INIT __init +#endif + #define BPF_ITER_FUNC_PREFIX "bpf_iter_" #define DEFINE_BPF_ITER_FUNC(target, args...) \ extern int bpf_iter_ ## target(args); \ - int __init bpf_iter_ ## target(args) { return 0; } + int BPF_INIT bpf_iter_ ## target(args) { return 0; } struct bpf_iter_aux_info { struct bpf_map *map; diff --git a/include/linux/init.h b/include/linux/init.h index 7b53cb3092ee9956..a7c71e3b5f9a1d65 100644 --- a/include/linux/init.h +++ b/include/linux/init.h @@ -52,6 +52,7 @@ #define __initconst __section(".init.rodata") #define __exitdata __section(".exit.data") #define __exit_call __used __section(".exitcall.exit") +#define __init_bpf_preserve_type __section(".init.bpf.preserve_type") /* * modpost check for section mismatches during the kernel build.
On Mon, Nov 09, 2020 at 03:06:55PM -0300, Arnaldo Carvalho de Melo wrote: > Em Mon, Nov 09, 2020 at 03:05:00PM -0300, Arnaldo Carvalho de Melo escreveu: > > Em Fri, Nov 06, 2020 at 11:25:10PM +0100, Jiri Olsa escreveu: > > > With upcoming changes to pahole, that change the way how and > > > which kernel functions are stored in BTF data, we need a way > > > to recognize iterator functions. > > > > > > Iterator functions need to be in BTF data, but have no real > > > body and are currently placed in .init.text section, so they > > > are freed after kernel init and are filtered out of BTF data > > > because of that. > > > > > > The solution is to place these functions under new section: > > > .init.bpf.preserve_type > > > > > > And add 2 new symbols to mark that area: > > > __init_bpf_preserve_type_begin > > > __init_bpf_preserve_type_end > > > > > > The code in pahole responsible for picking up the functions will > > > be able to recognize functions from this section and add them to > > > the BTF data and filter out all other .init.text functions. > > > > This isn't applying on torvalds/master: > > > > [acme@five linux]$ patch -p1 < /wb/1.patch > > patching file include/asm-generic/vmlinux.lds.h > > Hunk #2 succeeded at 754 (offset 1 line). > > patching file include/linux/bpf.h > > Hunk #1 succeeded at 1276 (offset -1 lines). > > patching file include/linux/init.h > > Hunk #1 FAILED at 52. > > 1 out of 1 hunk FAILED -- saving rejects to file include/linux/init.h.rej > > [acme@five linux]$ > > [acme@five linux]$ cat include/linux/init.h.rej > > --- include/linux/init.h > > +++ include/linux/init.h > > @@ -52,6 +52,7 @@ > > #define __initconst __section(.init.rodata) > > #define __exitdata __section(.exit.data) > > #define __exit_call __used __section(.exitcall.exit) > > +#define __init_bpf_preserve_type __section(.init.bpf.preserve_type) > > > > /* > > * modpost check for section mismatches during the kernel build. > > [acme@five linux]$ > > > > > > I'm fixing it up by hand to try together with pahole's patches. > > Due to: > > 33def8498fdde180 ("treewide: Convert macro and uses of __section(foo) to __section("foo")") ok, I'll send new version for the kernel patch thanks, jirka
diff --git a/include/asm-generic/vmlinux.lds.h b/include/asm-generic/vmlinux.lds.h index cd14444bf600..e18e1030dabf 100644 --- a/include/asm-generic/vmlinux.lds.h +++ b/include/asm-generic/vmlinux.lds.h @@ -685,8 +685,21 @@ .BTF_ids : AT(ADDR(.BTF_ids) - LOAD_OFFSET) { \ *(.BTF_ids) \ } + +/* + * .init.bpf.preserve_type + * + * This section store special BPF function and marks them + * with begin/end symbols pair for the sake of pahole tool. + */ +#define INIT_BPF_PRESERVE_TYPE \ + __init_bpf_preserve_type_begin = .; \ + *(.init.bpf.preserve_type) \ + __init_bpf_preserve_type_end = .; \ + MEM_DISCARD(init.bpf.preserve_type) #else #define BTF +#define INIT_BPF_PRESERVE_TYPE #endif /* @@ -740,7 +753,8 @@ #define INIT_TEXT \ *(.init.text .init.text.*) \ *(.text.startup) \ - MEM_DISCARD(init.text*) + MEM_DISCARD(init.text*) \ + INIT_BPF_PRESERVE_TYPE #define EXIT_DATA \ *(.exit.data .exit.data.*) \ diff --git a/include/linux/bpf.h b/include/linux/bpf.h index 73d5381a5d5c..894f66c7703e 100644 --- a/include/linux/bpf.h +++ b/include/linux/bpf.h @@ -1277,10 +1277,16 @@ struct bpf_link *bpf_link_get_from_fd(u32 ufd); int bpf_obj_pin_user(u32 ufd, const char __user *pathname); int bpf_obj_get_user(const char __user *pathname, int flags); +#ifdef CONFIG_DEBUG_INFO_BTF +#define BPF_INIT __init_bpf_preserve_type +#else +#define BPF_INIT __init +#endif + #define BPF_ITER_FUNC_PREFIX "bpf_iter_" #define DEFINE_BPF_ITER_FUNC(target, args...) \ extern int bpf_iter_ ## target(args); \ - int __init bpf_iter_ ## target(args) { return 0; } + int BPF_INIT bpf_iter_ ## target(args) { return 0; } struct bpf_iter_aux_info { struct bpf_map *map; diff --git a/include/linux/init.h b/include/linux/init.h index 212fc9e2f691..133462863711 100644 --- a/include/linux/init.h +++ b/include/linux/init.h @@ -52,6 +52,7 @@ #define __initconst __section(.init.rodata) #define __exitdata __section(.exit.data) #define __exit_call __used __section(.exitcall.exit) +#define __init_bpf_preserve_type __section(.init.bpf.preserve_type) /* * modpost check for section mismatches during the kernel build.