Messages in this thread Patch in this message | ![/](/images/icornerl.gif) | | From | Tom Zanussi <> | Subject | [RFC][PATCH 07/10] tracing: Add eBPF program support to static trace events | Date | Fri, 12 Feb 2016 10:11:25 -0600 |
| |
Have perf_trace_*() and perf_syscall_enter()/exit() make calls to trace_call_bpf() if there's a TRACE_EVENT program associated with a trace event.
Signed-off-by: Tom Zanussi <tom.zanussi@linux.intel.com> --- include/trace/perf.h | 10 ++++++++++ kernel/trace/trace_syscalls.c | 18 ++++++++++++++++++ 2 files changed, 28 insertions(+)
diff --git a/include/trace/perf.h b/include/trace/perf.h index 26486fc..0d8069c 100644 --- a/include/trace/perf.h +++ b/include/trace/perf.h @@ -1,3 +1,5 @@ +#include <linux/filter.h> +#include <linux/bpf.h> #undef TRACE_SYSTEM_VAR @@ -35,6 +37,7 @@ static notrace void \ perf_trace_##call(void *__data, proto) \ { \ struct trace_event_call *event_call = __data; \ + struct bpf_prog *prog = event_call->prog; \ struct trace_event_data_offsets_##call __maybe_unused __data_offsets;\ struct trace_event_raw_##call *entry; \ struct pt_regs *__regs; \ @@ -67,6 +70,13 @@ perf_trace_##call(void *__data, proto) \ \ { assign; } \ \ + if (prog && prog->type == BPF_PROG_TYPE_TRACE_EVENT) { \ + struct trace_event_context ctx = { event_call, entry }; \ + \ + if (!trace_call_bpf(prog, &ctx)) \ + return; \ + } \ + \ perf_trace_buf_submit(entry, __entry_size, rctx, __addr, \ __count, __regs, head, __task); \ } diff --git a/kernel/trace/trace_syscalls.c b/kernel/trace/trace_syscalls.c index 50be560..feea899 100644 --- a/kernel/trace/trace_syscalls.c +++ b/kernel/trace/trace_syscalls.c @@ -6,6 +6,8 @@ #include <linux/module.h> /* for MODULE_NAME_LEN via KSYM_SYMBOL_LEN */ #include <linux/ftrace.h> #include <linux/perf_event.h> +#include <linux/filter.h> +#include <linux/bpf.h> #include <asm/syscall.h> #include "trace_output.h" @@ -562,6 +564,7 @@ static void perf_syscall_enter(void *ignore, struct pt_regs *regs, long id) struct syscall_metadata *sys_data; struct syscall_trace_enter *rec; struct hlist_head *head; + struct bpf_prog *prog; int syscall_nr; int rctx; int size; @@ -576,6 +579,8 @@ static void perf_syscall_enter(void *ignore, struct pt_regs *regs, long id) if (!sys_data) return; + prog = sys_data->enter_event->prog; + head = this_cpu_ptr(sys_data->enter_event->perf_events); if (hlist_empty(head)) return; @@ -593,6 +598,11 @@ static void perf_syscall_enter(void *ignore, struct pt_regs *regs, long id) rec->nr = syscall_nr; syscall_get_arguments(current, regs, 0, sys_data->nb_args, (unsigned long *)&rec->args); + if (prog && prog->type == BPF_PROG_TYPE_TRACE_EVENT) { + struct trace_event_context ctx = { sys_data->enter_event, rec }; + if (!trace_call_bpf(prog, &ctx)) + return; + } perf_trace_buf_submit(rec, size, rctx, 0, 1, regs, head, NULL); } @@ -636,6 +646,7 @@ static void perf_syscall_exit(void *ignore, struct pt_regs *regs, long ret) struct syscall_metadata *sys_data; struct syscall_trace_exit *rec; struct hlist_head *head; + struct bpf_prog *prog; int syscall_nr; int rctx; int size; @@ -650,6 +661,8 @@ static void perf_syscall_exit(void *ignore, struct pt_regs *regs, long ret) if (!sys_data) return; + prog = sys_data->enter_event->prog; + head = this_cpu_ptr(sys_data->exit_event->perf_events); if (hlist_empty(head)) return; @@ -665,6 +678,11 @@ static void perf_syscall_exit(void *ignore, struct pt_regs *regs, long ret) rec->nr = syscall_nr; rec->ret = syscall_get_return_value(current, regs); + if (prog && prog->type == BPF_PROG_TYPE_TRACE_EVENT) { + struct trace_event_context ctx = { sys_data->exit_event, rec }; + if (!trace_call_bpf(prog, &ctx)) + return; + } perf_trace_buf_submit(rec, size, rctx, 0, 1, regs, head, NULL); } -- 1.9.3
| ![\](/images/icornerr.gif) |