From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751760AbcBLQNk (ORCPT ); Fri, 12 Feb 2016 11:13:40 -0500 Received: from mga09.intel.com ([134.134.136.24]:23434 "EHLO mga09.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751723AbcBLQMH (ORCPT ); Fri, 12 Feb 2016 11:12:07 -0500 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.22,436,1449561600"; d="scan'208";a="882951860" From: Tom Zanussi To: ast@plumgrid.com, rostedt@goodmis.org Cc: masami.hiramatsu.pt@hitachi.com, namhyung@kernel.org, peterz@infradead.org, linux-kernel@vger.kernel.org, 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 Message-Id: <595b4f9d780c10fc0e0f401cc07a204c9129ee78.1455291671.git.tom.zanussi@linux.intel.com> X-Mailer: git-send-email 1.9.3 In-Reply-To: References: In-Reply-To: References: Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 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 --- 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 +#include #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 /* for MODULE_NAME_LEN via KSYM_SYMBOL_LEN */ #include #include +#include +#include #include #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