Skip to content

Commit 711db1f

Browse files
nathanchanceajdlinux
authored andcommitted
bpf: Mark bpf_arch_init_dispatcher_early() as __init_or_module
After commit dbe69b2 ("bpf: Fix dispatcher patchable function entry to 5 bytes nop"), building kernel/bpf/dispatcher.c in certain configurations with LLVM's integrated assembler results in a known recordmcount bug: Cannot find symbol for section 4: .init.text. kernel/bpf/dispatcher.o: failed This occurs when there are only weak symbols in a particular section in the translation unit; in this case, bpf_arch_init_dispatcher_early() is marked '__weak __init' and it is the only symbol in the .init.text section. recordmcount expects there to be a symbol for a particular section but LLVM's integrated assembler (and GNU as after 2.37) do not generated section symbols. This has been worked around in the kernel before in commit 55d5b7d ("initramfs: fix clang build failure") and commit 6e7b64b ("elfcore: fix building with clang"). Fixing recordmcount has been brought up before but there is no clear solution that does not break ftrace outright. Unfortunately, working around this issue by removing the '__init' from bpf_arch_init_dispatcher_early() is not an option, as the x86 version of bpf_arch_init_dispatcher_early() calls text_poke_early(), which is marked '__init_or_module', meaning that when CONFIG_MODULES is disabled, bpf_arch_init_dispatcher_early() has to be marked '__init' as well to avoid a section mismatch warning from modpost. However, bpf_arch_init_dispatcher_early() can be marked '__init_or_module' as well, which would resolve the recordmcount warning for configurations that support modules (i.e., the vast majority of them) while not introducing any new warnings for all configurations. Do so to clear up the build failure for CONFIG_MODULES=y configurations. Link: ClangBuiltLinux#981 Signed-off-by: Nathan Chancellor <[email protected]>
1 parent ee6050c commit 711db1f

File tree

3 files changed

+3
-3
lines changed

3 files changed

+3
-3
lines changed

arch/x86/net/bpf_jit_comp.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -389,7 +389,7 @@ static int __bpf_arch_text_poke(void *ip, enum bpf_text_poke_type t,
389389
return ret;
390390
}
391391

392-
int __init bpf_arch_init_dispatcher_early(void *ip)
392+
int __init_or_module bpf_arch_init_dispatcher_early(void *ip)
393393
{
394394
const u8 *nop_insn = x86_nops[5];
395395

include/linux/bpf.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -971,7 +971,7 @@ struct bpf_trampoline *bpf_trampoline_get(u64 key,
971971
struct bpf_attach_target_info *tgt_info);
972972
void bpf_trampoline_put(struct bpf_trampoline *tr);
973973
int arch_prepare_bpf_dispatcher(void *image, void *buf, s64 *funcs, int num_funcs);
974-
int __init bpf_arch_init_dispatcher_early(void *ip);
974+
int __init_or_module bpf_arch_init_dispatcher_early(void *ip);
975975

976976
#define BPF_DISPATCHER_INIT(_name) { \
977977
.mutex = __MUTEX_INITIALIZER(_name.mutex), \

kernel/bpf/dispatcher.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ int __weak arch_prepare_bpf_dispatcher(void *image, void *buf, s64 *funcs, int n
9191
return -ENOTSUPP;
9292
}
9393

94-
int __weak __init bpf_arch_init_dispatcher_early(void *ip)
94+
int __weak __init_or_module bpf_arch_init_dispatcher_early(void *ip)
9595
{
9696
return -ENOTSUPP;
9797
}

0 commit comments

Comments
 (0)