Skip to content

Commit fd48aad

Browse files
Andi Kleenacmel
authored andcommitted
perf stat: Support duration_time for metrics
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 <[email protected]> Acked-by: Jiri Olsa <[email protected]> Link: http://lkml.kernel.org/r/[email protected] Signed-off-by: Arnaldo Carvalho de Melo <[email protected]>
1 parent 4e1a096 commit fd48aad

File tree

2 files changed

+14
-4
lines changed

2 files changed

+14
-4
lines changed

tools/perf/util/parse-events.l

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -288,6 +288,7 @@ cpu-migrations|migrations { return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COU
288288
alignment-faults { return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_ALIGNMENT_FAULTS); }
289289
emulation-faults { return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_EMULATION_FAULTS); }
290290
dummy { return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_DUMMY); }
291+
duration_time { return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_DUMMY); }
291292
bpf-output { return sym(yyscanner, PERF_TYPE_SOFTWARE, PERF_COUNT_SW_BPF_OUTPUT); }
292293

293294
/*

tools/perf/util/stat-shadow.c

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -641,11 +641,20 @@ static void generic_metric(const char *metric_expr,
641641
expr__add_id(&pctx, name, avg);
642642
for (i = 0; metric_events[i]; i++) {
643643
struct saved_value *v;
644+
struct stats *stats;
645+
double scale;
644646

645-
v = saved_value_lookup(metric_events[i], cpu, false);
646-
if (!v)
647-
break;
648-
expr__add_id(&pctx, metric_events[i]->name, avg_stats(&v->stats));
647+
if (!strcmp(metric_events[i]->name, "duration_time")) {
648+
stats = &walltime_nsecs_stats;
649+
scale = 1e-9;
650+
} else {
651+
v = saved_value_lookup(metric_events[i], cpu, false);
652+
if (!v)
653+
break;
654+
stats = &v->stats;
655+
scale = 1.0;
656+
}
657+
expr__add_id(&pctx, metric_events[i]->name, avg_stats(stats)*scale);
649658
}
650659
if (!metric_events[i]) {
651660
const char *p = metric_expr;

0 commit comments

Comments
 (0)