perf tools: Add 'I' event modifier for exclude_idle bit
authorJiri Olsa <jolsa@kernel.org>
Tue, 7 Apr 2015 21:25:14 +0000 (23:25 +0200)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Wed, 8 Apr 2015 14:00:16 +0000 (11:00 -0300)
Adding 'I' event modifier to have complete set of modifiers for
perf_event_attr:exclude_* bits.

Any event specified with 'I' modifier will have the
perf_event_attr:exclude_idle bit set.

  $ perf record -e cycles:I -vv ls 2>&1 | grep exclude_idle
  exclude_hv          0    exclude_idle        1

Adding automated tests.

Signed-off-by: Jiri Olsa <jolsa@kernel.org>
Cc: Andi Kleen <andi@firstfloor.org>
Cc: David Ahern <dsahern@gmail.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: William Cohen <wcohen@redhat.com>
Link: http://lkml.kernel.org/r/1428441919-23099-2-git-send-email-jolsa@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/Documentation/perf-list.txt
tools/perf/tests/parse-events.c
tools/perf/util/parse-events.c
tools/perf/util/parse-events.l

index 4692d277980b2af93f1201a7e32a60ff4ae397c1..bada8933fdd4798a2890a13b2fb64d5bf75d9743 100644 (file)
@@ -26,6 +26,7 @@ counted. The following modifiers exist:
  u - user-space counting
  k - kernel counting
  h - hypervisor counting
+ I - non idle counting
  G - guest counting (in KVM guests)
  H - host counting (not in KVM guests)
  p - precise level
index ac243ebcb20a224992a1ebb73ebd91afecddaf67..3de744961739c2c1502e0c0367c357b2f39c90a6 100644 (file)
@@ -295,6 +295,36 @@ static int test__checkevent_genhw_modifier(struct perf_evlist *evlist)
        return test__checkevent_genhw(evlist);
 }
 
+static int test__checkevent_exclude_idle_modifier(struct perf_evlist *evlist)
+{
+       struct perf_evsel *evsel = perf_evlist__first(evlist);
+
+       TEST_ASSERT_VAL("wrong exclude idle", evsel->attr.exclude_idle);
+       TEST_ASSERT_VAL("wrong exclude guest", !evsel->attr.exclude_guest);
+       TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host);
+       TEST_ASSERT_VAL("wrong exclude_user", !evsel->attr.exclude_user);
+       TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
+       TEST_ASSERT_VAL("wrong exclude_hv", !evsel->attr.exclude_hv);
+       TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
+
+       return test__checkevent_symbolic_name(evlist);
+}
+
+static int test__checkevent_exclude_idle_modifier_1(struct perf_evlist *evlist)
+{
+       struct perf_evsel *evsel = perf_evlist__first(evlist);
+
+       TEST_ASSERT_VAL("wrong exclude idle", evsel->attr.exclude_idle);
+       TEST_ASSERT_VAL("wrong exclude guest", !evsel->attr.exclude_guest);
+       TEST_ASSERT_VAL("wrong exclude host", evsel->attr.exclude_host);
+       TEST_ASSERT_VAL("wrong exclude_user", evsel->attr.exclude_user);
+       TEST_ASSERT_VAL("wrong exclude_kernel", !evsel->attr.exclude_kernel);
+       TEST_ASSERT_VAL("wrong exclude_hv", evsel->attr.exclude_hv);
+       TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);
+
+       return test__checkevent_symbolic_name(evlist);
+}
+
 static int test__checkevent_breakpoint_modifier(struct perf_evlist *evlist)
 {
        struct perf_evsel *evsel = perf_evlist__first(evlist);
@@ -1494,6 +1524,16 @@ static struct evlist_test test__events[] = {
                .id    = 100,
        },
 #endif
+       {
+               .name  = "instructions:I",
+               .check = test__checkevent_exclude_idle_modifier,
+               .id    = 45,
+       },
+       {
+               .name  = "instructions:kIG",
+               .check = test__checkevent_exclude_idle_modifier_1,
+               .id    = 46,
+       },
 };
 
 static struct evlist_test test__events_pmu[] = {
index fe07573d5ed456241fc663fa86f12fc01340fe46..be0655388b38e4238d69782ee0e9c8357276a574 100644 (file)
@@ -709,6 +709,7 @@ struct event_modifier {
        int eh;
        int eH;
        int eG;
+       int eI;
        int precise;
        int exclude_GH;
        int sample_read;
@@ -723,6 +724,7 @@ static int get_event_modifier(struct event_modifier *mod, char *str,
        int eh = evsel ? evsel->attr.exclude_hv : 0;
        int eH = evsel ? evsel->attr.exclude_host : 0;
        int eG = evsel ? evsel->attr.exclude_guest : 0;
+       int eI = evsel ? evsel->attr.exclude_idle : 0;
        int precise = evsel ? evsel->attr.precise_ip : 0;
        int sample_read = 0;
        int pinned = evsel ? evsel->attr.pinned : 0;
@@ -753,6 +755,8 @@ static int get_event_modifier(struct event_modifier *mod, char *str,
                        if (!exclude_GH)
                                exclude_GH = eG = eH = 1;
                        eH = 0;
+               } else if (*str == 'I') {
+                       eI = 1;
                } else if (*str == 'p') {
                        precise++;
                        /* use of precise requires exclude_guest */
@@ -786,6 +790,7 @@ static int get_event_modifier(struct event_modifier *mod, char *str,
        mod->eh = eh;
        mod->eH = eH;
        mod->eG = eG;
+       mod->eI = eI;
        mod->precise = precise;
        mod->exclude_GH = exclude_GH;
        mod->sample_read = sample_read;
@@ -803,7 +808,7 @@ static int check_modifier(char *str)
        char *p = str;
 
        /* The sizeof includes 0 byte as well. */
-       if (strlen(str) > (sizeof("ukhGHpppSD") - 1))
+       if (strlen(str) > (sizeof("ukhGHpppSDI") - 1))
                return -1;
 
        while (*p) {
@@ -839,6 +844,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.exclude_idle   = mod.eI;
                evsel->exclude_GH          = mod.exclude_GH;
                evsel->sample_read         = mod.sample_read;
 
index 94eacb6c1ef71e46d0de1bdf2df002c29bbbe118..8895cf3132ab242c078c70c6f7713f52030c9f6a 100644 (file)
@@ -101,7 +101,7 @@ num_raw_hex [a-fA-F0-9]+
 name           [a-zA-Z_*?][a-zA-Z0-9_*?]*
 name_minus     [a-zA-Z_*?][a-zA-Z0-9\-_*?]*
 /* If you add a modifier you need to update check_modifier() */
-modifier_event [ukhpGHSD]+
+modifier_event [ukhpGHSDI]+
 modifier_bp    [rwx]{1,3}
 
 %%