perf tools: Add front-end and back-end stalled cycles support
Ingo Molnar [Fri, 29 Apr 2011 12:41:28 +0000 (14:41 +0200)]
Update perf tooling to deal with front-end and back-end stalled cycles events.

Add both the default 'perf stat' output.

Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Link: http://lkml.kernel.org/n/tip-7y40wib8n002io7hjpn1dsrm@git.kernel.org
Signed-off-by: Ingo Molnar <mingo@elte.hu>

tools/perf/builtin-stat.c
tools/perf/util/parse-events.c
tools/perf/util/python.c

index da77077..6a4a8a3 100644 (file)
@@ -66,7 +66,8 @@ static struct perf_event_attr default_attrs[] = {
   { .type = PERF_TYPE_SOFTWARE, .config = PERF_COUNT_SW_PAGE_FAULTS            },
 
   { .type = PERF_TYPE_HARDWARE, .config = PERF_COUNT_HW_CPU_CYCLES             },
-  { .type = PERF_TYPE_HARDWARE, .config = PERF_COUNT_HW_STALLED_CYCLES         },
+  { .type = PERF_TYPE_HARDWARE, .config = PERF_COUNT_HW_STALLED_CYCLES_FRONTEND        },
+  { .type = PERF_TYPE_HARDWARE, .config = PERF_COUNT_HW_STALLED_CYCLES_BACKEND },
   { .type = PERF_TYPE_HARDWARE, .config = PERF_COUNT_HW_INSTRUCTIONS           },
   { .type = PERF_TYPE_HARDWARE, .config = PERF_COUNT_HW_BRANCH_INSTRUCTIONS    },
   { .type = PERF_TYPE_HARDWARE, .config = PERF_COUNT_HW_BRANCH_MISSES          },
@@ -84,7 +85,8 @@ static struct perf_event_attr detailed_attrs[] = {
   { .type = PERF_TYPE_SOFTWARE, .config = PERF_COUNT_SW_PAGE_FAULTS            },
 
   { .type = PERF_TYPE_HARDWARE, .config = PERF_COUNT_HW_CPU_CYCLES             },
-  { .type = PERF_TYPE_HARDWARE, .config = PERF_COUNT_HW_STALLED_CYCLES         },
+  { .type = PERF_TYPE_HARDWARE, .config = PERF_COUNT_HW_STALLED_CYCLES_FRONTEND        },
+  { .type = PERF_TYPE_HARDWARE, .config = PERF_COUNT_HW_STALLED_CYCLES_BACKEND },
   { .type = PERF_TYPE_HARDWARE, .config = PERF_COUNT_HW_INSTRUCTIONS           },
   { .type = PERF_TYPE_HARDWARE, .config = PERF_COUNT_HW_BRANCH_INSTRUCTIONS    },
   { .type = PERF_TYPE_HARDWARE, .config = PERF_COUNT_HW_BRANCH_MISSES          },
@@ -249,7 +251,7 @@ static void update_shadow_stats(struct perf_evsel *counter, u64 *count)
                update_stats(&runtime_nsecs_stats[0], count[0]);
        else if (perf_evsel__match(counter, HARDWARE, HW_CPU_CYCLES))
                update_stats(&runtime_cycles_stats[0], count[0]);
-       else if (perf_evsel__match(counter, HARDWARE, HW_STALLED_CYCLES))
+       else if (perf_evsel__match(counter, HARDWARE, HW_STALLED_CYCLES_BACKEND))
                update_stats(&runtime_stalled_cycles_stats[0], count[0]);
        else if (perf_evsel__match(counter, HARDWARE, HW_BRANCH_INSTRUCTIONS))
                update_stats(&runtime_branches_stats[0], count[0]);
@@ -607,7 +609,7 @@ static void abs_printout(int cpu, struct perf_evsel *evsel, double avg)
 
                fprintf(stderr, " # %8.3f %% of all cache refs    ", ratio);
 
-       } else if (perf_evsel__match(evsel, HARDWARE, HW_STALLED_CYCLES)) {
+       } else if (perf_evsel__match(evsel, HARDWARE, HW_STALLED_CYCLES_BACKEND)) {
                print_stalled_cycles(cpu, evsel, avg);
        } else if (perf_evsel__match(evsel, HARDWARE, HW_CPU_CYCLES)) {
                total = avg_stats(&runtime_nsecs_stats[cpu]);
index bbbb735..04d2f0a 100644 (file)
@@ -31,24 +31,25 @@ char debugfs_path[MAXPATHLEN];
 #define CSW(x) .type = PERF_TYPE_SOFTWARE, .config = PERF_COUNT_SW_##x
 
 static struct event_symbol event_symbols[] = {
-  { CHW(CPU_CYCLES),           "cpu-cycles",           "cycles"        },
-  { CHW(STALLED_CYCLES),       "stalled-cycles",       "idle-cycles"   },
-  { CHW(INSTRUCTIONS),         "instructions",         ""              },
-  { CHW(CACHE_REFERENCES),     "cache-references",     ""              },
-  { CHW(CACHE_MISSES),         "cache-misses",         ""              },
-  { CHW(BRANCH_INSTRUCTIONS),  "branch-instructions",  "branches"      },
-  { CHW(BRANCH_MISSES),                "branch-misses",        ""              },
-  { CHW(BUS_CYCLES),           "bus-cycles",           ""              },
-
-  { CSW(CPU_CLOCK),            "cpu-clock",            ""              },
-  { CSW(TASK_CLOCK),           "task-clock",           ""              },
-  { CSW(PAGE_FAULTS),          "page-faults",          "faults"        },
-  { CSW(PAGE_FAULTS_MIN),      "minor-faults",         ""              },
-  { CSW(PAGE_FAULTS_MAJ),      "major-faults",         ""              },
-  { CSW(CONTEXT_SWITCHES),     "context-switches",     "cs"            },
-  { CSW(CPU_MIGRATIONS),       "cpu-migrations",       "migrations"    },
-  { CSW(ALIGNMENT_FAULTS),     "alignment-faults",     ""              },
-  { CSW(EMULATION_FAULTS),     "emulation-faults",     ""              },
+  { CHW(CPU_CYCLES),                   "cpu-cycles",                   "cycles"                },
+  { CHW(STALLED_CYCLES_FRONTEND),      "stalled-cycles-frontend",      "idle-cycles-frontend"  },
+  { CHW(STALLED_CYCLES_BACKEND),       "stalled-cycles-backend",       "idle-cycles-backend"   },
+  { CHW(INSTRUCTIONS),                 "instructions",                 ""                      },
+  { CHW(CACHE_REFERENCES),             "cache-references",             ""                      },
+  { CHW(CACHE_MISSES),                 "cache-misses",                 ""                      },
+  { CHW(BRANCH_INSTRUCTIONS),          "branch-instructions",          "branches"              },
+  { CHW(BRANCH_MISSES),                        "branch-misses",                ""                      },
+  { CHW(BUS_CYCLES),                   "bus-cycles",                   ""                      },
+
+  { CSW(CPU_CLOCK),                    "cpu-clock",                    ""                      },
+  { CSW(TASK_CLOCK),                   "task-clock",                   ""                      },
+  { CSW(PAGE_FAULTS),                  "page-faults",                  "faults"                },
+  { CSW(PAGE_FAULTS_MIN),              "minor-faults",                 ""                      },
+  { CSW(PAGE_FAULTS_MAJ),              "major-faults",                 ""                      },
+  { CSW(CONTEXT_SWITCHES),             "context-switches",             "cs"                    },
+  { CSW(CPU_MIGRATIONS),               "cpu-migrations",               "migrations"            },
+  { CSW(ALIGNMENT_FAULTS),             "alignment-faults",             ""                      },
+  { CSW(EMULATION_FAULTS),             "emulation-faults",             ""                      },
 };
 
 #define __PERF_EVENT_FIELD(config, name) \
index 406f613..8b0eff8 100644 (file)
@@ -798,7 +798,6 @@ static struct {
        { "COUNT_HW_BRANCH_INSTRUCTIONS", PERF_COUNT_HW_BRANCH_INSTRUCTIONS },
        { "COUNT_HW_BRANCH_MISSES",       PERF_COUNT_HW_BRANCH_MISSES },
        { "COUNT_HW_BUS_CYCLES",          PERF_COUNT_HW_BUS_CYCLES },
-       { "COUNT_HW_STALLED_CYCLES",      PERF_COUNT_HW_STALLED_CYCLES },
        { "COUNT_HW_CACHE_L1D",           PERF_COUNT_HW_CACHE_L1D },
        { "COUNT_HW_CACHE_L1I",           PERF_COUNT_HW_CACHE_L1I },
        { "COUNT_HW_CACHE_LL",            PERF_COUNT_HW_CACHE_LL },
@@ -811,6 +810,9 @@ static struct {
        { "COUNT_HW_CACHE_RESULT_ACCESS", PERF_COUNT_HW_CACHE_RESULT_ACCESS },
        { "COUNT_HW_CACHE_RESULT_MISS",   PERF_COUNT_HW_CACHE_RESULT_MISS },
 
+       { "COUNT_HW_STALLED_CYCLES_FRONTEND",     PERF_COUNT_HW_STALLED_CYCLES_FRONTEND },
+       { "COUNT_HW_STALLED_CYCLES_BACKEND",      PERF_COUNT_HW_STALLED_CYCLES_BACKEND },
+
        { "COUNT_SW_CPU_CLOCK",        PERF_COUNT_SW_CPU_CLOCK },
        { "COUNT_SW_TASK_CLOCK",       PERF_COUNT_SW_TASK_CLOCK },
        { "COUNT_SW_PAGE_FAULTS",      PERF_COUNT_SW_PAGE_FAULTS },