Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a1e12da4 authored by Jiri Olsa's avatar Jiri Olsa Committed by Arnaldo Carvalho de Melo
Browse files

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: default avatarJiri 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: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent f6fcc143
Loading
Loading
Loading
Loading
+1 −0
Original line number Original line Diff line number Diff line
@@ -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
+40 −0
Original line number Original line Diff line number Diff line
@@ -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[] = {
+7 −1
Original line number Original line Diff line number Diff line
@@ -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;


+1 −1
Original line number Original line Diff line number Diff line
@@ -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}


%%
%%