|
@@ -627,6 +627,46 @@ static void print_smi_cost(int cpu, struct perf_evsel *evsel,
|
|
|
out->print_metric(out->ctx, NULL, "%4.0f", "SMI#", smi_num);
|
|
|
}
|
|
|
|
|
|
+static void generic_metric(const char *metric_expr,
|
|
|
+ struct perf_evsel **metric_events,
|
|
|
+ char *name,
|
|
|
+ const char *metric_name,
|
|
|
+ double avg,
|
|
|
+ int cpu,
|
|
|
+ int ctx,
|
|
|
+ struct perf_stat_output_ctx *out)
|
|
|
+{
|
|
|
+ print_metric_t print_metric = out->print_metric;
|
|
|
+ struct parse_ctx pctx;
|
|
|
+ double ratio;
|
|
|
+ int i;
|
|
|
+ void *ctxp = out->ctx;
|
|
|
+
|
|
|
+ expr__ctx_init(&pctx);
|
|
|
+ expr__add_id(&pctx, name, avg);
|
|
|
+ for (i = 0; metric_events[i]; i++) {
|
|
|
+ struct saved_value *v;
|
|
|
+
|
|
|
+ v = saved_value_lookup(metric_events[i], cpu, ctx, false);
|
|
|
+ if (!v)
|
|
|
+ break;
|
|
|
+ expr__add_id(&pctx, metric_events[i]->name, avg_stats(&v->stats));
|
|
|
+ }
|
|
|
+ if (!metric_events[i]) {
|
|
|
+ const char *p = metric_expr;
|
|
|
+
|
|
|
+ if (expr__parse(&ratio, &pctx, &p) == 0)
|
|
|
+ print_metric(ctxp, NULL, "%8.1f",
|
|
|
+ metric_name ?
|
|
|
+ metric_name :
|
|
|
+ out->force_header ? name : "",
|
|
|
+ ratio);
|
|
|
+ else
|
|
|
+ print_metric(ctxp, NULL, NULL, "", 0);
|
|
|
+ } else
|
|
|
+ print_metric(ctxp, NULL, NULL, "", 0);
|
|
|
+}
|
|
|
+
|
|
|
void perf_stat__print_shadow_stats(struct perf_evsel *evsel,
|
|
|
double avg, int cpu,
|
|
|
struct perf_stat_output_ctx *out)
|
|
@@ -819,33 +859,8 @@ void perf_stat__print_shadow_stats(struct perf_evsel *evsel,
|
|
|
else
|
|
|
print_metric(ctxp, NULL, NULL, name, 0);
|
|
|
} else if (evsel->metric_expr) {
|
|
|
- struct parse_ctx pctx;
|
|
|
- int i;
|
|
|
-
|
|
|
- expr__ctx_init(&pctx);
|
|
|
- expr__add_id(&pctx, evsel->name, avg);
|
|
|
- for (i = 0; evsel->metric_events[i]; i++) {
|
|
|
- struct saved_value *v;
|
|
|
-
|
|
|
- v = saved_value_lookup(evsel->metric_events[i], cpu, ctx, false);
|
|
|
- if (!v)
|
|
|
- break;
|
|
|
- expr__add_id(&pctx, evsel->metric_events[i]->name,
|
|
|
- avg_stats(&v->stats));
|
|
|
- }
|
|
|
- if (!evsel->metric_events[i]) {
|
|
|
- const char *p = evsel->metric_expr;
|
|
|
-
|
|
|
- if (expr__parse(&ratio, &pctx, &p) == 0)
|
|
|
- print_metric(ctxp, NULL, "%8.1f",
|
|
|
- evsel->metric_name ?
|
|
|
- evsel->metric_name :
|
|
|
- out->force_header ? evsel->name : "",
|
|
|
- ratio);
|
|
|
- else
|
|
|
- print_metric(ctxp, NULL, NULL, "", 0);
|
|
|
- } else
|
|
|
- print_metric(ctxp, NULL, NULL, "", 0);
|
|
|
+ generic_metric(evsel->metric_expr, evsel->metric_events, evsel->name,
|
|
|
+ evsel->metric_name, avg, cpu, ctx, out);
|
|
|
} else if (runtime_nsecs_stats[cpu].n != 0) {
|
|
|
char unit = 'M';
|
|
|
char unit_buf[10];
|