xref: /openbmc/linux/tools/perf/tests/perf-record.c (revision 7ae9fb1b7ecbb5d85d07857943f677fd1a559b18)
1b2441318SGreg Kroah-Hartman // SPDX-License-Identifier: GPL-2.0
2a43783aeSArnaldo Carvalho de Melo #include <errno.h>
3fd20e811SArnaldo Carvalho de Melo #include <inttypes.h>
48520a98dSArnaldo Carvalho de Melo #include <linux/string.h>
51fbe7df8SArnaldo Carvalho de Melo 
616d00feeSJiri Olsa #include <sched.h>
77728fa0cSJiri Olsa #include <perf/mmap.h>
8*fd8d5a3bSArnaldo Carvalho de Melo #include "event.h"
916d00feeSJiri Olsa #include "evlist.h"
1016d00feeSJiri Olsa #include "evsel.h"
1116d00feeSJiri Olsa #include "debug.h"
12aeb00b1aSArnaldo Carvalho de Melo #include "record.h"
1316d00feeSJiri Olsa #include "tests.h"
14e0fcfb08SArnaldo Carvalho de Melo #include "util/mmap.h"
159823147dSArnaldo Carvalho de Melo #include "util/sample.h"
1616d00feeSJiri Olsa 
sched__get_first_possible_cpu(pid_t pid,cpu_set_t * maskp)1716d00feeSJiri Olsa static int sched__get_first_possible_cpu(pid_t pid, cpu_set_t *maskp)
1816d00feeSJiri Olsa {
1916d00feeSJiri Olsa 	int i, cpu = -1, nrcpus = 1024;
2016d00feeSJiri Olsa realloc:
2116d00feeSJiri Olsa 	CPU_ZERO(maskp);
2216d00feeSJiri Olsa 
2316d00feeSJiri Olsa 	if (sched_getaffinity(pid, sizeof(*maskp), maskp) == -1) {
2416d00feeSJiri Olsa 		if (errno == EINVAL && nrcpus < (1024 << 8)) {
2516d00feeSJiri Olsa 			nrcpus = nrcpus << 2;
2616d00feeSJiri Olsa 			goto realloc;
2716d00feeSJiri Olsa 		}
2816d00feeSJiri Olsa 		perror("sched_getaffinity");
2916d00feeSJiri Olsa 			return -1;
3016d00feeSJiri Olsa 	}
3116d00feeSJiri Olsa 
3216d00feeSJiri Olsa 	for (i = 0; i < nrcpus; i++) {
3316d00feeSJiri Olsa 		if (CPU_ISSET(i, maskp)) {
3416d00feeSJiri Olsa 			if (cpu == -1)
3516d00feeSJiri Olsa 				cpu = i;
3616d00feeSJiri Olsa 			else
3716d00feeSJiri Olsa 				CPU_CLR(i, maskp);
3816d00feeSJiri Olsa 		}
3916d00feeSJiri Olsa 	}
4016d00feeSJiri Olsa 
4116d00feeSJiri Olsa 	return cpu;
4216d00feeSJiri Olsa }
4316d00feeSJiri Olsa 
test__PERF_RECORD(struct test_suite * test __maybe_unused,int subtest __maybe_unused)4433f44bfdSIan Rogers static int test__PERF_RECORD(struct test_suite *test __maybe_unused, int subtest __maybe_unused)
4516d00feeSJiri Olsa {
46b4006796SArnaldo Carvalho de Melo 	struct record_opts opts = {
4716d00feeSJiri Olsa 		.target = {
4816d00feeSJiri Olsa 			.uid = UINT_MAX,
4916d00feeSJiri Olsa 			.uses_mmap = true,
5016d00feeSJiri Olsa 		},
51509051eaSArnaldo Carvalho de Melo 		.no_buffering = true,
5216d00feeSJiri Olsa 		.mmap_pages   = 256,
5316d00feeSJiri Olsa 	};
5416d00feeSJiri Olsa 	cpu_set_t cpu_mask;
5516d00feeSJiri Olsa 	size_t cpu_mask_size = sizeof(cpu_mask);
56606e2c29SArnaldo Carvalho de Melo 	struct evlist *evlist = evlist__new_dummy();
5732dcd021SJiri Olsa 	struct evsel *evsel;
5816d00feeSJiri Olsa 	struct perf_sample sample;
5916d00feeSJiri Olsa 	const char *cmd = "sleep";
6016d00feeSJiri Olsa 	const char *argv[] = { cmd, "1", NULL, };
615c5e854bSStephane Eranian 	char *bname, *mmap_filename;
6216d00feeSJiri Olsa 	u64 prev_time = 0;
6316d00feeSJiri Olsa 	bool found_cmd_mmap = false,
642aac9f9dSAdrian Hunter 	     found_coreutils_mmap = false,
6516d00feeSJiri Olsa 	     found_libc_mmap = false,
6616d00feeSJiri Olsa 	     found_vdso_mmap = false,
6716d00feeSJiri Olsa 	     found_ld_mmap = false;
6816d00feeSJiri Olsa 	int err = -1, errs = 0, i, wakeups = 0;
6916d00feeSJiri Olsa 	u32 cpu;
7016d00feeSJiri Olsa 	int total_events = 0, nr_events[PERF_RECORD_MAX] = { 0, };
71ba3dfff8SMasami Hiramatsu 	char sbuf[STRERR_BUFSIZE];
7216d00feeSJiri Olsa 
7369ef8f47SArnaldo Carvalho de Melo 	if (evlist == NULL) /* Fallback for kernels lacking PERF_COUNT_SW_DUMMY */
74606e2c29SArnaldo Carvalho de Melo 		evlist = evlist__new_default();
7569ef8f47SArnaldo Carvalho de Melo 
769ef6839bSArnaldo Carvalho de Melo 	if (evlist == NULL) {
7716d00feeSJiri Olsa 		pr_debug("Not enough memory to create evlist\n");
7816d00feeSJiri Olsa 		goto out;
7916d00feeSJiri Olsa 	}
8016d00feeSJiri Olsa 
8116d00feeSJiri Olsa 	/*
8216d00feeSJiri Olsa 	 * Create maps of threads and cpus to monitor. In this case
8316d00feeSJiri Olsa 	 * we start with all threads and cpus (-1, -1) but then in
847b392ef0SArnaldo Carvalho de Melo 	 * evlist__prepare_workload we'll fill in the only thread
8516d00feeSJiri Olsa 	 * we're monitoring, the one forked there.
8616d00feeSJiri Olsa 	 */
877748bb71SArnaldo Carvalho de Melo 	err = evlist__create_maps(evlist, &opts.target);
8816d00feeSJiri Olsa 	if (err < 0) {
8916d00feeSJiri Olsa 		pr_debug("Not enough memory to create thread/cpu maps\n");
9016d00feeSJiri Olsa 		goto out_delete_evlist;
9116d00feeSJiri Olsa 	}
9216d00feeSJiri Olsa 
9316d00feeSJiri Olsa 	/*
9416d00feeSJiri Olsa 	 * Prepare the workload in argv[] to run, it'll fork it, and then wait
957b392ef0SArnaldo Carvalho de Melo 	 * for evlist__start_workload() to exec it. This is done this way
9616d00feeSJiri Olsa 	 * so that we have time to open the evlist (calling sys_perf_event_open
9716d00feeSJiri Olsa 	 * on all the fds) and then mmap them.
9816d00feeSJiri Olsa 	 */
997b392ef0SArnaldo Carvalho de Melo 	err = evlist__prepare_workload(evlist, &opts.target, argv, false, NULL);
10016d00feeSJiri Olsa 	if (err < 0) {
10116d00feeSJiri Olsa 		pr_debug("Couldn't run the workload!\n");
10203ad9747SArnaldo Carvalho de Melo 		goto out_delete_evlist;
10316d00feeSJiri Olsa 	}
10416d00feeSJiri Olsa 
10516d00feeSJiri Olsa 	/*
10616d00feeSJiri Olsa 	 * Config the evsels, setting attr->comm on the first one, etc.
10716d00feeSJiri Olsa 	 */
108515dbe48SJiri Olsa 	evsel = evlist__first(evlist);
109862b2f8fSArnaldo Carvalho de Melo 	evsel__set_sample_bit(evsel, CPU);
110862b2f8fSArnaldo Carvalho de Melo 	evsel__set_sample_bit(evsel, TID);
111862b2f8fSArnaldo Carvalho de Melo 	evsel__set_sample_bit(evsel, TIME);
11278e1bc25SArnaldo Carvalho de Melo 	evlist__config(evlist, &opts, NULL);
11316d00feeSJiri Olsa 
11416d00feeSJiri Olsa 	err = sched__get_first_possible_cpu(evlist->workload.pid, &cpu_mask);
11516d00feeSJiri Olsa 	if (err < 0) {
116ba3dfff8SMasami Hiramatsu 		pr_debug("sched__get_first_possible_cpu: %s\n",
117c8b5f2c9SArnaldo Carvalho de Melo 			 str_error_r(errno, sbuf, sizeof(sbuf)));
11803ad9747SArnaldo Carvalho de Melo 		goto out_delete_evlist;
11916d00feeSJiri Olsa 	}
12016d00feeSJiri Olsa 
12116d00feeSJiri Olsa 	cpu = err;
12216d00feeSJiri Olsa 
12316d00feeSJiri Olsa 	/*
12416d00feeSJiri Olsa 	 * So that we can check perf_sample.cpu on all the samples.
12516d00feeSJiri Olsa 	 */
12616d00feeSJiri Olsa 	if (sched_setaffinity(evlist->workload.pid, cpu_mask_size, &cpu_mask) < 0) {
127ba3dfff8SMasami Hiramatsu 		pr_debug("sched_setaffinity: %s\n",
128c8b5f2c9SArnaldo Carvalho de Melo 			 str_error_r(errno, sbuf, sizeof(sbuf)));
12903ad9747SArnaldo Carvalho de Melo 		goto out_delete_evlist;
13016d00feeSJiri Olsa 	}
13116d00feeSJiri Olsa 
13216d00feeSJiri Olsa 	/*
13316d00feeSJiri Olsa 	 * Call sys_perf_event_open on all the fds on all the evsels,
13416d00feeSJiri Olsa 	 * grouping them if asked to.
13516d00feeSJiri Olsa 	 */
136474ddc4cSJiri Olsa 	err = evlist__open(evlist);
13716d00feeSJiri Olsa 	if (err < 0) {
138ba3dfff8SMasami Hiramatsu 		pr_debug("perf_evlist__open: %s\n",
139c8b5f2c9SArnaldo Carvalho de Melo 			 str_error_r(errno, sbuf, sizeof(sbuf)));
14003ad9747SArnaldo Carvalho de Melo 		goto out_delete_evlist;
14116d00feeSJiri Olsa 	}
14216d00feeSJiri Olsa 
14316d00feeSJiri Olsa 	/*
14416d00feeSJiri Olsa 	 * mmap the first fd on a given CPU and ask for events for the other
14516d00feeSJiri Olsa 	 * fds in the same CPU to be injected in the same mmap ring buffer
14616d00feeSJiri Olsa 	 * (using ioctl(PERF_EVENT_IOC_SET_OUTPUT)).
14716d00feeSJiri Olsa 	 */
1489521b5f2SJiri Olsa 	err = evlist__mmap(evlist, opts.mmap_pages);
14916d00feeSJiri Olsa 	if (err < 0) {
1509521b5f2SJiri Olsa 		pr_debug("evlist__mmap: %s\n",
151c8b5f2c9SArnaldo Carvalho de Melo 			 str_error_r(errno, sbuf, sizeof(sbuf)));
152f26e1c7cSArnaldo Carvalho de Melo 		goto out_delete_evlist;
15316d00feeSJiri Olsa 	}
15416d00feeSJiri Olsa 
15516d00feeSJiri Olsa 	/*
15616d00feeSJiri Olsa 	 * Now that all is properly set up, enable the events, they will
15716d00feeSJiri Olsa 	 * count just on workload.pid, which will start...
15816d00feeSJiri Olsa 	 */
1591c87f165SJiri Olsa 	evlist__enable(evlist);
16016d00feeSJiri Olsa 
16116d00feeSJiri Olsa 	/*
16216d00feeSJiri Olsa 	 * Now!
16316d00feeSJiri Olsa 	 */
1647b392ef0SArnaldo Carvalho de Melo 	evlist__start_workload(evlist);
16516d00feeSJiri Olsa 
16616d00feeSJiri Olsa 	while (1) {
16716d00feeSJiri Olsa 		int before = total_events;
16816d00feeSJiri Olsa 
169c976ee11SJiri Olsa 		for (i = 0; i < evlist->core.nr_mmaps; i++) {
17016d00feeSJiri Olsa 			union perf_event *event;
171a5830532SJiri Olsa 			struct mmap *md;
17216d00feeSJiri Olsa 
17388e37a4bSKan Liang 			md = &evlist->mmap[i];
1747c4d4182SJiri Olsa 			if (perf_mmap__read_init(&md->core) < 0)
17588e37a4bSKan Liang 				continue;
17688e37a4bSKan Liang 
177151ed5d7SJiri Olsa 			while ((event = perf_mmap__read_event(&md->core)) != NULL) {
17816d00feeSJiri Olsa 				const u32 type = event->header.type;
17916d00feeSJiri Olsa 				const char *name = perf_event__name(type);
18016d00feeSJiri Olsa 
18116d00feeSJiri Olsa 				++total_events;
18216d00feeSJiri Olsa 				if (type < PERF_RECORD_MAX)
18316d00feeSJiri Olsa 					nr_events[type]++;
18416d00feeSJiri Olsa 
1852a6599cdSArnaldo Carvalho de Melo 				err = evlist__parse_sample(evlist, event, &sample);
18616d00feeSJiri Olsa 				if (err < 0) {
187bb963e16SNamhyung Kim 					if (verbose > 0)
1887eeb9855SAdrian Hunter 						perf_event__fprintf(event, NULL, stderr);
18916d00feeSJiri Olsa 					pr_debug("Couldn't parse sample\n");
190983874d1SArnaldo Carvalho de Melo 					goto out_delete_evlist;
19116d00feeSJiri Olsa 				}
19216d00feeSJiri Olsa 
193bb963e16SNamhyung Kim 				if (verbose > 0) {
19416d00feeSJiri Olsa 					pr_info("%" PRIu64" %d ", sample.time, sample.cpu);
1957eeb9855SAdrian Hunter 					perf_event__fprintf(event, NULL, stderr);
19616d00feeSJiri Olsa 				}
19716d00feeSJiri Olsa 
19816d00feeSJiri Olsa 				if (prev_time > sample.time) {
19916d00feeSJiri Olsa 					pr_debug("%s going backwards in time, prev=%" PRIu64 ", curr=%" PRIu64 "\n",
20016d00feeSJiri Olsa 						 name, prev_time, sample.time);
20116d00feeSJiri Olsa 					++errs;
20216d00feeSJiri Olsa 				}
20316d00feeSJiri Olsa 
20416d00feeSJiri Olsa 				prev_time = sample.time;
20516d00feeSJiri Olsa 
20616d00feeSJiri Olsa 				if (sample.cpu != cpu) {
20716d00feeSJiri Olsa 					pr_debug("%s with unexpected cpu, expected %d, got %d\n",
20816d00feeSJiri Olsa 						 name, cpu, sample.cpu);
20916d00feeSJiri Olsa 					++errs;
21016d00feeSJiri Olsa 				}
21116d00feeSJiri Olsa 
21216d00feeSJiri Olsa 				if ((pid_t)sample.pid != evlist->workload.pid) {
21316d00feeSJiri Olsa 					pr_debug("%s with unexpected pid, expected %d, got %d\n",
21416d00feeSJiri Olsa 						 name, evlist->workload.pid, sample.pid);
21516d00feeSJiri Olsa 					++errs;
21616d00feeSJiri Olsa 				}
21716d00feeSJiri Olsa 
21816d00feeSJiri Olsa 				if ((pid_t)sample.tid != evlist->workload.pid) {
21916d00feeSJiri Olsa 					pr_debug("%s with unexpected tid, expected %d, got %d\n",
22016d00feeSJiri Olsa 						 name, evlist->workload.pid, sample.tid);
22116d00feeSJiri Olsa 					++errs;
22216d00feeSJiri Olsa 				}
22316d00feeSJiri Olsa 
22416d00feeSJiri Olsa 				if ((type == PERF_RECORD_COMM ||
22516d00feeSJiri Olsa 				     type == PERF_RECORD_MMAP ||
2265c5e854bSStephane Eranian 				     type == PERF_RECORD_MMAP2 ||
22716d00feeSJiri Olsa 				     type == PERF_RECORD_FORK ||
22816d00feeSJiri Olsa 				     type == PERF_RECORD_EXIT) &&
22916d00feeSJiri Olsa 				     (pid_t)event->comm.pid != evlist->workload.pid) {
23016d00feeSJiri Olsa 					pr_debug("%s with unexpected pid/tid\n", name);
23116d00feeSJiri Olsa 					++errs;
23216d00feeSJiri Olsa 				}
23316d00feeSJiri Olsa 
23416d00feeSJiri Olsa 				if ((type == PERF_RECORD_COMM ||
2355c5e854bSStephane Eranian 				     type == PERF_RECORD_MMAP ||
2365c5e854bSStephane Eranian 				     type == PERF_RECORD_MMAP2) &&
23716d00feeSJiri Olsa 				     event->comm.pid != event->comm.tid) {
23816d00feeSJiri Olsa 					pr_debug("%s with different pid/tid!\n", name);
23916d00feeSJiri Olsa 					++errs;
24016d00feeSJiri Olsa 				}
24116d00feeSJiri Olsa 
24216d00feeSJiri Olsa 				switch (type) {
24316d00feeSJiri Olsa 				case PERF_RECORD_COMM:
24416d00feeSJiri Olsa 					if (strcmp(event->comm.comm, cmd)) {
24516d00feeSJiri Olsa 						pr_debug("%s with unexpected comm!\n", name);
24616d00feeSJiri Olsa 						++errs;
24716d00feeSJiri Olsa 					}
24816d00feeSJiri Olsa 					break;
24916d00feeSJiri Olsa 				case PERF_RECORD_EXIT:
25016d00feeSJiri Olsa 					goto found_exit;
25116d00feeSJiri Olsa 				case PERF_RECORD_MMAP:
2525c5e854bSStephane Eranian 					mmap_filename = event->mmap.filename;
2535c5e854bSStephane Eranian 					goto check_bname;
2545c5e854bSStephane Eranian 				case PERF_RECORD_MMAP2:
2555c5e854bSStephane Eranian 					mmap_filename = event->mmap2.filename;
2565c5e854bSStephane Eranian 				check_bname:
2575c5e854bSStephane Eranian 					bname = strrchr(mmap_filename, '/');
25816d00feeSJiri Olsa 					if (bname != NULL) {
25916d00feeSJiri Olsa 						if (!found_cmd_mmap)
26016d00feeSJiri Olsa 							found_cmd_mmap = !strcmp(bname + 1, cmd);
2612aac9f9dSAdrian Hunter 						if (!found_coreutils_mmap)
2622aac9f9dSAdrian Hunter 							found_coreutils_mmap = !strcmp(bname + 1, "coreutils");
26316d00feeSJiri Olsa 						if (!found_libc_mmap)
26416d00feeSJiri Olsa 							found_libc_mmap = !strncmp(bname + 1, "libc", 4);
26516d00feeSJiri Olsa 						if (!found_ld_mmap)
26616d00feeSJiri Olsa 							found_ld_mmap = !strncmp(bname + 1, "ld", 2);
26716d00feeSJiri Olsa 					} else if (!found_vdso_mmap)
2685c5e854bSStephane Eranian 						found_vdso_mmap = !strcmp(mmap_filename, "[vdso]");
26916d00feeSJiri Olsa 					break;
27016d00feeSJiri Olsa 
27116d00feeSJiri Olsa 				case PERF_RECORD_SAMPLE:
27216d00feeSJiri Olsa 					/* Just ignore samples for now */
27316d00feeSJiri Olsa 					break;
27416d00feeSJiri Olsa 				default:
27516d00feeSJiri Olsa 					pr_debug("Unexpected perf_event->header.type %d!\n",
27616d00feeSJiri Olsa 						 type);
27716d00feeSJiri Olsa 					++errs;
27816d00feeSJiri Olsa 				}
2798e50d384SZhouyi Zhou 
2807728fa0cSJiri Olsa 				perf_mmap__consume(&md->core);
28116d00feeSJiri Olsa 			}
28232fdc2caSJiri Olsa 			perf_mmap__read_done(&md->core);
28316d00feeSJiri Olsa 		}
28416d00feeSJiri Olsa 
28516d00feeSJiri Olsa 		/*
28616d00feeSJiri Olsa 		 * We don't use poll here because at least at 3.1 times the
28716d00feeSJiri Olsa 		 * PERF_RECORD_{!SAMPLE} events don't honour
28816d00feeSJiri Olsa 		 * perf_event_attr.wakeup_events, just PERF_EVENT_SAMPLE does.
28916d00feeSJiri Olsa 		 */
29016d00feeSJiri Olsa 		if (total_events == before && false)
29180ab2987SJiri Olsa 			evlist__poll(evlist, -1);
29216d00feeSJiri Olsa 
29316d00feeSJiri Olsa 		sleep(1);
29416d00feeSJiri Olsa 		if (++wakeups > 5) {
29516d00feeSJiri Olsa 			pr_debug("No PERF_RECORD_EXIT event!\n");
29616d00feeSJiri Olsa 			break;
29716d00feeSJiri Olsa 		}
29816d00feeSJiri Olsa 	}
29916d00feeSJiri Olsa 
30016d00feeSJiri Olsa found_exit:
3012aac9f9dSAdrian Hunter 	if (nr_events[PERF_RECORD_COMM] > 1 + !!found_coreutils_mmap) {
30216d00feeSJiri Olsa 		pr_debug("Excessive number of PERF_RECORD_COMM events!\n");
30316d00feeSJiri Olsa 		++errs;
30416d00feeSJiri Olsa 	}
30516d00feeSJiri Olsa 
30616d00feeSJiri Olsa 	if (nr_events[PERF_RECORD_COMM] == 0) {
30716d00feeSJiri Olsa 		pr_debug("Missing PERF_RECORD_COMM for %s!\n", cmd);
30816d00feeSJiri Olsa 		++errs;
30916d00feeSJiri Olsa 	}
31016d00feeSJiri Olsa 
3112aac9f9dSAdrian Hunter 	if (!found_cmd_mmap && !found_coreutils_mmap) {
31216d00feeSJiri Olsa 		pr_debug("PERF_RECORD_MMAP for %s missing!\n", cmd);
31316d00feeSJiri Olsa 		++errs;
31416d00feeSJiri Olsa 	}
31516d00feeSJiri Olsa 
31616d00feeSJiri Olsa 	if (!found_libc_mmap) {
31716d00feeSJiri Olsa 		pr_debug("PERF_RECORD_MMAP for %s missing!\n", "libc");
31816d00feeSJiri Olsa 		++errs;
31916d00feeSJiri Olsa 	}
32016d00feeSJiri Olsa 
32116d00feeSJiri Olsa 	if (!found_ld_mmap) {
32216d00feeSJiri Olsa 		pr_debug("PERF_RECORD_MMAP for %s missing!\n", "ld");
32316d00feeSJiri Olsa 		++errs;
32416d00feeSJiri Olsa 	}
32516d00feeSJiri Olsa 
32616d00feeSJiri Olsa 	if (!found_vdso_mmap) {
32716d00feeSJiri Olsa 		pr_debug("PERF_RECORD_MMAP for %s missing!\n", "[vdso]");
32816d00feeSJiri Olsa 		++errs;
32916d00feeSJiri Olsa 	}
33016d00feeSJiri Olsa out_delete_evlist:
331c12995a5SJiri Olsa 	evlist__delete(evlist);
33216d00feeSJiri Olsa out:
3332cf88f46SIan Rogers 	if (err == -EACCES)
3342cf88f46SIan Rogers 		return TEST_SKIP;
33525c5e67cSArnaldo Carvalho de Melo 	if (err < 0 || errs != 0)
3362cf88f46SIan Rogers 		return TEST_FAIL;
3372cf88f46SIan Rogers 	return TEST_OK;
33816d00feeSJiri Olsa }
339d68f0365SIan Rogers 
3402cf88f46SIan Rogers static struct test_case tests__PERF_RECORD[] = {
3412cf88f46SIan Rogers 	TEST_CASE_REASON("PERF_RECORD_* events & perf_sample fields",
3422cf88f46SIan Rogers 			 PERF_RECORD,
3432cf88f46SIan Rogers 			 "permissions"),
3442cf88f46SIan Rogers 	{	.name = NULL, }
3452cf88f46SIan Rogers };
3462cf88f46SIan Rogers 
3472cf88f46SIan Rogers struct test_suite suite__PERF_RECORD = {
3482cf88f46SIan Rogers 	.desc = "PERF_RECORD_* events & perf_sample fields",
3492cf88f46SIan Rogers 	.test_cases = tests__PERF_RECORD,
3502cf88f46SIan Rogers };
351