Message ID | 20220118141327.34231-1-toke@redhat.com (mailing list archive) |
---|---|
State | Accepted |
Commit | eaa266d83a3730a15de2ceebcc89e8f6290e8cf6 |
Delegated to: | BPF |
Headers | show |
Series | [bpf] libbpf: define BTF_KIND_* constants in btf.h to avoid compilation errors | expand |
Context | Check | Description |
---|---|---|
netdev/tree_selection | success | Clearly marked for bpf |
netdev/fixes_present | success | Fixes tag present in non-next series |
netdev/subject_prefix | success | Link |
netdev/cover_letter | success | Single patches do not need cover letters |
netdev/patch_count | success | Link |
netdev/header_inline | success | No static functions without inline keyword in header files |
netdev/build_32bit | success | Errors and warnings before: 0 this patch: 0 |
netdev/cc_maintainers | success | CCed 10 of 10 maintainers |
netdev/build_clang | success | Errors and warnings before: 0 this patch: 0 |
netdev/module_param | success | Was 0 now: 0 |
netdev/verify_signedoff | success | Signed-off-by tag matches author and committer |
netdev/verify_fixes | success | Fixes tag looks correct |
netdev/build_allmodconfig_warn | success | Errors and warnings before: 0 this patch: 0 |
netdev/checkpatch | success | total: 0 errors, 0 warnings, 0 checks, 29 lines checked |
netdev/kdoc | success | Errors and warnings before: 12 this patch: 12 |
netdev/source_inline | success | Was 0 now: 0 |
bpf/vmtest-bpf-PR | success | PR summary |
bpf/vmtest-bpf | success | VM_Test |
Em Tue, Jan 18, 2022 at 03:13:27PM +0100, Toke Høiland-Jørgensen escreveu: > The btf.h header included with libbpf contains inline helper functions to > check for various BTF kinds. These helpers directly reference the > BTF_KIND_* constants defined in the kernel header, and because the header > file is included in user applications, this happens in the user application > compile units. > > This presents a problem if a user application is compiled on a system with > older kernel headers because the constants are not available. To avoid > this, add #defines of the constants directly in btf.h before using them. > > Since the kernel header moved to an enum for BTF_KIND_*, the #defines can > shadow the enum values without any errors, so we only need #ifndef guards > for the constants that predates the conversion to enum. We group these so > there's only one guard for groups of values that were added together. > > [0] Closes: https://github.com/libbpf/libbpf/issues/436 The coexistence of enums with the defines (in turn #ifndef guarded) as something I hadn't considered, clever. Should fix lots of build errors in my test containers :-) FWIW: Acked-by: Arnaldo Carvalho de Melo <acme@redhat.com> > Fixes: 223f903e9c83 ("bpf: Rename BTF_KIND_TAG to BTF_KIND_DECL_TAG") > Fixes: 5b84bd10363e ("libbpf: Add support for BTF_KIND_TAG") > Signed-off-by: Toke Høiland-Jørgensen <toke@redhat.com> > --- > tools/lib/bpf/btf.h | 22 +++++++++++++++++++++- > 1 file changed, 21 insertions(+), 1 deletion(-) > > diff --git a/tools/lib/bpf/btf.h b/tools/lib/bpf/btf.h > index 061839f04525..51862fdee850 100644 > --- a/tools/lib/bpf/btf.h > +++ b/tools/lib/bpf/btf.h > @@ -375,8 +375,28 @@ btf_dump__dump_type_data(struct btf_dump *d, __u32 id, > const struct btf_dump_type_data_opts *opts); > > /* > - * A set of helpers for easier BTF types handling > + * A set of helpers for easier BTF types handling. > + * > + * The inline functions below rely on constants from the kernel headers which > + * may not be available for applications including this header file. To avoid > + * compilation errors, we define all the constants here that were added after > + * the initial introduction of the BTF_KIND* constants. > */ > +#ifndef BTF_KIND_FUNC > +#define BTF_KIND_FUNC 12 /* Function */ > +#define BTF_KIND_FUNC_PROTO 13 /* Function Proto */ > +#endif > +#ifndef BTF_KIND_VAR > +#define BTF_KIND_VAR 14 /* Variable */ > +#define BTF_KIND_DATASEC 15 /* Section */ > +#endif > +#ifndef BTF_KIND_FLOAT > +#define BTF_KIND_FLOAT 16 /* Floating point */ > +#endif > +/* The kernel header switched to enums, so these two were never #defined */ > +#define BTF_KIND_DECL_TAG 17 /* Decl Tag */ > +#define BTF_KIND_TYPE_TAG 18 /* Type Tag */ > + > static inline __u16 btf_kind(const struct btf_type *t) > { > return BTF_INFO_KIND(t->info); > -- > 2.34.1
Arnaldo Carvalho de Melo <acme@kernel.org> writes: > Em Tue, Jan 18, 2022 at 03:13:27PM +0100, Toke Høiland-Jørgensen escreveu: >> The btf.h header included with libbpf contains inline helper functions to >> check for various BTF kinds. These helpers directly reference the >> BTF_KIND_* constants defined in the kernel header, and because the header >> file is included in user applications, this happens in the user application >> compile units. >> >> This presents a problem if a user application is compiled on a system with >> older kernel headers because the constants are not available. To avoid >> this, add #defines of the constants directly in btf.h before using them. >> >> Since the kernel header moved to an enum for BTF_KIND_*, the #defines can >> shadow the enum values without any errors, so we only need #ifndef guards >> for the constants that predates the conversion to enum. We group these so >> there's only one guard for groups of values that were added together. >> >> [0] Closes: https://github.com/libbpf/libbpf/issues/436 > > The coexistence of enums with the defines (in turn #ifndef guarded) as > something I hadn't considered, clever. Me neither - that bit was Andrii's idea :) > Should fix lots of build errors in my test containers :-) > > FWIW: > > Acked-by: Arnaldo Carvalho de Melo <acme@redhat.com> Thanks! -Toke
Hello: This patch was applied to bpf/bpf-next.git (master) by Andrii Nakryiko <andrii@kernel.org>: On Tue, 18 Jan 2022 15:13:27 +0100 you wrote: > The btf.h header included with libbpf contains inline helper functions to > check for various BTF kinds. These helpers directly reference the > BTF_KIND_* constants defined in the kernel header, and because the header > file is included in user applications, this happens in the user application > compile units. > > This presents a problem if a user application is compiled on a system with > older kernel headers because the constants are not available. To avoid > this, add #defines of the constants directly in btf.h before using them. > > [...] Here is the summary with links: - [bpf] libbpf: define BTF_KIND_* constants in btf.h to avoid compilation errors https://git.kernel.org/bpf/bpf-next/c/eaa266d83a37 You are awesome, thank you!
diff --git a/tools/lib/bpf/btf.h b/tools/lib/bpf/btf.h index 061839f04525..51862fdee850 100644 --- a/tools/lib/bpf/btf.h +++ b/tools/lib/bpf/btf.h @@ -375,8 +375,28 @@ btf_dump__dump_type_data(struct btf_dump *d, __u32 id, const struct btf_dump_type_data_opts *opts); /* - * A set of helpers for easier BTF types handling + * A set of helpers for easier BTF types handling. + * + * The inline functions below rely on constants from the kernel headers which + * may not be available for applications including this header file. To avoid + * compilation errors, we define all the constants here that were added after + * the initial introduction of the BTF_KIND* constants. */ +#ifndef BTF_KIND_FUNC +#define BTF_KIND_FUNC 12 /* Function */ +#define BTF_KIND_FUNC_PROTO 13 /* Function Proto */ +#endif +#ifndef BTF_KIND_VAR +#define BTF_KIND_VAR 14 /* Variable */ +#define BTF_KIND_DATASEC 15 /* Section */ +#endif +#ifndef BTF_KIND_FLOAT +#define BTF_KIND_FLOAT 16 /* Floating point */ +#endif +/* The kernel header switched to enums, so these two were never #defined */ +#define BTF_KIND_DECL_TAG 17 /* Decl Tag */ +#define BTF_KIND_TYPE_TAG 18 /* Type Tag */ + static inline __u16 btf_kind(const struct btf_type *t) { return BTF_INFO_KIND(t->info);
The btf.h header included with libbpf contains inline helper functions to check for various BTF kinds. These helpers directly reference the BTF_KIND_* constants defined in the kernel header, and because the header file is included in user applications, this happens in the user application compile units. This presents a problem if a user application is compiled on a system with older kernel headers because the constants are not available. To avoid this, add #defines of the constants directly in btf.h before using them. Since the kernel header moved to an enum for BTF_KIND_*, the #defines can shadow the enum values without any errors, so we only need #ifndef guards for the constants that predates the conversion to enum. We group these so there's only one guard for groups of values that were added together. [0] Closes: https://github.com/libbpf/libbpf/issues/436 Fixes: 223f903e9c83 ("bpf: Rename BTF_KIND_TAG to BTF_KIND_DECL_TAG") Fixes: 5b84bd10363e ("libbpf: Add support for BTF_KIND_TAG") Signed-off-by: Toke Høiland-Jørgensen <toke@redhat.com> --- tools/lib/bpf/btf.h | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-)