aboutsummaryrefslogtreecommitdiffstats
path: root/tools/perf/builtin-stat.c
diff options
context:
space:
mode:
Diffstat (limited to 'tools/perf/builtin-stat.c')
-rw-r--r--tools/perf/builtin-stat.c40
1 files changed, 32 insertions, 8 deletions
diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c
index 806a9998fcd5..21c025222496 100644
--- a/tools/perf/builtin-stat.c
+++ b/tools/perf/builtin-stat.c
@@ -390,6 +390,9 @@ static void nsec_printout(int cpu, struct perf_evsel *evsel, double avg)
390 390
391 fprintf(stderr, fmt, cpustr, msecs, csv_sep, event_name(evsel)); 391 fprintf(stderr, fmt, cpustr, msecs, csv_sep, event_name(evsel));
392 392
393 if (evsel->cgrp)
394 fprintf(stderr, "%s%s", csv_sep, evsel->cgrp->name);
395
393 if (csv_output) 396 if (csv_output)
394 return; 397 return;
395 398
@@ -420,6 +423,9 @@ static void abs_printout(int cpu, struct perf_evsel *evsel, double avg)
420 423
421 fprintf(stderr, fmt, cpustr, avg, csv_sep, event_name(evsel)); 424 fprintf(stderr, fmt, cpustr, avg, csv_sep, event_name(evsel));
422 425
426 if (evsel->cgrp)
427 fprintf(stderr, "%s%s", csv_sep, evsel->cgrp->name);
428
423 if (csv_output) 429 if (csv_output)
424 return; 430 return;
425 431
@@ -460,9 +466,17 @@ static void print_counter_aggr(struct perf_evsel *counter)
460 int scaled = counter->counts->scaled; 466 int scaled = counter->counts->scaled;
461 467
462 if (scaled == -1) { 468 if (scaled == -1) {
463 fprintf(stderr, "%*s%s%-24s\n", 469 fprintf(stderr, "%*s%s%*s",
464 csv_output ? 0 : 18, 470 csv_output ? 0 : 18,
465 "<not counted>", csv_sep, event_name(counter)); 471 "<not counted>",
472 csv_sep,
473 csv_output ? 0 : -24,
474 event_name(counter));
475
476 if (counter->cgrp)
477 fprintf(stderr, "%s%s", csv_sep, counter->cgrp->name);
478
479 fputc('\n', stderr);
466 return; 480 return;
467 } 481 }
468 482
@@ -487,7 +501,6 @@ static void print_counter_aggr(struct perf_evsel *counter)
487 fprintf(stderr, " (scaled from %.2f%%)", 501 fprintf(stderr, " (scaled from %.2f%%)",
488 100 * avg_running / avg_enabled); 502 100 * avg_running / avg_enabled);
489 } 503 }
490
491 fprintf(stderr, "\n"); 504 fprintf(stderr, "\n");
492} 505}
493 506
@@ -505,14 +518,18 @@ static void print_counter(struct perf_evsel *counter)
505 ena = counter->counts->cpu[cpu].ena; 518 ena = counter->counts->cpu[cpu].ena;
506 run = counter->counts->cpu[cpu].run; 519 run = counter->counts->cpu[cpu].run;
507 if (run == 0 || ena == 0) { 520 if (run == 0 || ena == 0) {
508 fprintf(stderr, "CPU%*d%s%*s%s%-24s", 521 fprintf(stderr, "CPU%*d%s%*s%s%*s",
509 csv_output ? 0 : -4, 522 csv_output ? 0 : -4,
510 evsel_list->cpus->map[cpu], csv_sep, 523 evsel_list->cpus->map[cpu], csv_sep,
511 csv_output ? 0 : 18, 524 csv_output ? 0 : 18,
512 "<not counted>", csv_sep, 525 "<not counted>", csv_sep,
526 csv_output ? 0 : -24,
513 event_name(counter)); 527 event_name(counter));
514 528
515 fprintf(stderr, "\n"); 529 if (counter->cgrp)
530 fprintf(stderr, "%s%s", csv_sep, counter->cgrp->name);
531
532 fputc('\n', stderr);
516 continue; 533 continue;
517 } 534 }
518 535
@@ -529,7 +546,7 @@ static void print_counter(struct perf_evsel *counter)
529 100.0 * run / ena); 546 100.0 * run / ena);
530 } 547 }
531 } 548 }
532 fprintf(stderr, "\n"); 549 fputc('\n', stderr);
533 } 550 }
534} 551}
535 552
@@ -642,6 +659,9 @@ static const struct option options[] = {
642 "disable CPU count aggregation"), 659 "disable CPU count aggregation"),
643 OPT_STRING('x', "field-separator", &csv_sep, "separator", 660 OPT_STRING('x', "field-separator", &csv_sep, "separator",
644 "print counts with custom separator"), 661 "print counts with custom separator"),
662 OPT_CALLBACK('G', "cgroup", &evsel_list, "name",
663 "monitor event in cgroup name only",
664 parse_cgroups),
645 OPT_END() 665 OPT_END()
646}; 666};
647 667
@@ -682,9 +702,13 @@ int cmd_stat(int argc, const char **argv, const char *prefix __used)
682 if (run_count <= 0) 702 if (run_count <= 0)
683 usage_with_options(stat_usage, options); 703 usage_with_options(stat_usage, options);
684 704
685 /* no_aggr is for system-wide only */ 705 /* no_aggr, cgroup are for system-wide only */
686 if (no_aggr && !system_wide) 706 if ((no_aggr || nr_cgroups) && !system_wide) {
707 fprintf(stderr, "both cgroup and no-aggregation "
708 "modes only available in system-wide mode\n");
709
687 usage_with_options(stat_usage, options); 710 usage_with_options(stat_usage, options);
711 }
688 712
689 /* Set attrs and nr_counters if no event is selected and !null_run */ 713 /* Set attrs and nr_counters if no event is selected and !null_run */
690 if (!null_run && !evsel_list->nr_entries) { 714 if (!null_run && !evsel_list->nr_entries) {