Add a simple bpf_test_tp() kfunc, available to all program types, that is useful for various testing and benchmarking scenarios, as it allows to trigger most tracing BPF program types from BPF side, allowing to do complex testing and benchmarking scenarios. Signed-off-by: Andrii Nakryiko <andrii@xxxxxxxxxx> --- kernel/bpf/bpf_test.h | 34 ++++++++++++++++++++++++++++++++++ kernel/bpf/helpers.c | 13 +++++++++++++ 2 files changed, 47 insertions(+) create mode 100644 kernel/bpf/bpf_test.h diff --git a/kernel/bpf/bpf_test.h b/kernel/bpf/bpf_test.h new file mode 100644 index 000000000000..c779927d3574 --- /dev/null +++ b/kernel/bpf/bpf_test.h @@ -0,0 +1,34 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#undef TRACE_SYSTEM +#define TRACE_SYSTEM bpf_test + +#if !defined(_TRACE_BPF_TEST_H) || defined(TRACE_HEADER_MULTI_READ) + +#define _TRACE_BPF_TEST_H + +#include <linux/tracepoint.h> + +TRACE_EVENT(bpf_test, + + TP_PROTO(int nonce), + + TP_ARGS(nonce), + + TP_STRUCT__entry( + __field(int, nonce) + ), + + TP_fast_assign( + __entry->nonce = nonce; + ), + + TP_printk("nonce %d", __entry->nonce) +); + +#endif /* _TRACE_BPF_TEST_H */ + +#undef TRACE_INCLUDE_PATH +#define TRACE_INCLUDE_PATH . +#define TRACE_INCLUDE_FILE bpf_test + +#include <trace/define_trace.h> diff --git a/kernel/bpf/helpers.c b/kernel/bpf/helpers.c index 9234174ccb21..67bf9659c447 100644 --- a/kernel/bpf/helpers.c +++ b/kernel/bpf/helpers.c @@ -26,6 +26,10 @@ #include "../../lib/kstrtox.h" +#define CREATE_TRACE_POINTS +#include "bpf_test.h" + + /* If kernel subsystem is allowing eBPF programs to call this function, * inside its own verifier_ops->get_func_proto() callback it should return * bpf_map_lookup_elem_proto, so that verifier can properly check the arguments @@ -2549,6 +2553,14 @@ __bpf_kfunc void bpf_throw(u64 cookie) WARN(1, "A call to BPF exception callback should never return\n"); } +__bpf_kfunc int bpf_test_tp(int nonce) +{ + trace_bpf_test(nonce); + + return nonce; +} +ALLOW_ERROR_INJECTION(bpf_test_tp, ERRNO); + __bpf_kfunc_end_defs(); BTF_KFUNCS_START(generic_btf_ids) @@ -2625,6 +2637,7 @@ BTF_ID_FLAGS(func, bpf_dynptr_is_null) BTF_ID_FLAGS(func, bpf_dynptr_is_rdonly) BTF_ID_FLAGS(func, bpf_dynptr_size) BTF_ID_FLAGS(func, bpf_dynptr_clone) +BTF_ID_FLAGS(func, bpf_test_tp) BTF_KFUNCS_END(common_btf_ids) static const struct btf_kfunc_id_set common_kfunc_set = { -- 2.43.0