1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */ 2ee53bbd1SSteven Rostedt (Red Hat) 3ee53bbd1SSteven Rostedt (Red Hat) #undef TRACE_SYSTEM_VAR 4ee53bbd1SSteven Rostedt (Red Hat) 5ee53bbd1SSteven Rostedt (Red Hat) #ifdef CONFIG_PERF_EVENTS 6ee53bbd1SSteven Rostedt (Red Hat) 7*92a22ceaSSteven Rostedt (Google) #include "stages/stage6_event_callback.h" 8d07c9ad6SChuck Lever 9ee53bbd1SSteven Rostedt (Red Hat) #undef __perf_count 10ee53bbd1SSteven Rostedt (Red Hat) #define __perf_count(c) (__count = (c)) 11ee53bbd1SSteven Rostedt (Red Hat) 12ee53bbd1SSteven Rostedt (Red Hat) #undef __perf_task 13ee53bbd1SSteven Rostedt (Red Hat) #define __perf_task(t) (__task = (t)) 14ee53bbd1SSteven Rostedt (Red Hat) 15ee53bbd1SSteven Rostedt (Red Hat) #undef DECLARE_EVENT_CLASS 16ee53bbd1SSteven Rostedt (Red Hat) #define DECLARE_EVENT_CLASS(call, proto, args, tstruct, assign, print) \ 17ee53bbd1SSteven Rostedt (Red Hat) static notrace void \ 18ee53bbd1SSteven Rostedt (Red Hat) perf_trace_##call(void *__data, proto) \ 19ee53bbd1SSteven Rostedt (Red Hat) { \ 202425bcb9SSteven Rostedt (Red Hat) struct trace_event_call *event_call = __data; \ 2162323a14SSteven Rostedt (Red Hat) struct trace_event_data_offsets_##call __maybe_unused __data_offsets;\ 22a7237765SSteven Rostedt (Red Hat) struct trace_event_raw_##call *entry; \ 23ee53bbd1SSteven Rostedt (Red Hat) struct pt_regs *__regs; \ 24e93735beSAlexei Starovoitov u64 __count = 1; \ 25ee53bbd1SSteven Rostedt (Red Hat) struct task_struct *__task = NULL; \ 26ee53bbd1SSteven Rostedt (Red Hat) struct hlist_head *head; \ 27ee53bbd1SSteven Rostedt (Red Hat) int __entry_size; \ 28ee53bbd1SSteven Rostedt (Red Hat) int __data_size; \ 29ee53bbd1SSteven Rostedt (Red Hat) int rctx; \ 30ee53bbd1SSteven Rostedt (Red Hat) \ 31d0ee8f4aSSteven Rostedt (Red Hat) __data_size = trace_event_get_offsets_##call(&__data_offsets, args); \ 32ee53bbd1SSteven Rostedt (Red Hat) \ 33ee53bbd1SSteven Rostedt (Red Hat) head = this_cpu_ptr(event_call->perf_events); \ 34e87c6bc3SYonghong Song if (!bpf_prog_array_valid(event_call) && \ 35e87c6bc3SYonghong Song __builtin_constant_p(!__task) && !__task && \ 36ee53bbd1SSteven Rostedt (Red Hat) hlist_empty(head)) \ 37ee53bbd1SSteven Rostedt (Red Hat) return; \ 38ee53bbd1SSteven Rostedt (Red Hat) \ 39ee53bbd1SSteven Rostedt (Red Hat) __entry_size = ALIGN(__data_size + sizeof(*entry) + sizeof(u32),\ 40ee53bbd1SSteven Rostedt (Red Hat) sizeof(u64)); \ 41ee53bbd1SSteven Rostedt (Red Hat) __entry_size -= sizeof(u32); \ 42ee53bbd1SSteven Rostedt (Red Hat) \ 431e1dcd93SAlexei Starovoitov entry = perf_trace_buf_alloc(__entry_size, &__regs, &rctx); \ 44ee53bbd1SSteven Rostedt (Red Hat) if (!entry) \ 45ee53bbd1SSteven Rostedt (Red Hat) return; \ 46ee53bbd1SSteven Rostedt (Red Hat) \ 47ee53bbd1SSteven Rostedt (Red Hat) perf_fetch_caller_regs(__regs); \ 48ee53bbd1SSteven Rostedt (Red Hat) \ 49ee53bbd1SSteven Rostedt (Red Hat) tstruct \ 50ee53bbd1SSteven Rostedt (Red Hat) \ 51ee53bbd1SSteven Rostedt (Red Hat) { assign; } \ 52ee53bbd1SSteven Rostedt (Red Hat) \ 5385b67bcbSAlexei Starovoitov perf_trace_run_bpf_submit(entry, __entry_size, rctx, \ 5485b67bcbSAlexei Starovoitov event_call, __count, __regs, \ 551e1dcd93SAlexei Starovoitov head, __task); \ 56ee53bbd1SSteven Rostedt (Red Hat) } 57ee53bbd1SSteven Rostedt (Red Hat) 58ee53bbd1SSteven Rostedt (Red Hat) /* 59ee53bbd1SSteven Rostedt (Red Hat) * This part is compiled out, it is only here as a build time check 60ee53bbd1SSteven Rostedt (Red Hat) * to make sure that if the tracepoint handling changes, the 61ee53bbd1SSteven Rostedt (Red Hat) * perf probe will fail to compile unless it too is updated. 62ee53bbd1SSteven Rostedt (Red Hat) */ 63ee53bbd1SSteven Rostedt (Red Hat) #undef DEFINE_EVENT 64ee53bbd1SSteven Rostedt (Red Hat) #define DEFINE_EVENT(template, call, proto, args) \ 65ee53bbd1SSteven Rostedt (Red Hat) static inline void perf_test_probe_##call(void) \ 66ee53bbd1SSteven Rostedt (Red Hat) { \ 67ee53bbd1SSteven Rostedt (Red Hat) check_trace_callback_type_##call(perf_trace_##template); \ 68ee53bbd1SSteven Rostedt (Red Hat) } 69ee53bbd1SSteven Rostedt (Red Hat) 70ee53bbd1SSteven Rostedt (Red Hat) 71ee53bbd1SSteven Rostedt (Red Hat) #undef DEFINE_EVENT_PRINT 72ee53bbd1SSteven Rostedt (Red Hat) #define DEFINE_EVENT_PRINT(template, name, proto, args, print) \ 73ee53bbd1SSteven Rostedt (Red Hat) DEFINE_EVENT(template, name, PARAMS(proto), PARAMS(args)) 74ee53bbd1SSteven Rostedt (Red Hat) 75ee53bbd1SSteven Rostedt (Red Hat) #include TRACE_INCLUDE(TRACE_INCLUDE_FILE) 76ee53bbd1SSteven Rostedt (Red Hat) #endif /* CONFIG_PERF_EVENTS */ 77