This patch adds the x modifier for events. It allows users to
request exclusive PMU access (attr->exclusive):

perf stat -e cycles:x ......
or
perf stat -e cpu/cycles/x ....

Exclusive mode is a feature of perf_events which was not yet
supported by the perf tool. Some events may require exclusive
PMU access (like on Intel SandyBridge).

Signed-off-by: Stephane Eranian <[email protected]>
---
 tools/perf/util/parse-events.c |    7 +++++++
 tools/perf/util/parse-events.l |    2 +-
 2 files changed, 8 insertions(+), 1 deletion(-)

diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c
index aed38e4..aa73392 100644
--- a/tools/perf/util/parse-events.c
+++ b/tools/perf/util/parse-events.c
@@ -642,6 +642,7 @@ struct event_modifier {
        int eG;
        int precise;
        int exclude_GH;
+       int exclusive;
 };
 
 static int get_event_modifier(struct event_modifier *mod, char *str,
@@ -656,6 +657,7 @@ static int get_event_modifier(struct event_modifier *mod, 
char *str,
 
        int exclude = eu | ek | eh;
        int exclude_GH = evsel ? evsel->exclude_GH : 0;
+       int exclusive = evsel ? evsel->attr.exclusive : 0;
 
        /*
         * We are here for group and 'GH' was not set as event
@@ -690,6 +692,8 @@ static int get_event_modifier(struct event_modifier *mod, 
char *str,
                        eH = 0;
                } else if (*str == 'p') {
                        precise++;
+               } else if (*str == 'x') {
+                       exclusive = 1;
                } else
                        break;
 
@@ -716,6 +720,8 @@ static int get_event_modifier(struct event_modifier *mod, 
char *str,
        mod->eG = eG;
        mod->precise = precise;
        mod->exclude_GH = exclude_GH;
+       mod->exclusive = exclusive;
+
        return 0;
 }
 
@@ -741,6 +747,7 @@ int parse_events__modifier_event(struct list_head *list, 
char *str, bool add)
                evsel->attr.precise_ip     = mod.precise;
                evsel->attr.exclude_host   = mod.eH;
                evsel->attr.exclude_guest  = mod.eG;
+               evsel->attr.exclusive      = mod.exclusive;
                evsel->exclude_GH          = mod.exclude_GH;
        }
 
diff --git a/tools/perf/util/parse-events.l b/tools/perf/util/parse-events.l
index c87efc1..9c8a06d 100644
--- a/tools/perf/util/parse-events.l
+++ b/tools/perf/util/parse-events.l
@@ -81,7 +81,7 @@ num_dec               [0-9]+
 num_hex                0x[a-fA-F0-9]+
 num_raw_hex    [a-fA-F0-9]+
 name           [a-zA-Z_*?][a-zA-Z0-9_*?]*
-modifier_event [ukhpGH]{1,8}
+modifier_event [ukhpGHx]{1,8}
 modifier_bp    [rwx]{1,3}
 
 %%
-- 
1.7.9.5

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to