Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1170260

[PATCH 26/27] perf stat: Introduce print_counters function

From Jiri Olsa <jolsa@kernel.org>
Newsgroups linux.kernel
Subject [PATCH 26/27] perf stat: Introduce print_counters function
Date 2015-06-23 00:50 +0200
Message-ID <pEiHn-MJ-15@gated-at.bofh.it> (permalink)
References <pEixI-Bm-5@gated-at.bofh.it>
Organization linux.* mail to news gateway

Show all headers | View raw


Centralize counters print code into single
print_counters function.

Link: http://lkml.kernel.org/n/tip-1vae9jeuab2db5wxq820sb9v@git.kernel.org
Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
 tools/perf/builtin-stat.c | 127 +++++++++++++++++++++++-----------------------
 1 file changed, 64 insertions(+), 63 deletions(-)

diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c
index 39a97ade2cf3..56dc8881cb05 100644
--- a/tools/perf/builtin-stat.c
+++ b/tools/perf/builtin-stat.c
@@ -67,10 +67,7 @@
 #define CNTR_NOT_SUPPORTED	"<not supported>"
 #define CNTR_NOT_COUNTED	"<not counted>"
 
-static void print_stat(int argc, const char **argv);
-static void print_counter_aggr(struct perf_evsel *counter, char *prefix);
-static void print_counter(struct perf_evsel *counter, char *prefix);
-static void print_aggr(char *prefix);
+static void print_counters(struct timespec *ts, int argc, const char **argv);
 
 /* Default events used for perf stat -T */
 static const char *transaction_attrs = {
@@ -365,53 +362,14 @@ static void read_counters(bool close)
 
 static void process_interval(void)
 {
-	static int num_print_interval;
-	struct perf_evsel *counter;
 	struct timespec ts, rs;
-	char prefix[64];
 
 	read_counters(false);
 
 	clock_gettime(CLOCK_MONOTONIC, &ts);
 	diff_timespec(&rs, &ts, &ref_time);
-	sprintf(prefix, "%6lu.%09lu%s", rs.tv_sec, rs.tv_nsec, csv_sep);
-
-	if (num_print_interval == 0 && !csv_output) {
-		switch (aggr_mode) {
-		case AGGR_SOCKET:
-			fprintf(output, "#           time socket cpus             counts %*s events\n", unit_width, "unit");
-			break;
-		case AGGR_CORE:
-			fprintf(output, "#           time core         cpus             counts %*s events\n", unit_width, "unit");
-			break;
-		case AGGR_NONE:
-			fprintf(output, "#           time CPU                counts %*s events\n", unit_width, "unit");
-			break;
-		case AGGR_GLOBAL:
-		default:
-			fprintf(output, "#           time             counts %*s events\n", unit_width, "unit");
-		}
-	}
-
-	if (++num_print_interval == 25)
-		num_print_interval = 0;
 
-	switch (aggr_mode) {
-	case AGGR_CORE:
-	case AGGR_SOCKET:
-		print_aggr(prefix);
-		break;
-	case AGGR_NONE:
-		evlist__for_each(evsel_list, counter)
-			print_counter(counter, prefix);
-		break;
-	case AGGR_GLOBAL:
-	default:
-		evlist__for_each(evsel_list, counter)
-			print_counter_aggr(counter, prefix);
-	}
-
-	fflush(output);
+	print_counters(&rs, 0, NULL);
 }
 
 static void handle_initial_delay(void)
@@ -901,9 +859,35 @@ static void print_counter(struct perf_evsel *counter, char *prefix)
 	}
 }
 
-static void print_stat(int argc, const char **argv)
+static void print_interval(char *prefix, struct timespec *ts)
+{
+	static int num_print_interval;
+
+	sprintf(prefix, "%6lu.%09lu%s", ts->tv_sec, ts->tv_nsec, csv_sep);
+
+	if (num_print_interval == 0 && !csv_output) {
+		switch (aggr_mode) {
+		case AGGR_SOCKET:
+			fprintf(output, "#           time socket cpus             counts %*s events\n", unit_width, "unit");
+			break;
+		case AGGR_CORE:
+			fprintf(output, "#           time core         cpus             counts %*s events\n", unit_width, "unit");
+			break;
+		case AGGR_NONE:
+			fprintf(output, "#           time CPU                counts %*s events\n", unit_width, "unit");
+			break;
+		case AGGR_GLOBAL:
+		default:
+			fprintf(output, "#           time             counts %*s events\n", unit_width, "unit");
+		}
+	}
+
+	if (++num_print_interval == 25)
+		num_print_interval = 0;
+}
+
+static void print_header(int argc, const char **argv)
 {
-	struct perf_evsel *counter;
 	int i;
 
 	fflush(stdout);
@@ -929,36 +913,53 @@ static void print_stat(int argc, const char **argv)
 			fprintf(output, " (%d runs)", run_count);
 		fprintf(output, ":\n\n");
 	}
+}
+
+static void print_footer(void)
+{
+	if (!null_run)
+		fprintf(output, "\n");
+	fprintf(output, " %17.9f seconds time elapsed",
+			avg_stats(&walltime_nsecs_stats)/1e9);
+	if (run_count > 1) {
+		fprintf(output, "                                        ");
+		print_noise_pct(stddev_stats(&walltime_nsecs_stats),
+				avg_stats(&walltime_nsecs_stats));
+	}
+	fprintf(output, "\n\n");
+}
+
+static void print_counters(struct timespec *ts, int argc, const char **argv)
+{
+	struct perf_evsel *counter;
+	char buf[64], *prefix = NULL;
+
+	if (interval)
+		print_interval(prefix = buf, ts);
+	else
+		print_header(argc, argv);
 
 	switch (aggr_mode) {
 	case AGGR_CORE:
 	case AGGR_SOCKET:
-		print_aggr(NULL);
+		print_aggr(prefix);
 		break;
 	case AGGR_GLOBAL:
 		evlist__for_each(evsel_list, counter)
-			print_counter_aggr(counter, NULL);
+			print_counter_aggr(counter, prefix);
 		break;
 	case AGGR_NONE:
 		evlist__for_each(evsel_list, counter)
-			print_counter(counter, NULL);
+			print_counter(counter, prefix);
 		break;
 	default:
 		break;
 	}
 
-	if (!csv_output) {
-		if (!null_run)
-			fprintf(output, "\n");
-		fprintf(output, " %17.9f seconds time elapsed",
-				avg_stats(&walltime_nsecs_stats)/1e9);
-		if (run_count > 1) {
-			fprintf(output, "                                        ");
-			print_noise_pct(stddev_stats(&walltime_nsecs_stats),
-					avg_stats(&walltime_nsecs_stats));
-		}
-		fprintf(output, "\n\n");
-	}
+	if (!interval && !csv_output)
+		print_footer();
+
+	fflush(output);
 }
 
 static volatile int signr = -1;
@@ -1407,13 +1408,13 @@ int cmd_stat(int argc, const char **argv, const char *prefix __maybe_unused)
 
 		status = run_perf_stat(argc, argv);
 		if (forever && status != -1) {
-			print_stat(argc, argv);
+			print_counters(NULL, argc, argv);
 			perf_stat__reset_stats();
 		}
 	}
 
 	if (!forever && status != -1 && !interval)
-		print_stat(argc, argv);
+		print_counters(NULL, argc, argv);
 
 	perf_evlist__free_stats(evsel_list);
 out:
-- 
1.9.3

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
Please read the FAQ at  http://www.tux.org/lkml/

Back to linux.kernel | Previous | NextPrevious in thread | Next in thread | Find similar | Unroll thread


Thread

[PATCHv4 00/27] perf stat: Introduce --per-thread option Jiri Olsa <jolsa@kernel.org> - 2015-06-23 00:40 +0200
  [PATCH 14/27] perf stat: Move perf_evsel__(alloc|free|reset)_stat_priv into stat object Jiri Olsa <jolsa@kernel.org> - 2015-06-23 00:40 +0200
  [PATCH 17/27] perf stat: Introduce perf_evsel__alloc_stats function Jiri Olsa <jolsa@kernel.org> - 2015-06-23 00:40 +0200
  [PATCH 07/27] perf tools: Make perf_evsel__(nr_)cpus generic Jiri Olsa <jolsa@kernel.org> - 2015-06-23 00:40 +0200
  [PATCH 04/27] perf tools: Add reference counting for thread_map object Jiri Olsa <jolsa@kernel.org> - 2015-06-23 00:40 +0200
  [PATCH 25/27] perf stat: Using init_stats instead of memset Jiri Olsa <jolsa@kernel.org> - 2015-06-23 00:40 +0200
  [PATCH 23/27] perf stat: Remove perf_evsel__read_cb function Jiri Olsa <jolsa@kernel.org> - 2015-06-23 00:40 +0200
  [PATCH 18/27] perf stat: Introduce perf_evsel__read function Jiri Olsa <jolsa@kernel.org> - 2015-06-23 00:40 +0200
  [PATCH 15/27] perf stat: Move perf_evsel__(alloc|free)_prev_raw_counts into stat object Jiri Olsa <jolsa@kernel.org> - 2015-06-23 00:40 +0200
  [PATCH 02/27] perf tools: Add comm string into struct thread_map Jiri Olsa <jolsa@kernel.org> - 2015-06-23 00:40 +0200
  [PATCH 21/27] perf stat: Move zero_per_pkg into counter process code Jiri Olsa <jolsa@kernel.org> - 2015-06-23 00:40 +0200
  [PATCH 27/27] perf stat: Introduce --per-thread option Jiri Olsa <jolsa@kernel.org> - 2015-06-23 00:40 +0200
  [PATCH 11/27] perf stat: Make stats work over the thread dimension Jiri Olsa <jolsa@kernel.org> - 2015-06-23 00:40 +0200
  [PATCH 13/27] perf stat: Introduce perf_evlist__reset_stats Jiri Olsa <jolsa@kernel.org> - 2015-06-23 00:40 +0200
  [PATCH 06/27] perf tools: Propagate thread maps through the evlist Jiri Olsa <jolsa@kernel.org> - 2015-06-23 00:40 +0200
  [PATCH 05/27] perf tools: Propagate cpu maps through the evlist Jiri Olsa <jolsa@kernel.org> - 2015-06-23 00:40 +0200
  [PATCH 20/27] perf stat: Separate counters reading and processing Jiri Olsa <jolsa@kernel.org> - 2015-06-23 00:50 +0200
  [PATCH 24/27] perf stat: Rename print_interval to process_interval Jiri Olsa <jolsa@kernel.org> - 2015-06-23 00:50 +0200
  [PATCH 22/27] perf stat: Move perf_stat initialization counter process code Jiri Olsa <jolsa@kernel.org> - 2015-06-23 00:50 +0200
  [PATCH 19/27] perf stat: Introduce read_counters function Jiri Olsa <jolsa@kernel.org> - 2015-06-23 00:50 +0200
  [PATCH 08/27] perf tests: Add thread_map object tests Jiri Olsa <jolsa@kernel.org> - 2015-06-23 00:50 +0200
  [PATCH 26/27] perf stat: Introduce print_counters function Jiri Olsa <jolsa@kernel.org> - 2015-06-23 00:50 +0200
  [PATCH 09/27] perf stat: Introduce perf_counts function Jiri Olsa <jolsa@kernel.org> - 2015-06-23 00:50 +0200
  [PATCH 10/27] perf stat: Use xyarray for cpu evsel counts Jiri Olsa <jolsa@kernel.org> - 2015-06-23 00:50 +0200
  [PATCH 16/27] perf stat: Move perf_evlist__(alloc|free|reset)_stats into stat object Jiri Olsa <jolsa@kernel.org> - 2015-06-23 00:50 +0200
  [PATCH 12/27] perf stat: Rename struct perf_counts::cpu member to values Jiri Olsa <jolsa@kernel.org> - 2015-06-23 00:50 +0200
  [PATCH 03/27] perf tools: Add reference counting for cpu_map object Jiri Olsa <jolsa@kernel.org> - 2015-06-23 00:50 +0200
  Re: [PATCHv4 00/27] perf stat: Introduce --per-thread option Arnaldo Carvalho de Melo <acme@kernel.org> - 2015-06-23 01:10 +0200

csiph-web