1b2441318SGreg Kroah-Hartman // SPDX-License-Identifier: GPL-2.0 2ee74701eSWang Nan /* 3ee74701eSWang Nan * Test backward bit in event attribute, read ring buffer from end to 4ee74701eSWang Nan * beginning 5ee74701eSWang Nan */ 6ee74701eSWang Nan 7ee74701eSWang Nan #include <evlist.h> 8ee74701eSWang Nan #include <sys/prctl.h> 9aeb00b1aSArnaldo Carvalho de Melo #include "record.h" 10ee74701eSWang Nan #include "tests.h" 11ee74701eSWang Nan #include "debug.h" 12f2a39fe8SArnaldo Carvalho de Melo #include "parse-events.h" 13e0fcfb08SArnaldo Carvalho de Melo #include "util/mmap.h" 14a43783aeSArnaldo Carvalho de Melo #include <errno.h> 158520a98dSArnaldo Carvalho de Melo #include <linux/string.h> 167728fa0cSJiri Olsa #include <perf/mmap.h> 17ee74701eSWang Nan 18ee74701eSWang Nan #define NR_ITERS 111 19ee74701eSWang Nan 20ee74701eSWang Nan static void testcase(void) 21ee74701eSWang Nan { 22ee74701eSWang Nan int i; 23ee74701eSWang Nan 24ee74701eSWang Nan for (i = 0; i < NR_ITERS; i++) { 2511c1ea6fSChangbin Du char proc_name[15]; 26ee74701eSWang Nan 27ee74701eSWang Nan snprintf(proc_name, sizeof(proc_name), "p:%d\n", i); 28ee74701eSWang Nan prctl(PR_SET_NAME, proc_name); 29ee74701eSWang Nan } 30ee74701eSWang Nan } 31ee74701eSWang Nan 3263503dbaSJiri Olsa static int count_samples(struct evlist *evlist, int *sample_count, 33ee74701eSWang Nan int *comm_count) 34ee74701eSWang Nan { 35ee74701eSWang Nan int i; 36ee74701eSWang Nan 37c976ee11SJiri Olsa for (i = 0; i < evlist->core.nr_mmaps; i++) { 38a5830532SJiri Olsa struct mmap *map = &evlist->overwrite_mmap[i]; 39ee74701eSWang Nan union perf_event *event; 40ee74701eSWang Nan 417c4d4182SJiri Olsa perf_mmap__read_init(&map->core); 42151ed5d7SJiri Olsa while ((event = perf_mmap__read_event(&map->core)) != NULL) { 43ee74701eSWang Nan const u32 type = event->header.type; 44ee74701eSWang Nan 45ee74701eSWang Nan switch (type) { 46ee74701eSWang Nan case PERF_RECORD_SAMPLE: 47ee74701eSWang Nan (*sample_count)++; 48ee74701eSWang Nan break; 49ee74701eSWang Nan case PERF_RECORD_COMM: 50ee74701eSWang Nan (*comm_count)++; 51ee74701eSWang Nan break; 52ee74701eSWang Nan default: 53ee74701eSWang Nan pr_err("Unexpected record of type %d\n", type); 54ee74701eSWang Nan return TEST_FAIL; 55ee74701eSWang Nan } 56ee74701eSWang Nan } 5732fdc2caSJiri Olsa perf_mmap__read_done(&map->core); 58ee74701eSWang Nan } 59ee74701eSWang Nan return TEST_OK; 60ee74701eSWang Nan } 61ee74701eSWang Nan 6263503dbaSJiri Olsa static int do_test(struct evlist *evlist, int mmap_pages, 63ee74701eSWang Nan int *sample_count, int *comm_count) 64ee74701eSWang Nan { 65ee74701eSWang Nan int err; 66ee74701eSWang Nan char sbuf[STRERR_BUFSIZE]; 67ee74701eSWang Nan 689521b5f2SJiri Olsa err = evlist__mmap(evlist, mmap_pages); 69ee74701eSWang Nan if (err < 0) { 709521b5f2SJiri Olsa pr_debug("evlist__mmap: %s\n", 71c8b5f2c9SArnaldo Carvalho de Melo str_error_r(errno, sbuf, sizeof(sbuf))); 72ee74701eSWang Nan return TEST_FAIL; 73ee74701eSWang Nan } 74ee74701eSWang Nan 751c87f165SJiri Olsa evlist__enable(evlist); 76ee74701eSWang Nan testcase(); 77e74676deSJiri Olsa evlist__disable(evlist); 78ee74701eSWang Nan 79ee74701eSWang Nan err = count_samples(evlist, sample_count, comm_count); 80db6b7b13SJiri Olsa evlist__munmap(evlist); 81ee74701eSWang Nan return err; 82ee74701eSWang Nan } 83ee74701eSWang Nan 84ee74701eSWang Nan 8581f17c90SArnaldo Carvalho de Melo int test__backward_ring_buffer(struct test *test __maybe_unused, int subtest __maybe_unused) 86ee74701eSWang Nan { 87ee74701eSWang Nan int ret = TEST_SKIP, err, sample_count = 0, comm_count = 0; 88ee74701eSWang Nan char pid[16], sbuf[STRERR_BUFSIZE]; 8963503dbaSJiri Olsa struct evlist *evlist; 9032dcd021SJiri Olsa struct evsel *evsel __maybe_unused; 91ee74701eSWang Nan struct parse_events_error parse_error; 92ee74701eSWang Nan struct record_opts opts = { 93ee74701eSWang Nan .target = { 94ee74701eSWang Nan .uid = UINT_MAX, 95ee74701eSWang Nan .uses_mmap = true, 96ee74701eSWang Nan }, 97ee74701eSWang Nan .freq = 0, 98ee74701eSWang Nan .mmap_pages = 256, 99ee74701eSWang Nan .default_interval = 1, 100ee74701eSWang Nan }; 101ee74701eSWang Nan 102ee74701eSWang Nan snprintf(pid, sizeof(pid), "%d", getpid()); 103ee74701eSWang Nan pid[sizeof(pid) - 1] = '\0'; 104ee74701eSWang Nan opts.target.tid = opts.target.pid = pid; 105ee74701eSWang Nan 1060f98b11cSJiri Olsa evlist = evlist__new(); 107ee74701eSWang Nan if (!evlist) { 108042cfb5fSAlexander Alemayhu pr_debug("Not enough memory to create evlist\n"); 109ee74701eSWang Nan return TEST_FAIL; 110ee74701eSWang Nan } 111ee74701eSWang Nan 112*7748bb71SArnaldo Carvalho de Melo err = evlist__create_maps(evlist, &opts.target); 113ee74701eSWang Nan if (err < 0) { 114ee74701eSWang Nan pr_debug("Not enough memory to create thread/cpu maps\n"); 115ee74701eSWang Nan goto out_delete_evlist; 116ee74701eSWang Nan } 117ee74701eSWang Nan 118ee74701eSWang Nan bzero(&parse_error, sizeof(parse_error)); 119626a6b78SWang Nan /* 120626a6b78SWang Nan * Set backward bit, ring buffer should be writing from end. Record 121626a6b78SWang Nan * it in aux evlist 122626a6b78SWang Nan */ 123626a6b78SWang Nan err = parse_events(evlist, "syscalls:sys_enter_prctl/overwrite/", &parse_error); 124ee74701eSWang Nan if (err) { 125ee74701eSWang Nan pr_debug("Failed to parse tracepoint event, try use root\n"); 126ee74701eSWang Nan ret = TEST_SKIP; 127ee74701eSWang Nan goto out_delete_evlist; 128ee74701eSWang Nan } 129ee74701eSWang Nan 130ee74701eSWang Nan perf_evlist__config(evlist, &opts, NULL); 131ee74701eSWang Nan 132474ddc4cSJiri Olsa err = evlist__open(evlist); 133ee74701eSWang Nan if (err < 0) { 134ee74701eSWang Nan pr_debug("perf_evlist__open: %s\n", 135c8b5f2c9SArnaldo Carvalho de Melo str_error_r(errno, sbuf, sizeof(sbuf))); 136ee74701eSWang Nan goto out_delete_evlist; 137ee74701eSWang Nan } 138ee74701eSWang Nan 139ee74701eSWang Nan ret = TEST_FAIL; 140ee74701eSWang Nan err = do_test(evlist, opts.mmap_pages, &sample_count, 141ee74701eSWang Nan &comm_count); 142ee74701eSWang Nan if (err != TEST_OK) 143ee74701eSWang Nan goto out_delete_evlist; 144ee74701eSWang Nan 145ee74701eSWang Nan if ((sample_count != NR_ITERS) || (comm_count != NR_ITERS)) { 146ee74701eSWang Nan pr_err("Unexpected counter: sample_count=%d, comm_count=%d\n", 147ee74701eSWang Nan sample_count, comm_count); 148ee74701eSWang Nan goto out_delete_evlist; 149ee74701eSWang Nan } 150ee74701eSWang Nan 151af8490ebSLeo Yan evlist__close(evlist); 152af8490ebSLeo Yan 153af8490ebSLeo Yan err = evlist__open(evlist); 154af8490ebSLeo Yan if (err < 0) { 155af8490ebSLeo Yan pr_debug("perf_evlist__open: %s\n", 156af8490ebSLeo Yan str_error_r(errno, sbuf, sizeof(sbuf))); 157af8490ebSLeo Yan goto out_delete_evlist; 158af8490ebSLeo Yan } 159af8490ebSLeo Yan 160ee74701eSWang Nan err = do_test(evlist, 1, &sample_count, &comm_count); 161ee74701eSWang Nan if (err != TEST_OK) 162ee74701eSWang Nan goto out_delete_evlist; 163ee74701eSWang Nan 164ee74701eSWang Nan ret = TEST_OK; 165ee74701eSWang Nan out_delete_evlist: 166c12995a5SJiri Olsa evlist__delete(evlist); 167ee74701eSWang Nan return ret; 168ee74701eSWang Nan } 169