From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751788AbcBLQMI (ORCPT ); Fri, 12 Feb 2016 11:12:08 -0500 Received: from mga01.intel.com ([192.55.52.88]:7564 "EHLO mga01.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750902AbcBLQMF (ORCPT ); Fri, 12 Feb 2016 11:12:05 -0500 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.22,436,1449561600"; d="scan'208";a="901597872" 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 06/10] tracing: Add kprobe/uprobe support for TRACE_EVENT eBPF progs Date: Fri, 12 Feb 2016 10:11:24 -0600 Message-Id: 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 Add a call at the end of kprobe/kretprobe/uprobe probe functions for BPF_PROG_TYPE_TRACE_EVENT programs. These new calls are made after the trace event fields have been stored into the trace buffer, where they can then be accessed by the eBPF program. The existing BPF_PROG_TYPE_KPROBE calls at the beginning remain, but the prog type needs to be checked to see whether it's a kprobe or a trace event prog. Signed-off-by: Tom Zanussi --- kernel/trace/trace_kprobe.c | 20 ++++++++++++++++++-- kernel/trace/trace_uprobe.c | 11 ++++++++++- 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/kernel/trace/trace_kprobe.c b/kernel/trace/trace_kprobe.c index c995644..34231f1 100644 --- a/kernel/trace/trace_kprobe.c +++ b/kernel/trace/trace_kprobe.c @@ -19,6 +19,8 @@ #include #include +#include +#include #include "trace_probe.h" @@ -1129,7 +1131,8 @@ kprobe_perf_func(struct trace_kprobe *tk, struct pt_regs *regs) int size, __size, dsize; int rctx; - if (prog && !trace_call_bpf(prog, regs)) + if (prog && prog->type == BPF_PROG_TYPE_KPROBE && + !trace_call_bpf(prog, regs)) return; head = this_cpu_ptr(call->perf_events); @@ -1148,6 +1151,12 @@ kprobe_perf_func(struct trace_kprobe *tk, struct pt_regs *regs) entry->ip = (unsigned long)tk->rp.kp.addr; memset(&entry[1], 0, dsize); store_trace_args(sizeof(*entry), &tk->tp, regs, (u8 *)&entry[1], dsize); + if (prog && prog->type == BPF_PROG_TYPE_TRACE_EVENT) { + struct trace_event_context ctx = { call, entry }; + + if (!trace_call_bpf(prog, &ctx)) + return; + } perf_trace_buf_submit(entry, size, rctx, 0, 1, regs, head, NULL); } NOKPROBE_SYMBOL(kprobe_perf_func); @@ -1164,7 +1173,8 @@ kretprobe_perf_func(struct trace_kprobe *tk, struct kretprobe_instance *ri, int size, __size, dsize; int rctx; - if (prog && !trace_call_bpf(prog, regs)) + if (prog && prog->type == BPF_PROG_TYPE_KPROBE && + !trace_call_bpf(prog, regs)) return; head = this_cpu_ptr(call->perf_events); @@ -1183,6 +1193,12 @@ kretprobe_perf_func(struct trace_kprobe *tk, struct kretprobe_instance *ri, entry->func = (unsigned long)tk->rp.kp.addr; entry->ret_ip = (unsigned long)ri->ret_addr; store_trace_args(sizeof(*entry), &tk->tp, regs, (u8 *)&entry[1], dsize); + if (prog && prog->type == BPF_PROG_TYPE_TRACE_EVENT) { + struct trace_event_context ctx = { call, entry }; + + if (!trace_call_bpf(prog, &ctx)) + return; + } perf_trace_buf_submit(entry, size, rctx, 0, 1, regs, head, NULL); } NOKPROBE_SYMBOL(kretprobe_perf_func); diff --git a/kernel/trace/trace_uprobe.c b/kernel/trace/trace_uprobe.c index d2f6d0b..990bc71 100644 --- a/kernel/trace/trace_uprobe.c +++ b/kernel/trace/trace_uprobe.c @@ -23,6 +23,8 @@ #include #include #include +#include +#include #include "trace_probe.h" @@ -1116,7 +1118,8 @@ static void __uprobe_perf_func(struct trace_uprobe *tu, int size, esize; int rctx; - if (prog && !trace_call_bpf(prog, regs)) + if (prog && prog->type == BPF_PROG_TYPE_KPROBE && + trace_call_bpf(prog, regs)) return; esize = SIZEOF_TRACE_ENTRY(is_ret_probe(tu)); @@ -1152,6 +1155,12 @@ static void __uprobe_perf_func(struct trace_uprobe *tu, memset(data + len, 0, size - esize - len); } + if (prog && prog->type == BPF_PROG_TYPE_TRACE_EVENT) { + struct trace_event_context ctx = { call, entry }; + + if (!trace_call_bpf(prog, &ctx)) + return; + } perf_trace_buf_submit(entry, size, rctx, 0, 1, regs, head, NULL); out: preempt_enable(); -- 1.9.3