1e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "perf.h" 2e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "evlist.h" 3e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "evsel.h" 4e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "thread_map.h" 5e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "tests.h" 6e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 7e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengint test__syscall_open_tp_fields(void) 8e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{ 9e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng struct perf_record_opts opts = { 10e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng .target = { 11e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng .uid = UINT_MAX, 12e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng .uses_mmap = true, 13e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng }, 14e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng .no_delay = true, 15e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng .freq = 1, 16e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng .mmap_pages = 256, 17e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng .raw_samples = true, 18e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng }; 19e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng const char *filename = "/etc/passwd"; 20e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng int flags = O_RDONLY | O_DIRECTORY; 21e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng struct perf_evlist *evlist = perf_evlist__new(); 22e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng struct perf_evsel *evsel; 23e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng int err = -1, i, nr_events = 0, nr_polls = 0; 24e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 25e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (evlist == NULL) { 26e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng pr_debug("%s: perf_evlist__new\n", __func__); 27e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng goto out; 28e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng } 29e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 30e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng evsel = perf_evsel__newtp("syscalls", "sys_enter_open", 0); 31e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (evsel == NULL) { 32e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng pr_debug("%s: perf_evsel__newtp\n", __func__); 33e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng goto out_delete_evlist; 34e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng } 35e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 36e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng perf_evlist__add(evlist, evsel); 37e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 38e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng err = perf_evlist__create_maps(evlist, &opts.target); 39e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (err < 0) { 40e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng pr_debug("%s: perf_evlist__create_maps\n", __func__); 41e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng goto out_delete_evlist; 42e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng } 43e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 44e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng perf_evsel__config(evsel, &opts); 45e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 46e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng evlist->threads->map[0] = getpid(); 47e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 48e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng err = perf_evlist__open(evlist); 49e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (err < 0) { 50e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng pr_debug("perf_evlist__open: %s\n", strerror(errno)); 51e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng goto out_delete_maps; 52e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng } 53e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 54e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng err = perf_evlist__mmap(evlist, UINT_MAX, false); 55e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (err < 0) { 56e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng pr_debug("perf_evlist__mmap: %s\n", strerror(errno)); 57e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng goto out_close_evlist; 58e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng } 59e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 60e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng perf_evlist__enable(evlist); 61e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 62e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng /* 63e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * Generate the event: 64e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng */ 65e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng open(filename, flags); 66e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 67e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng while (1) { 68e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng int before = nr_events; 69e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 70e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng for (i = 0; i < evlist->nr_mmaps; i++) { 71e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng union perf_event *event; 72e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 73e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng while ((event = perf_evlist__mmap_read(evlist, i)) != NULL) { 74e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng const u32 type = event->header.type; 75e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng int tp_flags; 76e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng struct perf_sample sample; 77e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 78e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng ++nr_events; 79e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 80e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (type != PERF_RECORD_SAMPLE) { 81e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng perf_evlist__mmap_consume(evlist, i); 82e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng continue; 83e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng } 84e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 85e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng err = perf_evsel__parse_sample(evsel, event, &sample); 86e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (err) { 87e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng pr_err("Can't parse sample, err = %d\n", err); 88e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng goto out_munmap; 89e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng } 90e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 91e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng tp_flags = perf_evsel__intval(evsel, &sample, "flags"); 92e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 93e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (flags != tp_flags) { 94e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng pr_debug("%s: Expected flags=%#x, got %#x\n", 95e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng __func__, flags, tp_flags); 96e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng goto out_munmap; 97e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng } 98e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 99e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng goto out_ok; 100e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng } 101e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng } 102e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 103e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (nr_events == before) 104e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng poll(evlist->pollfd, evlist->nr_fds, 10); 105e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 106e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (++nr_polls > 5) { 107e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng pr_debug("%s: no events!\n", __func__); 108e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng goto out_munmap; 109e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng } 110e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng } 111e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengout_ok: 112e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng err = 0; 113e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengout_munmap: 114e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng perf_evlist__munmap(evlist); 115e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengout_close_evlist: 116e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng perf_evlist__close(evlist); 117e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengout_delete_maps: 118e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng perf_evlist__delete_maps(evlist); 119e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengout_delete_evlist: 120e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng perf_evlist__delete(evlist); 121e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengout: 122e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng return err; 123e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng} 124