perf: Fix perf event attr config
authorBarret Rhoden <brho@cs.berkeley.edu>
Thu, 19 Oct 2017 18:32:42 +0000 (14:32 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Thu, 26 Oct 2017 17:06:54 +0000 (13:06 -0400)
The mask is supposed to be shifted 8.  The PMEV_GET_MASK helper doesn't
just return the field in place, it masks and shifts the field down to bit
0.

This was causing certain raw and pfm events to be reported to perf
incorrectly.  For example, the HSW icache miss counter is 0x80 mask 0x2.
That was showing up as 0x82 instead of 0x280.  This didn't affect the
actual counter used - just the line from perf that says:

Samples: 6K of event 'raw 0x280:kuH'

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
tools/dev-util/perf/perf_core.c

index 181d2f1..17b4811 100644 (file)
@@ -176,7 +176,8 @@ static bool parse_pfm_encoding(const char *str, struct perf_eventsel *sel)
        sel->ev.event = encode.codes[0];
        x86_handle_pseudo_encoding(sel);
        sel->type = PERF_TYPE_RAW;
-       sel->config = PMEV_GET_MASK(sel->ev.event) | PMEV_GET_EVENT(sel->ev.event);
+       sel->config = (PMEV_GET_MASK(sel->ev.event) << 8) |
+                     PMEV_GET_EVENT(sel->ev.event);
        return TRUE;
 }
 
@@ -279,7 +280,8 @@ static bool parse_raw_encoding(const char *str, struct perf_eventsel *sel)
         * exactly what the user asked us for - which also means no fixed counters
         * for them (unless we want a :f: token or something). */
        sel->type = PERF_TYPE_RAW;
-       sel->config = PMEV_GET_MASK(sel->ev.event) | PMEV_GET_EVENT(sel->ev.event);
+       sel->config = (PMEV_GET_MASK(sel->ev.event) << 8) |
+                     PMEV_GET_EVENT(sel->ev.event);
        return TRUE;
 }