[PATCH v4 0/4] per-function storage support

Menglong Dong
2025-03-03T13:30:29Z

For now, there isn't a way to set and get per-function metadata with
a low overhead, which is not convenient for some situations. Take
BPF trampoline for example, we need to create a trampoline for each
kernel function, as we have to store some information of the function
to the trampoline, such as BPF progs, function arg count, etc. The
performance overhead and memory consumption can be higher to create
these trampolines. With the supporting of per-function metadata storage,
we can store these information to the metadata, and create a global BPF
trampoline for all the kernel functions. In the global trampoline, we
get the information that we need from the function metadata through the
ip (function address) with almost no overhead.

Another beneficiary can be ftrace. For now, all the kernel functions that
are enabled by dynamic ftrace will be added to a filter hash if there are
more than one callbacks. And hash lookup will happen when the traced
functions are called, which has an impact on the performance, see
__ftrace_ops_list_func() -> ftrace_ops_test(). With the per-function
metadata supporting, we can store the information that if the callback is
enabled on the kernel function to the metadata.

In the 1st patch, we factor out FINEIBT_INSN_OFFSET and CFI_INSN_OFFSET to
make fineibt works when the kernel function is 32-bytes aligned.

In the 2nd patch, we implement the per-function metadata storage by
storing the index of the metadata to the function padding space.

In the 3rd and 4th patch, we implement the per-function metadata storage
for x86 and arm64. And in the feature, we can support more arch.

Changes since V3:
- rebase to the newest tip/x86/core, the fineibt has some updating

Changes since V2:
- split the patch into a series.
- considering the effect to cfi and fineibt and introduce the 1st patch.

Changes since V1:
- add supporting for arm64
- split out arch relevant code
- refactor the commit log

Menglong Dong (4):
x86/ibt: factor out cfi and fineibt offset
add per-function metadata storage support
x86: implement per-function metadata storage for x86
arm64: implement per-function metadata storage for arm64

arch/arm64/Kconfig | 15 ++
arch/arm64/Makefile | 23 ++-
arch/arm64/include/asm/ftrace.h | 34 +++++
arch/arm64/kernel/ftrace.c | 13 +-
arch/x86/Kconfig | 18 +++
arch/x86/include/asm/cfi.h | 13 +-
arch/x86/include/asm/ftrace.h | 54 ++++++++
arch/x86/kernel/alternative.c | 18 ++-
arch/x86/net/bpf_jit_comp.c | 22 +--
include/linux/kfunc_md.h | 25 ++++
kernel/Makefile | 1 +
kernel/trace/Makefile | 1 +
kernel/trace/kfunc_md.c | 239 ++++++++++++++++++++++++++++++++
13 files changed, 450 insertions(+), 26 deletions(-)
create mode 100644 include/linux/kfunc_md.h
create mode 100644 kernel/trace/kfunc_md.c

--
2.39.5