From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752279AbcG2TVN (ORCPT ); Fri, 29 Jul 2016 15:21:13 -0400 Received: from mail.kernel.org ([198.145.29.136]:38294 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751182AbcG2TVH (ORCPT ); Fri, 29 Jul 2016 15:21:07 -0400 Date: Fri, 29 Jul 2016 16:21:00 -0300 From: Arnaldo Carvalho de Melo To: Brendan Gregg Cc: Peter Zijlstra , Ingo Molnar , Alexander Shishkin , linux-kernel@vger.kernel.org, Alexei Starovoitov , Wang Nan Subject: Re: [PATCH] perf/core: Add a tracepoint for perf sampling Message-ID: <20160729192100.GB26514@kernel.org> References: <1468970448-3309-1-git-send-email-bgregg@netflix.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1468970448-3309-1-git-send-email-bgregg@netflix.com> X-Url: http://acmel.wordpress.com User-Agent: Mutt/1.6.2 (2016-07-01) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Em Tue, Jul 19, 2016 at 11:20:48PM +0000, Brendan Gregg escreveu: > When perf is performing hrtimer-based sampling, this tracepoint can be used > by BPF to run additional logic on each sample. For example, BPF can fetch > stack traces and frequency count them in kernel context, for an efficient > profiler. Could you provide a complete experience? I.e. together with this patch a bpf script that could then run, with the full set of steps needed to show it in use. Also, what would be the value when BPF is not used? - Arnaldo > Signed-off-by: Brendan Gregg > Cc: Alexei Starovoitov > Cc: Wang Nan > --- > include/trace/events/perf.h | 29 +++++++++++++++++++++++++++++ > kernel/events/core.c | 5 +++++ > 2 files changed, 34 insertions(+) > create mode 100644 include/trace/events/perf.h > > diff --git a/include/trace/events/perf.h b/include/trace/events/perf.h > new file mode 100644 > index 0000000..461770d > --- /dev/null > +++ b/include/trace/events/perf.h > @@ -0,0 +1,29 @@ > +#undef TRACE_SYSTEM > +#define TRACE_SYSTEM perf > + > +#if !defined(_TRACE_PERF_H) || defined(TRACE_HEADER_MULTI_READ) > +#define _TRACE_PERF_H > + > +#include > + > +TRACE_EVENT(perf_hrtimer, > + TP_PROTO(struct pt_regs *regs, struct perf_event *event), > + > + TP_ARGS(regs, event), > + > + TP_STRUCT__entry( > + __field(struct pt_regs *, regs) > + __field(struct perf_event *, event) > + ), > + > + TP_fast_assign( > + __entry->regs = regs; > + __entry->event = event; > + ), > + > + TP_printk("regs=%p evt=%p", __entry->regs, __entry->event) > +); > +#endif /* _TRACE_PERF_H */ > + > +/* This part must be outside protection */ > +#include > diff --git a/kernel/events/core.c b/kernel/events/core.c > index 79dae18..0d843a7 100644 > --- a/kernel/events/core.c > +++ b/kernel/events/core.c > @@ -51,6 +51,9 @@ > > #include > > +#define CREATE_TRACE_POINTS > +#include > + > typedef int (*remote_function_f)(void *); > > struct remote_function_call { > @@ -8036,6 +8039,8 @@ static enum hrtimer_restart perf_swevent_hrtimer(struct hrtimer *hrtimer) > perf_sample_data_init(&data, 0, event->hw.last_period); > regs = get_irq_regs(); > > + trace_perf_hrtimer(regs, event); > + > if (regs && !perf_exclude_event(event, regs)) { > if (!(event->attr.exclude_idle && is_idle_task(current))) > if (__perf_event_overflow(event, 1, &data, regs)) > -- > 2.7.4