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:
Родитель
f6fcc1433a
Коммит
a1e12da479
|
@ -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
|
||||
|
|
|
@ -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[] = {
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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}
|
||||
|
||||
%%
|
||||
|
|
Загрузка…
Ссылка в новой задаче