diff mbox series

[net,v2] bpf: Fix build when CONFIG_BPF_SYSCALL is disabled

Message ID 20211110205418.332403-1-vinicius.gomes@intel.com (mailing list archive)
State Changes Requested
Delegated to: BPF
Headers show
Series [net,v2] bpf: Fix build when CONFIG_BPF_SYSCALL is disabled | expand

Checks

Context Check Description
netdev/tree_selection success Clearly marked for net
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: 17 this patch: 17
netdev/cc_maintainers warning 2 maintainers not CCed: kpsingh@kernel.org john.fastabend@gmail.com
netdev/build_clang success Errors and warnings before: 22 this patch: 22
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: 21 this patch: 21
netdev/checkpatch warning CHECK: struct mutex definition without comment
netdev/kdoc success Errors and warnings before: 0 this patch: 0
netdev/source_inline success Was 0 now: 0
bpf/vmtest-bpf-next-PR fail PR summary
bpf/vmtest-bpf-next fail VM_Test
bpf/vmtest-bpf fail VM_Test
bpf/vmtest-bpf-PR fail PR summary

Commit Message

Vinicius Costa Gomes Nov. 10, 2021, 8:54 p.m. UTC
When CONFIG_DEBUG_INFO_BTF is enabled and CONFIG_BPF_SYSCALL is
disabled, the following compilation error can be seen:

  GEN     .version
  CHK     include/generated/compile.h
  UPD     include/generated/compile.h
  CC      init/version.o
  AR      init/built-in.a
  LD      vmlinux.o
  MODPOST vmlinux.symvers
  MODINFO modules.builtin.modinfo
  GEN     modules.builtin
  LD      .tmp_vmlinux.btf
ld: net/ipv4/tcp_cubic.o: in function `cubictcp_unregister':
net/ipv4/tcp_cubic.c:545: undefined reference to `bpf_tcp_ca_kfunc_list'
ld: net/ipv4/tcp_cubic.c:545: undefined reference to `unregister_kfunc_btf_id_set'
ld: net/ipv4/tcp_cubic.o: in function `cubictcp_register':
net/ipv4/tcp_cubic.c:539: undefined reference to `bpf_tcp_ca_kfunc_list'
ld: net/ipv4/tcp_cubic.c:539: undefined reference to `register_kfunc_btf_id_set'
  BTF     .btf.vmlinux.bin.o
pahole: .tmp_vmlinux.btf: No such file or directory
  LD      .tmp_vmlinux.kallsyms1
.btf.vmlinux.bin.o: file not recognized: file format not recognized
make: *** [Makefile:1187: vmlinux] Error 1

'bpf_tcp_ca_kfunc_list', 'register_kfunc_btf_id_set()' and
'unregister_kfunc_btf_id_set()' are only defined when
CONFIG_BPF_SYSCALL is enabled.

Fix that by moving those definitions somewhere that doesn't depend on
the bpf() syscall.

Fixes: 14f267d95fe4 ("bpf: btf: Introduce helpers for dynamic BTF set registration")
Signed-off-by: Vinicius Costa Gomes <vinicius.gomes@intel.com>
---
 kernel/bpf/btf.c  | 33 ---------------------------------
 kernel/bpf/core.c | 37 +++++++++++++++++++++++++++++++++++++
 2 files changed, 37 insertions(+), 33 deletions(-)

Comments

Kumar Kartikeya Dwivedi Nov. 10, 2021, 9:25 p.m. UTC | #1
On Thu, Nov 11, 2021 at 02:24:18AM IST, Vinicius Costa Gomes wrote:
> When CONFIG_DEBUG_INFO_BTF is enabled and CONFIG_BPF_SYSCALL is
> disabled, the following compilation error can be seen:
>
>   GEN     .version
>   CHK     include/generated/compile.h
>   UPD     include/generated/compile.h
>   CC      init/version.o
>   AR      init/built-in.a
>   LD      vmlinux.o
>   MODPOST vmlinux.symvers
>   MODINFO modules.builtin.modinfo
>   GEN     modules.builtin
>   LD      .tmp_vmlinux.btf
> ld: net/ipv4/tcp_cubic.o: in function `cubictcp_unregister':
> net/ipv4/tcp_cubic.c:545: undefined reference to `bpf_tcp_ca_kfunc_list'
> ld: net/ipv4/tcp_cubic.c:545: undefined reference to `unregister_kfunc_btf_id_set'
> ld: net/ipv4/tcp_cubic.o: in function `cubictcp_register':
> net/ipv4/tcp_cubic.c:539: undefined reference to `bpf_tcp_ca_kfunc_list'
> ld: net/ipv4/tcp_cubic.c:539: undefined reference to `register_kfunc_btf_id_set'
>   BTF     .btf.vmlinux.bin.o
> pahole: .tmp_vmlinux.btf: No such file or directory
>   LD      .tmp_vmlinux.kallsyms1
> .btf.vmlinux.bin.o: file not recognized: file format not recognized
> make: *** [Makefile:1187: vmlinux] Error 1
>
> 'bpf_tcp_ca_kfunc_list', 'register_kfunc_btf_id_set()' and
> 'unregister_kfunc_btf_id_set()' are only defined when
> CONFIG_BPF_SYSCALL is enabled.
>
> Fix that by moving those definitions somewhere that doesn't depend on
> the bpf() syscall.
>
> Fixes: 14f267d95fe4 ("bpf: btf: Introduce helpers for dynamic BTF set registration")
> Signed-off-by: Vinicius Costa Gomes <vinicius.gomes@intel.com>

Thanks for the fix.

But instead of moving this to core.c, you can probably make the btf.h
declaration conditional on CONFIG_BPF_SYSCALL, since this is not useful in
isolation (only used by verifier for module kfunc support). For the case of
kfunc_btf_id_list variables, just define it as an empty struct and static
variables, since the definition is still inside btf.c. So it becomes a noop for
!CONFIG_BPF_SYSCALL.

I am also not sure whether BTF is useful without BPF support, but maybe I'm
missing some usecase.

That's just my opinion however, I'll defer to BPF maintainers.

--
Kartikeya
Alexei Starovoitov Nov. 10, 2021, 9:59 p.m. UTC | #2
On Wed, Nov 10, 2021 at 1:25 PM Kumar Kartikeya Dwivedi
<memxor@gmail.com> wrote:
>
> On Thu, Nov 11, 2021 at 02:24:18AM IST, Vinicius Costa Gomes wrote:
> > When CONFIG_DEBUG_INFO_BTF is enabled and CONFIG_BPF_SYSCALL is
> > disabled, the following compilation error can be seen:
> >
> >   GEN     .version
> >   CHK     include/generated/compile.h
> >   UPD     include/generated/compile.h
> >   CC      init/version.o
> >   AR      init/built-in.a
> >   LD      vmlinux.o
> >   MODPOST vmlinux.symvers
> >   MODINFO modules.builtin.modinfo
> >   GEN     modules.builtin
> >   LD      .tmp_vmlinux.btf
> > ld: net/ipv4/tcp_cubic.o: in function `cubictcp_unregister':
> > net/ipv4/tcp_cubic.c:545: undefined reference to `bpf_tcp_ca_kfunc_list'
> > ld: net/ipv4/tcp_cubic.c:545: undefined reference to `unregister_kfunc_btf_id_set'
> > ld: net/ipv4/tcp_cubic.o: in function `cubictcp_register':
> > net/ipv4/tcp_cubic.c:539: undefined reference to `bpf_tcp_ca_kfunc_list'
> > ld: net/ipv4/tcp_cubic.c:539: undefined reference to `register_kfunc_btf_id_set'
> >   BTF     .btf.vmlinux.bin.o
> > pahole: .tmp_vmlinux.btf: No such file or directory
> >   LD      .tmp_vmlinux.kallsyms1
> > .btf.vmlinux.bin.o: file not recognized: file format not recognized
> > make: *** [Makefile:1187: vmlinux] Error 1
> >
> > 'bpf_tcp_ca_kfunc_list', 'register_kfunc_btf_id_set()' and
> > 'unregister_kfunc_btf_id_set()' are only defined when
> > CONFIG_BPF_SYSCALL is enabled.
> >
> > Fix that by moving those definitions somewhere that doesn't depend on
> > the bpf() syscall.
> >
> > Fixes: 14f267d95fe4 ("bpf: btf: Introduce helpers for dynamic BTF set registration")
> > Signed-off-by: Vinicius Costa Gomes <vinicius.gomes@intel.com>
>
> Thanks for the fix.
>
> But instead of moving this to core.c, you can probably make the btf.h
> declaration conditional on CONFIG_BPF_SYSCALL, since this is not useful in
> isolation (only used by verifier for module kfunc support). For the case of
> kfunc_btf_id_list variables, just define it as an empty struct and static
> variables, since the definition is still inside btf.c. So it becomes a noop for
> !CONFIG_BPF_SYSCALL.
>
> I am also not sure whether BTF is useful without BPF support, but maybe I'm
> missing some usecase.

Unlikely. I would just disallow such config instead of sprinkling
the code with ifdefs.
Vinicius Costa Gomes Nov. 10, 2021, 11:10 p.m. UTC | #3
Hi,

Kumar Kartikeya Dwivedi <memxor@gmail.com> writes:

> On Thu, Nov 11, 2021 at 02:24:18AM IST, Vinicius Costa Gomes wrote:
>> When CONFIG_DEBUG_INFO_BTF is enabled and CONFIG_BPF_SYSCALL is
>> disabled, the following compilation error can be seen:
>>
>>   GEN     .version
>>   CHK     include/generated/compile.h
>>   UPD     include/generated/compile.h
>>   CC      init/version.o
>>   AR      init/built-in.a
>>   LD      vmlinux.o
>>   MODPOST vmlinux.symvers
>>   MODINFO modules.builtin.modinfo
>>   GEN     modules.builtin
>>   LD      .tmp_vmlinux.btf
>> ld: net/ipv4/tcp_cubic.o: in function `cubictcp_unregister':
>> net/ipv4/tcp_cubic.c:545: undefined reference to `bpf_tcp_ca_kfunc_list'
>> ld: net/ipv4/tcp_cubic.c:545: undefined reference to `unregister_kfunc_btf_id_set'
>> ld: net/ipv4/tcp_cubic.o: in function `cubictcp_register':
>> net/ipv4/tcp_cubic.c:539: undefined reference to `bpf_tcp_ca_kfunc_list'
>> ld: net/ipv4/tcp_cubic.c:539: undefined reference to `register_kfunc_btf_id_set'
>>   BTF     .btf.vmlinux.bin.o
>> pahole: .tmp_vmlinux.btf: No such file or directory
>>   LD      .tmp_vmlinux.kallsyms1
>> .btf.vmlinux.bin.o: file not recognized: file format not recognized
>> make: *** [Makefile:1187: vmlinux] Error 1
>>
>> 'bpf_tcp_ca_kfunc_list', 'register_kfunc_btf_id_set()' and
>> 'unregister_kfunc_btf_id_set()' are only defined when
>> CONFIG_BPF_SYSCALL is enabled.
>>
>> Fix that by moving those definitions somewhere that doesn't depend on
>> the bpf() syscall.
>>
>> Fixes: 14f267d95fe4 ("bpf: btf: Introduce helpers for dynamic BTF set registration")
>> Signed-off-by: Vinicius Costa Gomes <vinicius.gomes@intel.com>
>
> Thanks for the fix.
>
> But instead of moving this to core.c, you can probably make the btf.h
> declaration conditional on CONFIG_BPF_SYSCALL, since this is not useful in
> isolation (only used by verifier for module kfunc support). For the case of
> kfunc_btf_id_list variables, just define it as an empty struct and static
> variables, since the definition is still inside btf.c. So it becomes a noop for
> !CONFIG_BPF_SYSCALL.
>
> I am also not sure whether BTF is useful without BPF support, but maybe I'm
> missing some usecase.

From my side, you are not missing anything, it was just random chance
that I had a 'x86_64_defconfig + debug + BTF' .config laying around and
the build broke with it. I don't have any real usecases for this
combination.


Cheers,
Vinicius Costa Gomes Nov. 10, 2021, 11:51 p.m. UTC | #4
Alexei Starovoitov <alexei.starovoitov@gmail.com> writes:

>> Thanks for the fix.
>>
>> But instead of moving this to core.c, you can probably make the btf.h
>> declaration conditional on CONFIG_BPF_SYSCALL, since this is not useful in
>> isolation (only used by verifier for module kfunc support). For the case of
>> kfunc_btf_id_list variables, just define it as an empty struct and static
>> variables, since the definition is still inside btf.c. So it becomes a noop for
>> !CONFIG_BPF_SYSCALL.
>>
>> I am also not sure whether BTF is useful without BPF support, but maybe I'm
>> missing some usecase.
>
> Unlikely. I would just disallow such config instead of sprinkling
> the code with ifdefs.

Is something like this what you have in mind?

diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug
index 6fdbf9613aec..eae860c86e26 100644
--- a/lib/Kconfig.debug
+++ b/lib/Kconfig.debug
@@ -316,6 +316,7 @@ config DEBUG_INFO_BTF
 	bool "Generate BTF typeinfo"
 	depends on !DEBUG_INFO_SPLIT && !DEBUG_INFO_REDUCED
 	depends on !GCC_PLUGIN_RANDSTRUCT || COMPILE_TEST
+	depends on BPF_SYSCALL
 	help
 	  Generate deduplicated BTF type information from DWARF debug info.
 	  Turning this on expects presence of pahole tool, which will convert


Cheers,
Kumar Kartikeya Dwivedi Nov. 11, 2021, 12:13 a.m. UTC | #5
On Thu, Nov 11, 2021 at 05:21:53AM IST, Vinicius Costa Gomes wrote:
> Alexei Starovoitov <alexei.starovoitov@gmail.com> writes:
>
> >> Thanks for the fix.
> >>
> >> But instead of moving this to core.c, you can probably make the btf.h
> >> declaration conditional on CONFIG_BPF_SYSCALL, since this is not useful in
> >> isolation (only used by verifier for module kfunc support). For the case of
> >> kfunc_btf_id_list variables, just define it as an empty struct and static
> >> variables, since the definition is still inside btf.c. So it becomes a noop for
> >> !CONFIG_BPF_SYSCALL.
> >>
> >> I am also not sure whether BTF is useful without BPF support, but maybe I'm
> >> missing some usecase.
> >
> > Unlikely. I would just disallow such config instead of sprinkling
> > the code with ifdefs.
>
> Is something like this what you have in mind?
>
> diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug
> index 6fdbf9613aec..eae860c86e26 100644
> --- a/lib/Kconfig.debug
> +++ b/lib/Kconfig.debug
> @@ -316,6 +316,7 @@ config DEBUG_INFO_BTF
>  	bool "Generate BTF typeinfo"
>  	depends on !DEBUG_INFO_SPLIT && !DEBUG_INFO_REDUCED
>  	depends on !GCC_PLUGIN_RANDSTRUCT || COMPILE_TEST
> +	depends on BPF_SYSCALL
>  	help
>  	  Generate deduplicated BTF type information from DWARF debug info.
>  	  Turning this on expects presence of pahole tool, which will convert
>
>

BTW, you will need a little more than that, I suspect the compiler optimizes out
the register/unregister call so we don't see a build failure, but adding a side
effect gives me errors, so something like this should resolve the problem (since
kfunc_btf_id_list variable definition is behind CONFIG_BPF_SYSCALL).

diff --git a/include/linux/btf.h b/include/linux/btf.h
index 203eef993d76..e9881ef9e9aa 100644
--- a/include/linux/btf.h
+++ b/include/linux/btf.h
@@ -254,6 +254,8 @@ void unregister_kfunc_btf_id_set(struct kfunc_btf_id_list *l,
                                 struct kfunc_btf_id_set *s);
 bool bpf_check_mod_kfunc_call(struct kfunc_btf_id_list *klist, u32 kfunc_id,
                              struct module *owner);
+extern struct kfunc_btf_id_list bpf_tcp_ca_kfunc_list;
+extern struct kfunc_btf_id_list prog_test_kfunc_list;
 #else
 static inline void register_kfunc_btf_id_set(struct kfunc_btf_id_list *l,
                                             struct kfunc_btf_id_set *s)
@@ -268,13 +270,13 @@ static inline bool bpf_check_mod_kfunc_call(struct kfunc_btf_id_list *klist,
 {
        return false;
 }
+struct kfunc_btf_id_list {};
+static struct kfunc_btf_id_list bpf_tcp_ca_kfunc_list __maybe_unused;
+static struct kfunc_btf_id_list prog_test_kfunc_list __maybe_unused;
+
 #endif

 #define DEFINE_KFUNC_BTF_ID_SET(set, name)                                     \
        struct kfunc_btf_id_set name = { LIST_HEAD_INIT(name.list), (set),     \
                                         THIS_MODULE }
-
-extern struct kfunc_btf_id_list bpf_tcp_ca_kfunc_list;
-extern struct kfunc_btf_id_list prog_test_kfunc_list;
-
 #endif

--
Kartikeya
Vinicius Costa Gomes Nov. 11, 2021, 2:04 a.m. UTC | #6
Hi Kartikeya,

Kumar Kartikeya Dwivedi <memxor@gmail.com> writes:

> On Thu, Nov 11, 2021 at 05:21:53AM IST, Vinicius Costa Gomes wrote:
>> Alexei Starovoitov <alexei.starovoitov@gmail.com> writes:
>>
>> >> Thanks for the fix.
>> >>
>> >> But instead of moving this to core.c, you can probably make the btf.h
>> >> declaration conditional on CONFIG_BPF_SYSCALL, since this is not useful in
>> >> isolation (only used by verifier for module kfunc support). For the case of
>> >> kfunc_btf_id_list variables, just define it as an empty struct and static
>> >> variables, since the definition is still inside btf.c. So it becomes a noop for
>> >> !CONFIG_BPF_SYSCALL.
>> >>
>> >> I am also not sure whether BTF is useful without BPF support, but maybe I'm
>> >> missing some usecase.
>> >
>> > Unlikely. I would just disallow such config instead of sprinkling
>> > the code with ifdefs.
>>
>> Is something like this what you have in mind?
>>
>> diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug
>> index 6fdbf9613aec..eae860c86e26 100644
>> --- a/lib/Kconfig.debug
>> +++ b/lib/Kconfig.debug
>> @@ -316,6 +316,7 @@ config DEBUG_INFO_BTF
>>  	bool "Generate BTF typeinfo"
>>  	depends on !DEBUG_INFO_SPLIT && !DEBUG_INFO_REDUCED
>>  	depends on !GCC_PLUGIN_RANDSTRUCT || COMPILE_TEST
>> +	depends on BPF_SYSCALL
>>  	help
>>  	  Generate deduplicated BTF type information from DWARF debug info.
>>  	  Turning this on expects presence of pahole tool, which will convert
>>
>>
>
> BTW, you will need a little more than that, I suspect the compiler optimizes out
> the register/unregister call so we don't see a build failure, but adding a side
> effect gives me errors, so something like this should resolve the problem (since
> kfunc_btf_id_list variable definition is behind CONFIG_BPF_SYSCALL).
>
> diff --git a/include/linux/btf.h b/include/linux/btf.h
> index 203eef993d76..e9881ef9e9aa 100644
> --- a/include/linux/btf.h
> +++ b/include/linux/btf.h
> @@ -254,6 +254,8 @@ void unregister_kfunc_btf_id_set(struct kfunc_btf_id_list *l,
>                                  struct kfunc_btf_id_set *s);
>  bool bpf_check_mod_kfunc_call(struct kfunc_btf_id_list *klist, u32 kfunc_id,
>                               struct module *owner);
> +extern struct kfunc_btf_id_list bpf_tcp_ca_kfunc_list;
> +extern struct kfunc_btf_id_list prog_test_kfunc_list;
>  #else
>  static inline void register_kfunc_btf_id_set(struct kfunc_btf_id_list *l,
>                                              struct kfunc_btf_id_set *s)
> @@ -268,13 +270,13 @@ static inline bool bpf_check_mod_kfunc_call(struct kfunc_btf_id_list *klist,
>  {
>         return false;
>  }
> +struct kfunc_btf_id_list {};
> +static struct kfunc_btf_id_list bpf_tcp_ca_kfunc_list __maybe_unused;
> +static struct kfunc_btf_id_list prog_test_kfunc_list __maybe_unused;
> +
>  #endif
>
>  #define DEFINE_KFUNC_BTF_ID_SET(set, name)                                     \
>         struct kfunc_btf_id_set name = { LIST_HEAD_INIT(name.list), (set),     \
>                                          THIS_MODULE }
> -
> -extern struct kfunc_btf_id_list bpf_tcp_ca_kfunc_list;
> -extern struct kfunc_btf_id_list prog_test_kfunc_list;
> -
>  #endif
>

I could not reproduce the build failure here even when adding some side
effects, but I didn't try very hard.

As you are more familiar with the code, I would be glad if you could
take it from here and propose a patch.


Cheers,
Kumar Kartikeya Dwivedi Nov. 11, 2021, 2:11 a.m. UTC | #7
On Thu, Nov 11, 2021 at 07:34:38AM IST, Vinicius Costa Gomes wrote:
> Hi Kartikeya,
>
> Kumar Kartikeya Dwivedi <memxor@gmail.com> writes:
>
> > On Thu, Nov 11, 2021 at 05:21:53AM IST, Vinicius Costa Gomes wrote:
> >> Alexei Starovoitov <alexei.starovoitov@gmail.com> writes:
> >>
> >> >> Thanks for the fix.
> >> >>
> >> >> But instead of moving this to core.c, you can probably make the btf.h
> >> >> declaration conditional on CONFIG_BPF_SYSCALL, since this is not useful in
> >> >> isolation (only used by verifier for module kfunc support). For the case of
> >> >> kfunc_btf_id_list variables, just define it as an empty struct and static
> >> >> variables, since the definition is still inside btf.c. So it becomes a noop for
> >> >> !CONFIG_BPF_SYSCALL.
> >> >>
> >> >> I am also not sure whether BTF is useful without BPF support, but maybe I'm
> >> >> missing some usecase.
> >> >
> >> > Unlikely. I would just disallow such config instead of sprinkling
> >> > the code with ifdefs.
> >>
> >> Is something like this what you have in mind?
> >>
> >> diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug
> >> index 6fdbf9613aec..eae860c86e26 100644
> >> --- a/lib/Kconfig.debug
> >> +++ b/lib/Kconfig.debug
> >> @@ -316,6 +316,7 @@ config DEBUG_INFO_BTF
> >>  	bool "Generate BTF typeinfo"
> >>  	depends on !DEBUG_INFO_SPLIT && !DEBUG_INFO_REDUCED
> >>  	depends on !GCC_PLUGIN_RANDSTRUCT || COMPILE_TEST
> >> +	depends on BPF_SYSCALL
> >>  	help
> >>  	  Generate deduplicated BTF type information from DWARF debug info.
> >>  	  Turning this on expects presence of pahole tool, which will convert
> >>
> >>
> >
> > BTW, you will need a little more than that, I suspect the compiler optimizes out
> > the register/unregister call so we don't see a build failure, but adding a side
> > effect gives me errors, so something like this should resolve the problem (since
> > kfunc_btf_id_list variable definition is behind CONFIG_BPF_SYSCALL).
> >
> > diff --git a/include/linux/btf.h b/include/linux/btf.h
> > index 203eef993d76..e9881ef9e9aa 100644
> > --- a/include/linux/btf.h
> > +++ b/include/linux/btf.h
> > @@ -254,6 +254,8 @@ void unregister_kfunc_btf_id_set(struct kfunc_btf_id_list *l,
> >                                  struct kfunc_btf_id_set *s);
> >  bool bpf_check_mod_kfunc_call(struct kfunc_btf_id_list *klist, u32 kfunc_id,
> >                               struct module *owner);
> > +extern struct kfunc_btf_id_list bpf_tcp_ca_kfunc_list;
> > +extern struct kfunc_btf_id_list prog_test_kfunc_list;
> >  #else
> >  static inline void register_kfunc_btf_id_set(struct kfunc_btf_id_list *l,
> >                                              struct kfunc_btf_id_set *s)
> > @@ -268,13 +270,13 @@ static inline bool bpf_check_mod_kfunc_call(struct kfunc_btf_id_list *klist,
> >  {
> >         return false;
> >  }
> > +struct kfunc_btf_id_list {};
> > +static struct kfunc_btf_id_list bpf_tcp_ca_kfunc_list __maybe_unused;
> > +static struct kfunc_btf_id_list prog_test_kfunc_list __maybe_unused;
> > +
> >  #endif
> >
> >  #define DEFINE_KFUNC_BTF_ID_SET(set, name)                                     \
> >         struct kfunc_btf_id_set name = { LIST_HEAD_INIT(name.list), (set),     \
> >                                          THIS_MODULE }
> > -
> > -extern struct kfunc_btf_id_list bpf_tcp_ca_kfunc_list;
> > -extern struct kfunc_btf_id_list prog_test_kfunc_list;
> > -
> >  #endif
> >
>
> I could not reproduce the build failure here even when adding some side
> effects, but I didn't try very hard.
>
> As you are more familiar with the code, I would be glad if you could
> take it from here and propose a patch.
>

Sure, no worries!

>
> Cheers,
> --
> Vinicius

--
Kartikeya
diff mbox series

Patch

diff --git a/kernel/bpf/btf.c b/kernel/bpf/btf.c
index dbc3ad07e21b..cc9868376345 100644
--- a/kernel/bpf/btf.c
+++ b/kernel/bpf/btf.c
@@ -6344,33 +6344,8 @@  const struct bpf_func_proto bpf_btf_find_by_name_kind_proto = {
 
 BTF_ID_LIST_GLOBAL_SINGLE(btf_task_struct_ids, struct, task_struct)
 
-/* BTF ID set registration API for modules */
-
-struct kfunc_btf_id_list {
-	struct list_head list;
-	struct mutex mutex;
-};
-
 #ifdef CONFIG_DEBUG_INFO_BTF_MODULES
 
-void register_kfunc_btf_id_set(struct kfunc_btf_id_list *l,
-			       struct kfunc_btf_id_set *s)
-{
-	mutex_lock(&l->mutex);
-	list_add(&s->list, &l->list);
-	mutex_unlock(&l->mutex);
-}
-EXPORT_SYMBOL_GPL(register_kfunc_btf_id_set);
-
-void unregister_kfunc_btf_id_set(struct kfunc_btf_id_list *l,
-				 struct kfunc_btf_id_set *s)
-{
-	mutex_lock(&l->mutex);
-	list_del_init(&s->list);
-	mutex_unlock(&l->mutex);
-}
-EXPORT_SYMBOL_GPL(unregister_kfunc_btf_id_set);
-
 bool bpf_check_mod_kfunc_call(struct kfunc_btf_id_list *klist, u32 kfunc_id,
 			      struct module *owner)
 {
@@ -6390,11 +6365,3 @@  bool bpf_check_mod_kfunc_call(struct kfunc_btf_id_list *klist, u32 kfunc_id,
 }
 
 #endif
-
-#define DEFINE_KFUNC_BTF_ID_LIST(name)                                         \
-	struct kfunc_btf_id_list name = { LIST_HEAD_INIT(name.list),           \
-					  __MUTEX_INITIALIZER(name.mutex) };   \
-	EXPORT_SYMBOL_GPL(name)
-
-DEFINE_KFUNC_BTF_ID_LIST(bpf_tcp_ca_kfunc_list);
-DEFINE_KFUNC_BTF_ID_LIST(prog_test_kfunc_list);
diff --git a/kernel/bpf/core.c b/kernel/bpf/core.c
index 2405e39d800f..f2939a6d8199 100644
--- a/kernel/bpf/core.c
+++ b/kernel/bpf/core.c
@@ -2456,6 +2456,43 @@  int __weak bpf_arch_text_poke(void *ip, enum bpf_text_poke_type t,
 DEFINE_STATIC_KEY_FALSE(bpf_stats_enabled_key);
 EXPORT_SYMBOL(bpf_stats_enabled_key);
 
+/* BTF ID set registration API for modules */
+
+struct kfunc_btf_id_list {
+	struct list_head list;
+	struct mutex mutex;
+};
+
+#ifdef CONFIG_DEBUG_INFO_BTF_MODULES
+
+void register_kfunc_btf_id_set(struct kfunc_btf_id_list *l,
+			       struct kfunc_btf_id_set *s)
+{
+	mutex_lock(&l->mutex);
+	list_add(&s->list, &l->list);
+	mutex_unlock(&l->mutex);
+}
+EXPORT_SYMBOL_GPL(register_kfunc_btf_id_set);
+
+void unregister_kfunc_btf_id_set(struct kfunc_btf_id_list *l,
+				 struct kfunc_btf_id_set *s)
+{
+	mutex_lock(&l->mutex);
+	list_del_init(&s->list);
+	mutex_unlock(&l->mutex);
+}
+EXPORT_SYMBOL_GPL(unregister_kfunc_btf_id_set);
+
+#endif
+
+#define DEFINE_KFUNC_BTF_ID_LIST(name)                                         \
+	struct kfunc_btf_id_list name = { LIST_HEAD_INIT(name.list),           \
+					  __MUTEX_INITIALIZER(name.mutex) };   \
+	EXPORT_SYMBOL_GPL(name)
+
+DEFINE_KFUNC_BTF_ID_LIST(bpf_tcp_ca_kfunc_list);
+DEFINE_KFUNC_BTF_ID_LIST(prog_test_kfunc_list);
+
 /* All definitions of tracepoints related to BPF. */
 #define CREATE_TRACE_POINTS
 #include <linux/bpf_trace.h>