aboutsummaryrefslogtreecommitdiffstats
path: root/tools/perf/builtin-stat.c
diff options
context:
space:
mode:
authorAndi Kleen <ak@linux.intel.com>2014-09-24 16:50:46 -0400
committerArnaldo Carvalho de Melo <acme@redhat.com>2014-09-26 09:17:13 -0400
commitda88c7f78d842a6938d9adde6af87a2ce262051d (patch)
tree9a5cb01c15a56d7ca6a309ae5f570cbf593fb6e7 /tools/perf/builtin-stat.c
parentcf8102f64c8d23f0bd4af0659bbd94d0c1d8d1c7 (diff)
perf stat: Fix --per-core on multi socket systems
On systems with more than one socket perf stat --per-core would either segfault or stop before outputting all cores. The problem was that the output code referenced the id including the socket number in the higher bits, which is far beyond any per cpu array. Mask out the socket number before referencing cpus in abs_printout. I also renamed the variable in nsec_printout to be clear what it is, even though it doesn't reference cpus. Signed-off-by: Andi Kleen <ak@linux.intel.com> Acked-by: Stephane Eranian <eranian@google.com> Cc: Jiri Olsa <jolsa@redhat.com> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Stephane Eranian <eranian@google.com> Link: http://lkml.kernel.org/r/1411591846-32736-1-git-send-email-andi@firstfloor.org Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Diffstat (limited to 'tools/perf/builtin-stat.c')
-rw-r--r--tools/perf/builtin-stat.c9
1 files changed, 5 insertions, 4 deletions
diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c
index 5fe0edb1de5d..b22c62f80078 100644
--- a/tools/perf/builtin-stat.c
+++ b/tools/perf/builtin-stat.c
@@ -732,7 +732,7 @@ static void aggr_printout(struct perf_evsel *evsel, int id, int nr)
732 } 732 }
733} 733}
734 734
735static void nsec_printout(int cpu, int nr, struct perf_evsel *evsel, double avg) 735static void nsec_printout(int id, int nr, struct perf_evsel *evsel, double avg)
736{ 736{
737 double msecs = avg / 1e6; 737 double msecs = avg / 1e6;
738 const char *fmt_v, *fmt_n; 738 const char *fmt_v, *fmt_n;
@@ -741,7 +741,7 @@ static void nsec_printout(int cpu, int nr, struct perf_evsel *evsel, double avg)
741 fmt_v = csv_output ? "%.6f%s" : "%18.6f%s"; 741 fmt_v = csv_output ? "%.6f%s" : "%18.6f%s";
742 fmt_n = csv_output ? "%s" : "%-25s"; 742 fmt_n = csv_output ? "%s" : "%-25s";
743 743
744 aggr_printout(evsel, cpu, nr); 744 aggr_printout(evsel, id, nr);
745 745
746 scnprintf(name, sizeof(name), "%s%s", 746 scnprintf(name, sizeof(name), "%s%s",
747 perf_evsel__name(evsel), csv_output ? "" : " (msec)"); 747 perf_evsel__name(evsel), csv_output ? "" : " (msec)");
@@ -947,11 +947,12 @@ static void print_ll_cache_misses(int cpu,
947 fprintf(output, " of all LL-cache hits "); 947 fprintf(output, " of all LL-cache hits ");
948} 948}
949 949
950static void abs_printout(int cpu, int nr, struct perf_evsel *evsel, double avg) 950static void abs_printout(int id, int nr, struct perf_evsel *evsel, double avg)
951{ 951{
952 double total, ratio = 0.0, total2; 952 double total, ratio = 0.0, total2;
953 double sc = evsel->scale; 953 double sc = evsel->scale;
954 const char *fmt; 954 const char *fmt;
955 int cpu = cpu_map__id_to_cpu(id);
955 956
956 if (csv_output) { 957 if (csv_output) {
957 fmt = sc != 1.0 ? "%.2f%s" : "%.0f%s"; 958 fmt = sc != 1.0 ? "%.2f%s" : "%.0f%s";
@@ -962,7 +963,7 @@ static void abs_printout(int cpu, int nr, struct perf_evsel *evsel, double avg)
962 fmt = sc != 1.0 ? "%18.2f%s" : "%18.0f%s"; 963 fmt = sc != 1.0 ? "%18.2f%s" : "%18.0f%s";
963 } 964 }
964 965
965 aggr_printout(evsel, cpu, nr); 966 aggr_printout(evsel, id, nr);
966 967
967 if (aggr_mode == AGGR_GLOBAL) 968 if (aggr_mode == AGGR_GLOBAL)
968 cpu = 0; 969 cpu = 0;