BPF kfuncs are kernel functions that can be invoked by BPF programs. kfuncs can be kernel functions which are also called elsewhere in the main kernel (such as crash_kexec()), or may be functions that are only meant to be used by BPF programs, such as bpf_task_acquire(), and which are not called from anywhere else in the kernel. While thus far we haven't observed any issues such as kfuncs being elided by the compiler, at some point we could easily run into problems such as the following: - static kernel functions that are also used as kfuncs could be inlined and/or elided by the compiler. - BPF-specific kfuncs with external linkage may at some point be elided by the compiler in LTO builds, when it's determined that they aren't called anywhere. To address this, this patch set introduces a new __bpf_kfunc macro which should be added to all kfuncs, and which will protect kfuncs from such problems. Note that some kfuncs kind of try to do this already by specifying noinline or __used. We are inconsistent in how this is applied. __bpf_kfunc should provide a uniform and more-future-proof way to do this. David Vernet (3): bpf: Add __bpf_kfunc tag for marking kernel functions as kfuncs bpf: Document usage of the new __bpf_kfunc macro bpf: Add __bpf_kfunc tag to all kfuncs Documentation/bpf/kfuncs.rst | 18 +++++ Documentation/conf.py | 3 + include/linux/btf.h | 9 +++ kernel/bpf/helpers.c | 19 +++++ kernel/cgroup/rstat.c | 2 + kernel/kexec_core.c | 2 + kernel/trace/bpf_trace.c | 4 + net/bpf/test_run.c | 76 ++++++++++++------- net/ipv4/tcp_bbr.c | 8 ++ net/ipv4/tcp_cong.c | 5 ++ net/ipv4/tcp_cubic.c | 6 ++ net/ipv4/tcp_dctcp.c | 6 ++ net/netfilter/nf_conntrack_bpf.c | 14 +++- net/netfilter/nf_nat_bpf.c | 1 + net/xfrm/xfrm_interface_bpf.c | 4 +- .../selftests/bpf/bpf_testmod/bpf_testmod.c | 2 +- 16 files changed, 146 insertions(+), 33 deletions(-) -- 2.39.0