On Mon, Jul 24, 2017 at 04:40:15PM -0700, Andi Kleen wrote: > From: Andi Kleen <a...@linux.intel.com> > > Some of the metrics formulas (like GFLOPs) need to know how long > the measurement period is. Support an internal event called duration_time, > which > reports time in second. It maps to the dummy event, but is > special cased for statistics to report the walltime duration. > > So far it is not printed, but only used internally for metrics. > > Signed-off-by: Andi Kleen <a...@linux.intel.com> > --- > tools/perf/util/parse-events.l | 1 + > tools/perf/util/stat-shadow.c | 17 +++++++++++++---- > 2 files changed, 14 insertions(+), 4 deletions(-) > > diff --git a/tools/perf/util/parse-events.l b/tools/perf/util/parse-events.l > index 07ee5bb3a8b0..f7bc74f8a615 100644 > --- a/tools/perf/util/parse-events.l > +++ b/tools/perf/util/parse-events.l > @@ -277,6 +277,7 @@ cpu-migrations|migrations { return > sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COU > alignment-faults { return sym(yyscanner, > PERF_TYPE_SOFTWARE, PERF_COUNT_SW_ALIGNMENT_FAULTS); } > emulation-faults { return sym(yyscanner, > PERF_TYPE_SOFTWARE, PERF_COUNT_SW_EMULATION_FAULTS); } > dummy { return sym(yyscanner, > PERF_TYPE_SOFTWARE, PERF_COUNT_SW_DUMMY); } > +duration_time { return sym(yyscanner, > PERF_TYPE_SOFTWARE, PERF_COUNT_SW_DUMMY); }
not ideal to actualy create an kernel event for something we need only access in userspace, but I could live with that.. > bpf-output { return sym(yyscanner, > PERF_TYPE_SOFTWARE, PERF_COUNT_SW_BPF_OUTPUT); } > > /* > diff --git a/tools/perf/util/stat-shadow.c b/tools/perf/util/stat-shadow.c > index 122f37b38a65..34ae2960730b 100644 > --- a/tools/perf/util/stat-shadow.c > +++ b/tools/perf/util/stat-shadow.c > @@ -641,11 +641,20 @@ static void generic_metric(const char *metric_expr, > expr__add_id(&pctx, name, avg); > for (i = 0; metric_events[i]; i++) { > struct saved_value *v; > + struct stats *stats; > + double scale; > > - v = saved_value_lookup(metric_events[i], cpu, false); > - if (!v) > - break; > - expr__add_id(&pctx, metric_events[i]->name, > avg_stats(&v->stats)); > + if (!strcmp(metric_events[i]->name, "duration_time")) { > + stats = &walltime_nsecs_stats; > + scale = 1e-9; however this will enable the event value only for metric processing and following stat command will return 0: [jolsa@krava perf]$ ./perf stat -e duration_time kill kill: not enough arguments Performance counter stats for 'kill': 0 duration_time:u 0.006556409 seconds time elapsed perhaps we could substitute the value when we read the event also walltime_nsecs_stats is only updated at the end of the workload, so this won't work for interval.. but not sure this is an issue though jirka