OSDN Git Service

perf stat: Move counter processing code into stat object
authorJiri Olsa <jolsa@kernel.org>
Tue, 21 Jul 2015 12:31:27 +0000 (14:31 +0200)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Thu, 6 Aug 2015 19:08:16 +0000 (16:08 -0300)
Moving counter processing code into stat object as
perf_stat__process_counter.

Signed-off-by: Jiri Olsa <jolsa@kernel.org>
Cc: David Ahern <dsahern@gmail.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Link: http://lkml.kernel.org/r/1437481927-29538-8-git-send-email-jolsa@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/builtin-stat.c
tools/perf/util/stat.c
tools/perf/util/stat.h

index 5a78171..a054ddc 100644 (file)
@@ -179,145 +179,6 @@ static inline int nsec_counter(struct perf_evsel *evsel)
        return 0;
 }
 
-static void zero_per_pkg(struct perf_evsel *counter)
-{
-       if (counter->per_pkg_mask)
-               memset(counter->per_pkg_mask, 0, MAX_NR_CPUS);
-}
-
-static int check_per_pkg(struct perf_evsel *counter, int cpu, bool *skip)
-{
-       unsigned long *mask = counter->per_pkg_mask;
-       struct cpu_map *cpus = perf_evsel__cpus(counter);
-       int s;
-
-       *skip = false;
-
-       if (!counter->per_pkg)
-               return 0;
-
-       if (cpu_map__empty(cpus))
-               return 0;
-
-       if (!mask) {
-               mask = zalloc(MAX_NR_CPUS);
-               if (!mask)
-                       return -ENOMEM;
-
-               counter->per_pkg_mask = mask;
-       }
-
-       s = cpu_map__get_socket(cpus, cpu);
-       if (s < 0)
-               return -1;
-
-       *skip = test_and_set_bit(s, mask) == 1;
-       return 0;
-}
-
-static int
-process_counter_values(struct perf_stat_config *config, struct perf_evsel *evsel,
-                      int cpu, int thread,
-                      struct perf_counts_values *count)
-{
-       struct perf_counts_values *aggr = &evsel->counts->aggr;
-       static struct perf_counts_values zero;
-       bool skip = false;
-
-       if (check_per_pkg(evsel, cpu, &skip)) {
-               pr_err("failed to read per-pkg counter\n");
-               return -1;
-       }
-
-       if (skip)
-               count = &zero;
-
-       switch (config->aggr_mode) {
-       case AGGR_THREAD:
-       case AGGR_CORE:
-       case AGGR_SOCKET:
-       case AGGR_NONE:
-               if (!evsel->snapshot)
-                       perf_evsel__compute_deltas(evsel, cpu, thread, count);
-               perf_counts_values__scale(count, config->scale, NULL);
-               if (config->aggr_mode == AGGR_NONE)
-                       perf_stat__update_shadow_stats(evsel, count->values, cpu);
-               break;
-       case AGGR_GLOBAL:
-               aggr->val += count->val;
-               if (config->scale) {
-                       aggr->ena += count->ena;
-                       aggr->run += count->run;
-               }
-       default:
-               break;
-       }
-
-       return 0;
-}
-
-static int process_counter_maps(struct perf_stat_config *config,
-                               struct perf_evsel *counter)
-{
-       int nthreads = thread_map__nr(counter->threads);
-       int ncpus = perf_evsel__nr_cpus(counter);
-       int cpu, thread;
-
-       if (counter->system_wide)
-               nthreads = 1;
-
-       for (thread = 0; thread < nthreads; thread++) {
-               for (cpu = 0; cpu < ncpus; cpu++) {
-                       if (process_counter_values(config, counter, cpu, thread,
-                                                  perf_counts(counter->counts, cpu, thread)))
-                               return -1;
-               }
-       }
-
-       return 0;
-}
-
-static int process_counter(struct perf_stat_config *config,
-                          struct perf_evsel *counter)
-{
-       struct perf_counts_values *aggr = &counter->counts->aggr;
-       struct perf_stat *ps = counter->priv;
-       u64 *count = counter->counts->aggr.values;
-       int i, ret;
-
-       aggr->val = aggr->ena = aggr->run = 0;
-       init_stats(ps->res_stats);
-
-       if (counter->per_pkg)
-               zero_per_pkg(counter);
-
-       ret = process_counter_maps(&stat_config, counter);
-       if (ret)
-               return ret;
-
-       if (config->aggr_mode != AGGR_GLOBAL)
-               return 0;
-
-       if (!counter->snapshot)
-               perf_evsel__compute_deltas(counter, -1, -1, aggr);
-       perf_counts_values__scale(aggr, config->scale, &counter->counts->scaled);
-
-       for (i = 0; i < 3; i++)
-               update_stats(&ps->res_stats[i], count[i]);
-
-       if (verbose) {
-               fprintf(config->output, "%s: %" PRIu64 " %" PRIu64 " %" PRIu64 "\n",
-                       perf_evsel__name(counter), count[0], count[1], count[2]);
-       }
-
-       /*
-        * Save the full runtime - to allow normalization during printout:
-        */
-       perf_stat__update_shadow_stats(counter, count, 0);
-
-       return 0;
-}
-
 /*
  * Read out the results of a single counter:
  * do not aggregate counts across CPUs in system-wide mode
@@ -355,7 +216,7 @@ static void read_counters(bool close_counters)
                if (read_counter(counter))
                        pr_warning("failed to read counter %s\n", counter->name);
 
-               if (process_counter(&stat_config, counter))
+               if (perf_stat_process_counter(&stat_config, counter))
                        pr_warning("failed to process counter %s\n", counter->name);
 
                if (close_counters) {
index f2a0d15..c5c709c 100644 (file)
@@ -238,3 +238,142 @@ void perf_evlist__reset_stats(struct perf_evlist *evlist)
                perf_evsel__reset_counts(evsel);
        }
 }
+
+static void zero_per_pkg(struct perf_evsel *counter)
+{
+       if (counter->per_pkg_mask)
+               memset(counter->per_pkg_mask, 0, MAX_NR_CPUS);
+}
+
+static int check_per_pkg(struct perf_evsel *counter, int cpu, bool *skip)
+{
+       unsigned long *mask = counter->per_pkg_mask;
+       struct cpu_map *cpus = perf_evsel__cpus(counter);
+       int s;
+
+       *skip = false;
+
+       if (!counter->per_pkg)
+               return 0;
+
+       if (cpu_map__empty(cpus))
+               return 0;
+
+       if (!mask) {
+               mask = zalloc(MAX_NR_CPUS);
+               if (!mask)
+                       return -ENOMEM;
+
+               counter->per_pkg_mask = mask;
+       }
+
+       s = cpu_map__get_socket(cpus, cpu);
+       if (s < 0)
+               return -1;
+
+       *skip = test_and_set_bit(s, mask) == 1;
+       return 0;
+}
+
+static int
+process_counter_values(struct perf_stat_config *config, struct perf_evsel *evsel,
+                      int cpu, int thread,
+                      struct perf_counts_values *count)
+{
+       struct perf_counts_values *aggr = &evsel->counts->aggr;
+       static struct perf_counts_values zero;
+       bool skip = false;
+
+       if (check_per_pkg(evsel, cpu, &skip)) {
+               pr_err("failed to read per-pkg counter\n");
+               return -1;
+       }
+
+       if (skip)
+               count = &zero;
+
+       switch (config->aggr_mode) {
+       case AGGR_THREAD:
+       case AGGR_CORE:
+       case AGGR_SOCKET:
+       case AGGR_NONE:
+               if (!evsel->snapshot)
+                       perf_evsel__compute_deltas(evsel, cpu, thread, count);
+               perf_counts_values__scale(count, config->scale, NULL);
+               if (config->aggr_mode == AGGR_NONE)
+                       perf_stat__update_shadow_stats(evsel, count->values, cpu);
+               break;
+       case AGGR_GLOBAL:
+               aggr->val += count->val;
+               if (config->scale) {
+                       aggr->ena += count->ena;
+                       aggr->run += count->run;
+               }
+       default:
+               break;
+       }
+
+       return 0;
+}
+
+static int process_counter_maps(struct perf_stat_config *config,
+                               struct perf_evsel *counter)
+{
+       int nthreads = thread_map__nr(counter->threads);
+       int ncpus = perf_evsel__nr_cpus(counter);
+       int cpu, thread;
+
+       if (counter->system_wide)
+               nthreads = 1;
+
+       for (thread = 0; thread < nthreads; thread++) {
+               for (cpu = 0; cpu < ncpus; cpu++) {
+                       if (process_counter_values(config, counter, cpu, thread,
+                                                  perf_counts(counter->counts, cpu, thread)))
+                               return -1;
+               }
+       }
+
+       return 0;
+}
+
+int perf_stat_process_counter(struct perf_stat_config *config,
+                             struct perf_evsel *counter)
+{
+       struct perf_counts_values *aggr = &counter->counts->aggr;
+       struct perf_stat *ps = counter->priv;
+       u64 *count = counter->counts->aggr.values;
+       int i, ret;
+
+       aggr->val = aggr->ena = aggr->run = 0;
+       init_stats(ps->res_stats);
+
+       if (counter->per_pkg)
+               zero_per_pkg(counter);
+
+       ret = process_counter_maps(config, counter);
+       if (ret)
+               return ret;
+
+       if (config->aggr_mode != AGGR_GLOBAL)
+               return 0;
+
+       if (!counter->snapshot)
+               perf_evsel__compute_deltas(counter, -1, -1, aggr);
+       perf_counts_values__scale(aggr, config->scale, &counter->counts->scaled);
+
+       for (i = 0; i < 3; i++)
+               update_stats(&ps->res_stats[i], count[i]);
+
+       if (verbose) {
+               fprintf(config->output, "%s: %" PRIu64 " %" PRIu64 " %" PRIu64 "\n",
+                       perf_evsel__name(counter), count[0], count[1], count[2]);
+       }
+
+       /*
+        * Save the full runtime - to allow normalization during printout:
+        */
+       perf_stat__update_shadow_stats(counter, count, 0);
+
+       return 0;
+}
index 1da706d..0b897b0 100644 (file)
@@ -116,4 +116,7 @@ int perf_evsel__alloc_stats(struct perf_evsel *evsel, bool alloc_raw);
 int perf_evlist__alloc_stats(struct perf_evlist *evlist, bool alloc_raw);
 void perf_evlist__free_stats(struct perf_evlist *evlist);
 void perf_evlist__reset_stats(struct perf_evlist *evlist);
+
+int perf_stat_process_counter(struct perf_stat_config *config,
+                             struct perf_evsel *counter);
 #endif