diff options
Diffstat (limited to 'tools/perf/tests/parse-events.c')
| -rw-r--r-- | tools/perf/tests/parse-events.c | 324 | 
1 files changed, 295 insertions, 29 deletions
diff --git a/tools/perf/tests/parse-events.c b/tools/perf/tests/parse-events.c index 32ee478905e..c5636f36fe3 100644 --- a/tools/perf/tests/parse-events.c +++ b/tools/perf/tests/parse-events.c @@ -3,6 +3,7 @@  #include "evsel.h"  #include "evlist.h"  #include "sysfs.h" +#include "debugfs.h"  #include "tests.h"  #include <linux/hw_breakpoint.h> @@ -22,6 +23,7 @@ static int test__checkevent_tracepoint(struct perf_evlist *evlist)  	struct perf_evsel *evsel = perf_evlist__first(evlist);  	TEST_ASSERT_VAL("wrong number of entries", 1 == evlist->nr_entries); +	TEST_ASSERT_VAL("wrong number of groups", 0 == evlist->nr_groups);  	TEST_ASSERT_VAL("wrong type", PERF_TYPE_TRACEPOINT == evsel->attr.type);  	TEST_ASSERT_VAL("wrong sample_type",  		PERF_TP_SAMPLE_TYPE == evsel->attr.sample_type); @@ -34,6 +36,7 @@ static int test__checkevent_tracepoint_multi(struct perf_evlist *evlist)  	struct perf_evsel *evsel;  	TEST_ASSERT_VAL("wrong number of entries", evlist->nr_entries > 1); +	TEST_ASSERT_VAL("wrong number of groups", 0 == evlist->nr_groups);  	list_for_each_entry(evsel, &evlist->entries, node) {  		TEST_ASSERT_VAL("wrong type", @@ -463,10 +466,10 @@ static int test__checkevent_pmu_events(struct perf_evlist *evlist)  static int test__checkterms_simple(struct list_head *terms)  { -	struct parse_events__term *term; +	struct parse_events_term *term;  	/* config=10 */ -	term = list_entry(terms->next, struct parse_events__term, list); +	term = list_entry(terms->next, struct parse_events_term, list);  	TEST_ASSERT_VAL("wrong type term",  			term->type_term == PARSE_EVENTS__TERM_TYPE_CONFIG);  	TEST_ASSERT_VAL("wrong type val", @@ -475,7 +478,7 @@ static int test__checkterms_simple(struct list_head *terms)  	TEST_ASSERT_VAL("wrong config", !term->config);  	/* config1 */ -	term = list_entry(term->list.next, struct parse_events__term, list); +	term = list_entry(term->list.next, struct parse_events_term, list);  	TEST_ASSERT_VAL("wrong type term",  			term->type_term == PARSE_EVENTS__TERM_TYPE_CONFIG1);  	TEST_ASSERT_VAL("wrong type val", @@ -484,7 +487,7 @@ static int test__checkterms_simple(struct list_head *terms)  	TEST_ASSERT_VAL("wrong config", !term->config);  	/* config2=3 */ -	term = list_entry(term->list.next, struct parse_events__term, list); +	term = list_entry(term->list.next, struct parse_events_term, list);  	TEST_ASSERT_VAL("wrong type term",  			term->type_term == PARSE_EVENTS__TERM_TYPE_CONFIG2);  	TEST_ASSERT_VAL("wrong type val", @@ -493,7 +496,7 @@ static int test__checkterms_simple(struct list_head *terms)  	TEST_ASSERT_VAL("wrong config", !term->config);  	/* umask=1*/ -	term = list_entry(term->list.next, struct parse_events__term, list); +	term = list_entry(term->list.next, struct parse_events_term, list);  	TEST_ASSERT_VAL("wrong type term",  			term->type_term == PARSE_EVENTS__TERM_TYPE_USER);  	TEST_ASSERT_VAL("wrong type val", @@ -509,6 +512,7 @@ static int test__group1(struct perf_evlist *evlist)  	struct perf_evsel *evsel, *leader;  	TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->nr_entries); +	TEST_ASSERT_VAL("wrong number of groups", 1 == evlist->nr_groups);  	/* instructions:k */  	evsel = leader = perf_evlist__first(evlist); @@ -521,7 +525,9 @@ static int test__group1(struct perf_evlist *evlist)  	TEST_ASSERT_VAL("wrong exclude guest", !evsel->attr.exclude_guest);  	TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host);  	TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip); -	TEST_ASSERT_VAL("wrong leader", !perf_evsel__is_group_member(evsel)); +	TEST_ASSERT_VAL("wrong leader", perf_evsel__is_group_leader(evsel)); +	TEST_ASSERT_VAL("wrong nr_members", evsel->nr_members == 2); +	TEST_ASSERT_VAL("wrong group_idx", perf_evsel__group_idx(evsel) == 0);  	/* cycles:upp */  	evsel = perf_evsel__next(evsel); @@ -536,6 +542,7 @@ static int test__group1(struct perf_evlist *evlist)  	TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host);  	TEST_ASSERT_VAL("wrong precise_ip", evsel->attr.precise_ip == 2);  	TEST_ASSERT_VAL("wrong leader", evsel->leader == leader); +	TEST_ASSERT_VAL("wrong group_idx", perf_evsel__group_idx(evsel) == 1);  	return 0;  } @@ -545,6 +552,7 @@ static int test__group2(struct perf_evlist *evlist)  	struct perf_evsel *evsel, *leader;  	TEST_ASSERT_VAL("wrong number of entries", 3 == evlist->nr_entries); +	TEST_ASSERT_VAL("wrong number of groups", 1 == evlist->nr_groups);  	/* faults + :ku modifier */  	evsel = leader = perf_evlist__first(evlist); @@ -557,7 +565,9 @@ static int test__group2(struct perf_evlist *evlist)  	TEST_ASSERT_VAL("wrong exclude guest", !evsel->attr.exclude_guest);  	TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host);  	TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip); -	TEST_ASSERT_VAL("wrong leader", !perf_evsel__is_group_member(evsel)); +	TEST_ASSERT_VAL("wrong leader", perf_evsel__is_group_leader(evsel)); +	TEST_ASSERT_VAL("wrong nr_members", evsel->nr_members == 2); +	TEST_ASSERT_VAL("wrong group_idx", perf_evsel__group_idx(evsel) == 0);  	/* cache-references + :u modifier */  	evsel = perf_evsel__next(evsel); @@ -567,10 +577,11 @@ static int test__group2(struct perf_evlist *evlist)  	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 exclude guest", !evsel->attr.exclude_guest); +	TEST_ASSERT_VAL("wrong exclude guest", evsel->attr.exclude_guest);  	TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host);  	TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);  	TEST_ASSERT_VAL("wrong leader", evsel->leader == leader); +	TEST_ASSERT_VAL("wrong group_idx", perf_evsel__group_idx(evsel) == 1);  	/* cycles:k */  	evsel = perf_evsel__next(evsel); @@ -583,7 +594,7 @@ static int test__group2(struct perf_evlist *evlist)  	TEST_ASSERT_VAL("wrong exclude guest", !evsel->attr.exclude_guest);  	TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host);  	TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip); -	TEST_ASSERT_VAL("wrong leader", !perf_evsel__is_group_member(evsel)); +	TEST_ASSERT_VAL("wrong leader", perf_evsel__is_group_leader(evsel));  	return 0;  } @@ -593,6 +604,7 @@ static int test__group3(struct perf_evlist *evlist __maybe_unused)  	struct perf_evsel *evsel, *leader;  	TEST_ASSERT_VAL("wrong number of entries", 5 == evlist->nr_entries); +	TEST_ASSERT_VAL("wrong number of groups", 2 == evlist->nr_groups);  	/* group1 syscalls:sys_enter_open:H */  	evsel = leader = perf_evlist__first(evlist); @@ -606,9 +618,11 @@ static int test__group3(struct perf_evlist *evlist __maybe_unused)  	TEST_ASSERT_VAL("wrong exclude guest", evsel->attr.exclude_guest);  	TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host);  	TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip); -	TEST_ASSERT_VAL("wrong leader", !perf_evsel__is_group_member(evsel)); +	TEST_ASSERT_VAL("wrong leader", perf_evsel__is_group_leader(evsel));  	TEST_ASSERT_VAL("wrong group name",  		!strcmp(leader->group_name, "group1")); +	TEST_ASSERT_VAL("wrong nr_members", evsel->nr_members == 2); +	TEST_ASSERT_VAL("wrong group_idx", perf_evsel__group_idx(evsel) == 0);  	/* group1 cycles:kppp */  	evsel = perf_evsel__next(evsel); @@ -624,6 +638,7 @@ static int test__group3(struct perf_evlist *evlist __maybe_unused)  	TEST_ASSERT_VAL("wrong precise_ip", evsel->attr.precise_ip == 3);  	TEST_ASSERT_VAL("wrong leader", evsel->leader == leader);  	TEST_ASSERT_VAL("wrong group name", !evsel->group_name); +	TEST_ASSERT_VAL("wrong group_idx", perf_evsel__group_idx(evsel) == 1);  	/* group2 cycles + G modifier */  	evsel = leader = perf_evsel__next(evsel); @@ -636,9 +651,11 @@ static int test__group3(struct perf_evlist *evlist __maybe_unused)  	TEST_ASSERT_VAL("wrong exclude guest", !evsel->attr.exclude_guest);  	TEST_ASSERT_VAL("wrong exclude host", evsel->attr.exclude_host);  	TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip); -	TEST_ASSERT_VAL("wrong leader", !perf_evsel__is_group_member(evsel)); +	TEST_ASSERT_VAL("wrong leader", perf_evsel__is_group_leader(evsel));  	TEST_ASSERT_VAL("wrong group name",  		!strcmp(leader->group_name, "group2")); +	TEST_ASSERT_VAL("wrong nr_members", evsel->nr_members == 2); +	TEST_ASSERT_VAL("wrong group_idx", perf_evsel__group_idx(evsel) == 0);  	/* group2 1:3 + G modifier */  	evsel = perf_evsel__next(evsel); @@ -651,6 +668,7 @@ static int test__group3(struct perf_evlist *evlist __maybe_unused)  	TEST_ASSERT_VAL("wrong exclude host", evsel->attr.exclude_host);  	TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);  	TEST_ASSERT_VAL("wrong leader", evsel->leader == leader); +	TEST_ASSERT_VAL("wrong group_idx", perf_evsel__group_idx(evsel) == 1);  	/* instructions:u */  	evsel = perf_evsel__next(evsel); @@ -663,7 +681,7 @@ static int test__group3(struct perf_evlist *evlist __maybe_unused)  	TEST_ASSERT_VAL("wrong exclude guest", !evsel->attr.exclude_guest);  	TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host);  	TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip); -	TEST_ASSERT_VAL("wrong leader", !perf_evsel__is_group_member(evsel)); +	TEST_ASSERT_VAL("wrong leader", perf_evsel__is_group_leader(evsel));  	return 0;  } @@ -673,6 +691,7 @@ static int test__group4(struct perf_evlist *evlist __maybe_unused)  	struct perf_evsel *evsel, *leader;  	TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->nr_entries); +	TEST_ASSERT_VAL("wrong number of groups", 1 == evlist->nr_groups);  	/* cycles:u + p */  	evsel = leader = perf_evlist__first(evlist); @@ -687,7 +706,9 @@ static int test__group4(struct perf_evlist *evlist __maybe_unused)  	TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host);  	TEST_ASSERT_VAL("wrong precise_ip", evsel->attr.precise_ip == 1);  	TEST_ASSERT_VAL("wrong group name", !evsel->group_name); -	TEST_ASSERT_VAL("wrong leader", !perf_evsel__is_group_member(evsel)); +	TEST_ASSERT_VAL("wrong leader", perf_evsel__is_group_leader(evsel)); +	TEST_ASSERT_VAL("wrong nr_members", evsel->nr_members == 2); +	TEST_ASSERT_VAL("wrong group_idx", perf_evsel__group_idx(evsel) == 0);  	/* instructions:kp + p */  	evsel = perf_evsel__next(evsel); @@ -702,6 +723,7 @@ static int test__group4(struct perf_evlist *evlist __maybe_unused)  	TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host);  	TEST_ASSERT_VAL("wrong precise_ip", evsel->attr.precise_ip == 2);  	TEST_ASSERT_VAL("wrong leader", evsel->leader == leader); +	TEST_ASSERT_VAL("wrong group_idx", perf_evsel__group_idx(evsel) == 1);  	return 0;  } @@ -711,6 +733,7 @@ static int test__group5(struct perf_evlist *evlist __maybe_unused)  	struct perf_evsel *evsel, *leader;  	TEST_ASSERT_VAL("wrong number of entries", 5 == evlist->nr_entries); +	TEST_ASSERT_VAL("wrong number of groups", 2 == evlist->nr_groups);  	/* cycles + G */  	evsel = leader = perf_evlist__first(evlist); @@ -724,7 +747,9 @@ static int test__group5(struct perf_evlist *evlist __maybe_unused)  	TEST_ASSERT_VAL("wrong exclude host", evsel->attr.exclude_host);  	TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);  	TEST_ASSERT_VAL("wrong group name", !evsel->group_name); -	TEST_ASSERT_VAL("wrong leader", !perf_evsel__is_group_member(evsel)); +	TEST_ASSERT_VAL("wrong leader", perf_evsel__is_group_leader(evsel)); +	TEST_ASSERT_VAL("wrong nr_members", evsel->nr_members == 2); +	TEST_ASSERT_VAL("wrong group_idx", perf_evsel__group_idx(evsel) == 0);  	/* instructions + G */  	evsel = perf_evsel__next(evsel); @@ -738,6 +763,7 @@ static int test__group5(struct perf_evlist *evlist __maybe_unused)  	TEST_ASSERT_VAL("wrong exclude host", evsel->attr.exclude_host);  	TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);  	TEST_ASSERT_VAL("wrong leader", evsel->leader == leader); +	TEST_ASSERT_VAL("wrong group_idx", perf_evsel__group_idx(evsel) == 1);  	/* cycles:G */  	evsel = leader = perf_evsel__next(evsel); @@ -751,7 +777,9 @@ static int test__group5(struct perf_evlist *evlist __maybe_unused)  	TEST_ASSERT_VAL("wrong exclude host", evsel->attr.exclude_host);  	TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);  	TEST_ASSERT_VAL("wrong group name", !evsel->group_name); -	TEST_ASSERT_VAL("wrong leader", !perf_evsel__is_group_member(evsel)); +	TEST_ASSERT_VAL("wrong leader", perf_evsel__is_group_leader(evsel)); +	TEST_ASSERT_VAL("wrong nr_members", evsel->nr_members == 2); +	TEST_ASSERT_VAL("wrong group_idx", perf_evsel__group_idx(evsel) == 0);  	/* instructions:G */  	evsel = perf_evsel__next(evsel); @@ -765,6 +793,7 @@ static int test__group5(struct perf_evlist *evlist __maybe_unused)  	TEST_ASSERT_VAL("wrong exclude host", evsel->attr.exclude_host);  	TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip);  	TEST_ASSERT_VAL("wrong leader", evsel->leader == leader); +	TEST_ASSERT_VAL("wrong group_idx", perf_evsel__group_idx(evsel) == 1);  	/* cycles */  	evsel = perf_evsel__next(evsel); @@ -777,18 +806,235 @@ static int test__group5(struct perf_evlist *evlist __maybe_unused)  	TEST_ASSERT_VAL("wrong exclude guest", evsel->attr.exclude_guest);  	TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host);  	TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip); -	TEST_ASSERT_VAL("wrong leader", !perf_evsel__is_group_member(evsel)); +	TEST_ASSERT_VAL("wrong leader", perf_evsel__is_group_leader(evsel)); + +	return 0; +} + +static int test__group_gh1(struct perf_evlist *evlist) +{ +	struct perf_evsel *evsel, *leader; + +	TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->nr_entries); +	TEST_ASSERT_VAL("wrong number of groups", 1 == evlist->nr_groups); + +	/* cycles + :H group modifier */ +	evsel = leader = perf_evlist__first(evlist); +	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type); +	TEST_ASSERT_VAL("wrong config", +			PERF_COUNT_HW_CPU_CYCLES == evsel->attr.config); +	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 exclude guest", evsel->attr.exclude_guest); +	TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host); +	TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip); +	TEST_ASSERT_VAL("wrong group name", !evsel->group_name); +	TEST_ASSERT_VAL("wrong leader", perf_evsel__is_group_leader(evsel)); +	TEST_ASSERT_VAL("wrong nr_members", evsel->nr_members == 2); +	TEST_ASSERT_VAL("wrong group_idx", perf_evsel__group_idx(evsel) == 0); + +	/* cache-misses:G + :H group modifier */ +	evsel = perf_evsel__next(evsel); +	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type); +	TEST_ASSERT_VAL("wrong config", +			PERF_COUNT_HW_CACHE_MISSES == evsel->attr.config); +	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 exclude guest", !evsel->attr.exclude_guest); +	TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host); +	TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip); +	TEST_ASSERT_VAL("wrong leader", evsel->leader == leader); +	TEST_ASSERT_VAL("wrong group_idx", perf_evsel__group_idx(evsel) == 1); + +	return 0; +} + +static int test__group_gh2(struct perf_evlist *evlist) +{ +	struct perf_evsel *evsel, *leader; + +	TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->nr_entries); +	TEST_ASSERT_VAL("wrong number of groups", 1 == evlist->nr_groups); + +	/* cycles + :G group modifier */ +	evsel = leader = perf_evlist__first(evlist); +	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type); +	TEST_ASSERT_VAL("wrong config", +			PERF_COUNT_HW_CPU_CYCLES == evsel->attr.config); +	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 exclude guest", !evsel->attr.exclude_guest); +	TEST_ASSERT_VAL("wrong exclude host", evsel->attr.exclude_host); +	TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip); +	TEST_ASSERT_VAL("wrong group name", !evsel->group_name); +	TEST_ASSERT_VAL("wrong leader", perf_evsel__is_group_leader(evsel)); +	TEST_ASSERT_VAL("wrong nr_members", evsel->nr_members == 2); +	TEST_ASSERT_VAL("wrong group_idx", perf_evsel__group_idx(evsel) == 0); + +	/* cache-misses:H + :G group modifier */ +	evsel = perf_evsel__next(evsel); +	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type); +	TEST_ASSERT_VAL("wrong config", +			PERF_COUNT_HW_CACHE_MISSES == evsel->attr.config); +	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 exclude guest", !evsel->attr.exclude_guest); +	TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host); +	TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip); +	TEST_ASSERT_VAL("wrong leader", evsel->leader == leader); +	TEST_ASSERT_VAL("wrong group_idx", perf_evsel__group_idx(evsel) == 1); + +	return 0; +} + +static int test__group_gh3(struct perf_evlist *evlist) +{ +	struct perf_evsel *evsel, *leader; + +	TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->nr_entries); +	TEST_ASSERT_VAL("wrong number of groups", 1 == evlist->nr_groups); + +	/* cycles:G + :u group modifier */ +	evsel = leader = perf_evlist__first(evlist); +	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type); +	TEST_ASSERT_VAL("wrong config", +			PERF_COUNT_HW_CPU_CYCLES == evsel->attr.config); +	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 exclude guest", !evsel->attr.exclude_guest); +	TEST_ASSERT_VAL("wrong exclude host", evsel->attr.exclude_host); +	TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip); +	TEST_ASSERT_VAL("wrong group name", !evsel->group_name); +	TEST_ASSERT_VAL("wrong leader", perf_evsel__is_group_leader(evsel)); +	TEST_ASSERT_VAL("wrong nr_members", evsel->nr_members == 2); +	TEST_ASSERT_VAL("wrong group_idx", perf_evsel__group_idx(evsel) == 0); + +	/* cache-misses:H + :u group modifier */ +	evsel = perf_evsel__next(evsel); +	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type); +	TEST_ASSERT_VAL("wrong config", +			PERF_COUNT_HW_CACHE_MISSES == evsel->attr.config); +	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 exclude guest", evsel->attr.exclude_guest); +	TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host); +	TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip); +	TEST_ASSERT_VAL("wrong leader", evsel->leader == leader); +	TEST_ASSERT_VAL("wrong group_idx", perf_evsel__group_idx(evsel) == 1); + +	return 0; +} + +static int test__group_gh4(struct perf_evlist *evlist) +{ +	struct perf_evsel *evsel, *leader; + +	TEST_ASSERT_VAL("wrong number of entries", 2 == evlist->nr_entries); +	TEST_ASSERT_VAL("wrong number of groups", 1 == evlist->nr_groups); + +	/* cycles:G + :uG group modifier */ +	evsel = leader = perf_evlist__first(evlist); +	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type); +	TEST_ASSERT_VAL("wrong config", +			PERF_COUNT_HW_CPU_CYCLES == evsel->attr.config); +	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 exclude guest", !evsel->attr.exclude_guest); +	TEST_ASSERT_VAL("wrong exclude host", evsel->attr.exclude_host); +	TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip); +	TEST_ASSERT_VAL("wrong group name", !evsel->group_name); +	TEST_ASSERT_VAL("wrong leader", perf_evsel__is_group_leader(evsel)); +	TEST_ASSERT_VAL("wrong nr_members", evsel->nr_members == 2); +	TEST_ASSERT_VAL("wrong group_idx", perf_evsel__group_idx(evsel) == 0); + +	/* cache-misses:H + :uG group modifier */ +	evsel = perf_evsel__next(evsel); +	TEST_ASSERT_VAL("wrong type", PERF_TYPE_HARDWARE == evsel->attr.type); +	TEST_ASSERT_VAL("wrong config", +			PERF_COUNT_HW_CACHE_MISSES == evsel->attr.config); +	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 exclude guest", !evsel->attr.exclude_guest); +	TEST_ASSERT_VAL("wrong exclude host", !evsel->attr.exclude_host); +	TEST_ASSERT_VAL("wrong precise_ip", !evsel->attr.precise_ip); +	TEST_ASSERT_VAL("wrong leader", evsel->leader == leader); +	TEST_ASSERT_VAL("wrong group_idx", perf_evsel__group_idx(evsel) == 1);  	return 0;  } -struct test__event_st { +static int count_tracepoints(void) +{ +	char events_path[PATH_MAX]; +	struct dirent *events_ent; +	DIR *events_dir; +	int cnt = 0; + +	scnprintf(events_path, PATH_MAX, "%s/tracing/events", +		  debugfs_find_mountpoint()); + +	events_dir = opendir(events_path); + +	TEST_ASSERT_VAL("Can't open events dir", events_dir); + +	while ((events_ent = readdir(events_dir))) { +		char sys_path[PATH_MAX]; +		struct dirent *sys_ent; +		DIR *sys_dir; + +		if (!strcmp(events_ent->d_name, ".") +		    || !strcmp(events_ent->d_name, "..") +		    || !strcmp(events_ent->d_name, "enable") +		    || !strcmp(events_ent->d_name, "header_event") +		    || !strcmp(events_ent->d_name, "header_page")) +			continue; + +		scnprintf(sys_path, PATH_MAX, "%s/%s", +			  events_path, events_ent->d_name); + +		sys_dir = opendir(sys_path); +		TEST_ASSERT_VAL("Can't open sys dir", sys_dir); + +		while ((sys_ent = readdir(sys_dir))) { +			if (!strcmp(sys_ent->d_name, ".") +			    || !strcmp(sys_ent->d_name, "..") +			    || !strcmp(sys_ent->d_name, "enable") +			    || !strcmp(sys_ent->d_name, "filter")) +				continue; + +			cnt++; +		} + +		closedir(sys_dir); +	} + +	closedir(events_dir); +	return cnt; +} + +static int test__all_tracepoints(struct perf_evlist *evlist) +{ +	TEST_ASSERT_VAL("wrong events count", +			count_tracepoints() == evlist->nr_entries); + +	return test__checkevent_tracepoint_multi(evlist); +} + +struct evlist_test {  	const char *name;  	__u32 type;  	int (*check)(struct perf_evlist *evlist);  }; -static struct test__event_st test__events[] = { +static struct evlist_test test__events[] = {  	[0] = {  		.name  = "syscalls:sys_enter_open",  		.check = test__checkevent_tracepoint, @@ -921,9 +1167,29 @@ static struct test__event_st test__events[] = {  		.name  = "{cycles,instructions}:G,{cycles:G,instructions:G},cycles",  		.check = test__group5,  	}, +	[33] = { +		.name  = "*:*", +		.check = test__all_tracepoints, +	}, +	[34] = { +		.name  = "{cycles,cache-misses:G}:H", +		.check = test__group_gh1, +	}, +	[35] = { +		.name  = "{cycles,cache-misses:H}:G", +		.check = test__group_gh2, +	}, +	[36] = { +		.name  = "{cycles:G,cache-misses:H}:u", +		.check = test__group_gh3, +	}, +	[37] = { +		.name  = "{cycles:G,cache-misses:H}:uG", +		.check = test__group_gh4, +	},  }; -static struct test__event_st test__events_pmu[] = { +static struct evlist_test test__events_pmu[] = {  	[0] = {  		.name  = "cpu/config=10,config1,config2=3,period=1000/u",  		.check = test__checkevent_pmu, @@ -934,20 +1200,20 @@ static struct test__event_st test__events_pmu[] = {  	},  }; -struct test__term { +struct terms_test {  	const char *str;  	__u32 type;  	int (*check)(struct list_head *terms);  }; -static struct test__term test__terms[] = { +static struct terms_test test__terms[] = {  	[0] = {  		.str   = "config=10,config1,config2=3,umask=1",  		.check = test__checkterms_simple,  	},  }; -static int test_event(struct test__event_st *e) +static int test_event(struct evlist_test *e)  {  	struct perf_evlist *evlist;  	int ret; @@ -956,7 +1222,7 @@ static int test_event(struct test__event_st *e)  	if (evlist == NULL)  		return -ENOMEM; -	ret = parse_events(evlist, e->name, 0); +	ret = parse_events(evlist, e->name);  	if (ret) {  		pr_debug("failed to parse event '%s', err %d\n",  			 e->name, ret); @@ -969,13 +1235,13 @@ static int test_event(struct test__event_st *e)  	return ret;  } -static int test_events(struct test__event_st *events, unsigned cnt) +static int test_events(struct evlist_test *events, unsigned cnt)  {  	int ret1, ret2 = 0;  	unsigned i;  	for (i = 0; i < cnt; i++) { -		struct test__event_st *e = &events[i]; +		struct evlist_test *e = &events[i];  		pr_debug("running test %d '%s'\n", i, e->name);  		ret1 = test_event(e); @@ -986,7 +1252,7 @@ static int test_events(struct test__event_st *events, unsigned cnt)  	return ret2;  } -static int test_term(struct test__term *t) +static int test_term(struct terms_test *t)  {  	struct list_head *terms;  	int ret; @@ -1010,13 +1276,13 @@ static int test_term(struct test__term *t)  	return ret;  } -static int test_terms(struct test__term *terms, unsigned cnt) +static int test_terms(struct terms_test *terms, unsigned cnt)  {  	int ret = 0;  	unsigned i;  	for (i = 0; i < cnt; i++) { -		struct test__term *t = &terms[i]; +		struct terms_test *t = &terms[i];  		pr_debug("running test %d '%s'\n", i, t->str);  		ret = test_term(t); @@ -1067,7 +1333,7 @@ static int test_pmu_events(void)  	while (!ret && (ent = readdir(dir))) {  #define MAX_NAME 100 -		struct test__event_st e; +		struct evlist_test e;  		char name[MAX_NAME];  		if (!strcmp(ent->d_name, ".") ||  |