forked from Minki/linux
perf tools: Add 'I' event modifier for exclude_idle bit
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>
This commit is contained in:
parent
f6fcc1433a
commit
a1e12da479
@ -26,6 +26,7 @@ counted. The following modifiers exist:
|
|||||||
u - user-space counting
|
u - user-space counting
|
||||||
k - kernel counting
|
k - kernel counting
|
||||||
h - hypervisor counting
|
h - hypervisor counting
|
||||||
|
I - non idle counting
|
||||||
G - guest counting (in KVM guests)
|
G - guest counting (in KVM guests)
|
||||||
H - host counting (not in KVM guests)
|
H - host counting (not in KVM guests)
|
||||||
p - precise level
|
p - precise level
|
||||||
|
@ -295,6 +295,36 @@ static int test__checkevent_genhw_modifier(struct perf_evlist *evlist)
|
|||||||
return test__checkevent_genhw(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)
|
static int test__checkevent_breakpoint_modifier(struct perf_evlist *evlist)
|
||||||
{
|
{
|
||||||
struct perf_evsel *evsel = perf_evlist__first(evlist);
|
struct perf_evsel *evsel = perf_evlist__first(evlist);
|
||||||
@ -1494,6 +1524,16 @@ static struct evlist_test test__events[] = {
|
|||||||
.id = 100,
|
.id = 100,
|
||||||
},
|
},
|
||||||
#endif
|
#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[] = {
|
static struct evlist_test test__events_pmu[] = {
|
||||||
|
@ -709,6 +709,7 @@ struct event_modifier {
|
|||||||
int eh;
|
int eh;
|
||||||
int eH;
|
int eH;
|
||||||
int eG;
|
int eG;
|
||||||
|
int eI;
|
||||||
int precise;
|
int precise;
|
||||||
int exclude_GH;
|
int exclude_GH;
|
||||||
int sample_read;
|
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_hv : 0;
|
||||||
int eH = evsel ? evsel->attr.exclude_host : 0;
|
int eH = evsel ? evsel->attr.exclude_host : 0;
|
||||||
int eG = evsel ? evsel->attr.exclude_guest : 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 precise = evsel ? evsel->attr.precise_ip : 0;
|
||||||
int sample_read = 0;
|
int sample_read = 0;
|
||||||
int pinned = evsel ? evsel->attr.pinned : 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)
|
if (!exclude_GH)
|
||||||
exclude_GH = eG = eH = 1;
|
exclude_GH = eG = eH = 1;
|
||||||
eH = 0;
|
eH = 0;
|
||||||
|
} else if (*str == 'I') {
|
||||||
|
eI = 1;
|
||||||
} else if (*str == 'p') {
|
} else if (*str == 'p') {
|
||||||
precise++;
|
precise++;
|
||||||
/* use of precise requires exclude_guest */
|
/* 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->eH = eH;
|
mod->eH = eH;
|
||||||
mod->eG = eG;
|
mod->eG = eG;
|
||||||
|
mod->eI = eI;
|
||||||
mod->precise = precise;
|
mod->precise = precise;
|
||||||
mod->exclude_GH = exclude_GH;
|
mod->exclude_GH = exclude_GH;
|
||||||
mod->sample_read = sample_read;
|
mod->sample_read = sample_read;
|
||||||
@ -803,7 +808,7 @@ static int check_modifier(char *str)
|
|||||||
char *p = str;
|
char *p = str;
|
||||||
|
|
||||||
/* The sizeof includes 0 byte as well. */
|
/* The sizeof includes 0 byte as well. */
|
||||||
if (strlen(str) > (sizeof("ukhGHpppSD") - 1))
|
if (strlen(str) > (sizeof("ukhGHpppSDI") - 1))
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
while (*p) {
|
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.precise_ip = mod.precise;
|
||||||
evsel->attr.exclude_host = mod.eH;
|
evsel->attr.exclude_host = mod.eH;
|
||||||
evsel->attr.exclude_guest = mod.eG;
|
evsel->attr.exclude_guest = mod.eG;
|
||||||
|
evsel->attr.exclude_idle = mod.eI;
|
||||||
evsel->exclude_GH = mod.exclude_GH;
|
evsel->exclude_GH = mod.exclude_GH;
|
||||||
evsel->sample_read = mod.sample_read;
|
evsel->sample_read = mod.sample_read;
|
||||||
|
|
||||||
|
@ -101,7 +101,7 @@ num_raw_hex [a-fA-F0-9]+
|
|||||||
name [a-zA-Z_*?][a-zA-Z0-9_*?]*
|
name [a-zA-Z_*?][a-zA-Z0-9_*?]*
|
||||||
name_minus [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() */
|
/* If you add a modifier you need to update check_modifier() */
|
||||||
modifier_event [ukhpGHSD]+
|
modifier_event [ukhpGHSDI]+
|
||||||
modifier_bp [rwx]{1,3}
|
modifier_bp [rwx]{1,3}
|
||||||
|
|
||||||
%%
|
%%
|
||||||
|
Loading…
Reference in New Issue
Block a user