On Tue, Jul 19, 2016 at 4:20 PM, Brendan Gregg <bgr...@netflix.com> wrote: > 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.
Any comments on this patch? Thanks, Brendan > > Signed-off-by: Brendan Gregg <bgr...@netflix.com> > Cc: Alexei Starovoitov <a...@kernel.org> > Cc: Wang Nan <wangn...@huawei.com> > --- > 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 <linux/tracepoint.h> > + > +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 <trace/define_trace.h> > 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 <asm/irq_regs.h> > > +#define CREATE_TRACE_POINTS > +#include <trace/events/perf.h> > + > 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 >