brintos

brintos / linux-shallow public Read only

0
0
Text · 3.6 KiB · 2e38dfa Raw
195 lines · c
1// SPDX-License-Identifier: GPL-2.02/*3 * Test support for libpfm4 event encodings.4 *5 * Copyright 2020 Google LLC.6 */7#include "tests.h"8#include "util/debug.h"9#include "util/evlist.h"10#include "util/pfm.h"11 12#include <linux/kernel.h>13 14#ifdef HAVE_LIBPFM15static int count_pfm_events(struct perf_evlist *evlist)16{17	struct perf_evsel *evsel;18	int count = 0;19 20	perf_evlist__for_each_entry(evlist, evsel) {21		count++;22	}23	return count;24}25 26static int test__pfm_events(struct test_suite *test __maybe_unused,27			    int subtest __maybe_unused)28{29	struct evlist *evlist;30	struct option opt;31	size_t i;32	const struct {33		const char *events;34		int nr_events;35	} table[] = {36		{37			.events = "",38			.nr_events = 0,39		},40		{41			.events = "instructions",42			.nr_events = 1,43		},44		{45			.events = "instructions,cycles",46			.nr_events = 2,47		},48		{49			.events = "stereolab",50			.nr_events = 0,51		},52		{53			.events = "instructions,instructions",54			.nr_events = 2,55		},56		{57			.events = "stereolab,instructions",58			.nr_events = 0,59		},60		{61			.events = "instructions,stereolab",62			.nr_events = 1,63		},64	};65 66	for (i = 0; i < ARRAY_SIZE(table); i++) {67		evlist = evlist__new();68		if (evlist == NULL)69			return -ENOMEM;70 71		opt.value = evlist;72		parse_libpfm_events_option(&opt,73					table[i].events,74					0);75		TEST_ASSERT_EQUAL(table[i].events,76				count_pfm_events(&evlist->core),77				table[i].nr_events);78		TEST_ASSERT_EQUAL(table[i].events,79				evlist__nr_groups(evlist),80				0);81 82		evlist__delete(evlist);83	}84	return 0;85}86 87static int test__pfm_group(struct test_suite *test __maybe_unused,88			   int subtest __maybe_unused)89{90	struct evlist *evlist;91	struct option opt;92	size_t i;93	const struct {94		const char *events;95		int nr_events;96		int nr_groups;97	} table[] = {98		{99			.events = "{},",100			.nr_events = 0,101			.nr_groups = 0,102		},103		{104			.events = "{instructions}",105			.nr_events = 1,106			.nr_groups = 0,107		},108		{109			.events = "{instructions},{}",110			.nr_events = 1,111			.nr_groups = 0,112		},113		{114			.events = "{},{instructions}",115			.nr_events = 1,116			.nr_groups = 0,117		},118		{119			.events = "{instructions},{instructions}",120			.nr_events = 2,121			.nr_groups = 0,122		},123		{124			.events = "{instructions,cycles},{instructions,cycles}",125			.nr_events = 4,126			.nr_groups = 2,127		},128		{129			.events = "{stereolab}",130			.nr_events = 0,131			.nr_groups = 0,132		},133		{134			.events =135			"{instructions,cycles},{instructions,stereolab}",136			.nr_events = 3,137			.nr_groups = 1,138		},139		{140			.events = "instructions}",141			.nr_events = 1,142			.nr_groups = 0,143		},144		{145			.events = "{{instructions}}",146			.nr_events = 0,147			.nr_groups = 0,148		},149	};150 151	for (i = 0; i < ARRAY_SIZE(table); i++) {152		evlist = evlist__new();153		if (evlist == NULL)154			return -ENOMEM;155 156		opt.value = evlist;157		parse_libpfm_events_option(&opt,158					table[i].events,159					0);160		TEST_ASSERT_EQUAL(table[i].events,161				count_pfm_events(&evlist->core),162				table[i].nr_events);163		TEST_ASSERT_EQUAL(table[i].events,164				evlist__nr_groups(evlist),165				table[i].nr_groups);166 167		evlist__delete(evlist);168	}169	return 0;170}171#else172static int test__pfm_events(struct test_suite *test __maybe_unused,173			    int subtest __maybe_unused)174{175	return TEST_SKIP;176}177 178static int test__pfm_group(struct test_suite *test __maybe_unused,179			   int subtest __maybe_unused)180{181	return TEST_SKIP;182}183#endif184 185static struct test_case pfm_tests[] = {186	TEST_CASE_REASON("test of individual --pfm-events", pfm_events, "not compiled in"),187	TEST_CASE_REASON("test groups of --pfm-events", pfm_group, "not compiled in"),188	{ .name = NULL, }189};190 191struct test_suite suite__pfm = {192	.desc = "Test libpfm4 support",193	.test_cases = pfm_tests,194};195