1e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include <unistd.h> 2e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include <stdlib.h> 3e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include <signal.h> 4e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include <sys/mman.h> 5e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 6e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "tests.h" 7e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "util/evsel.h" 8e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "util/evlist.h" 9e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "util/cpumap.h" 10e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "util/thread_map.h" 11e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 12e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define NR_LOOPS 1000000 13e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 14e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng/* 15e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * This test will open software clock events (cpu-clock, task-clock) 16e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * then check their frequency -> period conversion has no artifact of 17e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * setting period to 1 forcefully. 18e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng */ 19e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic int __test__sw_clock_freq(enum perf_sw_ids clock_id) 20e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{ 21e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng int i, err = -1; 22e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng volatile int tmp = 0; 23e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng u64 total_periods = 0; 24e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng int nr_samples = 0; 25e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng union perf_event *event; 26e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng struct perf_evsel *evsel; 27e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng struct perf_evlist *evlist; 28e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng struct perf_event_attr attr = { 29e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng .type = PERF_TYPE_SOFTWARE, 30e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng .config = clock_id, 31e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng .sample_type = PERF_SAMPLE_PERIOD, 32e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng .exclude_kernel = 1, 33e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng .disabled = 1, 34e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng .freq = 1, 35e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng }; 36e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 37e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng attr.sample_freq = 10000; 38e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 39e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng evlist = perf_evlist__new(); 40e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (evlist == NULL) { 41e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng pr_debug("perf_evlist__new\n"); 42e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng return -1; 43e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng } 44e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 45e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng evsel = perf_evsel__new(&attr, 0); 46e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (evsel == NULL) { 47e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng pr_debug("perf_evsel__new\n"); 48e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng goto out_free_evlist; 49e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng } 50e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng perf_evlist__add(evlist, evsel); 51e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 52e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng evlist->cpus = cpu_map__dummy_new(); 53e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng evlist->threads = thread_map__new_by_tid(getpid()); 54e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (!evlist->cpus || !evlist->threads) { 55e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng err = -ENOMEM; 56e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng pr_debug("Not enough memory to create thread/cpu maps\n"); 57e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng goto out_delete_maps; 58e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng } 59e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 60e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng perf_evlist__open(evlist); 61e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 62e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng err = perf_evlist__mmap(evlist, 128, true); 63e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (err < 0) { 64e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng pr_debug("failed to mmap event: %d (%s)\n", errno, 65e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng strerror(errno)); 66e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng goto out_close_evlist; 67e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng } 68e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 69e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng perf_evlist__enable(evlist); 70e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 71e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng /* collect samples */ 72e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng for (i = 0; i < NR_LOOPS; i++) 73e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng tmp++; 74e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 75e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng perf_evlist__disable(evlist); 76e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 77e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng while ((event = perf_evlist__mmap_read(evlist, 0)) != NULL) { 78e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng struct perf_sample sample; 79e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 80e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (event->header.type != PERF_RECORD_SAMPLE) 81e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng goto next_event; 82e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 83e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng err = perf_evlist__parse_sample(evlist, event, &sample); 84e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (err < 0) { 85e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng pr_debug("Error during parse sample\n"); 86e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng goto out_unmap_evlist; 87e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng } 88e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 89e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng total_periods += sample.period; 90e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng nr_samples++; 91e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengnext_event: 92e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng perf_evlist__mmap_consume(evlist, 0); 93e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng } 94e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 95e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if ((u64) nr_samples == total_periods) { 96e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng pr_debug("All (%d) samples have period value of 1!\n", 97e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng nr_samples); 98e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng err = -1; 99e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng } 100e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 101e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengout_unmap_evlist: 102e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng perf_evlist__munmap(evlist); 103e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengout_close_evlist: 104e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng perf_evlist__close(evlist); 105e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengout_delete_maps: 106e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng perf_evlist__delete_maps(evlist); 107e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengout_free_evlist: 108e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng perf_evlist__delete(evlist); 109e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng return err; 110e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng} 111e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 112e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengint test__sw_clock_freq(void) 113e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{ 114e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng int ret; 115e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 116e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng ret = __test__sw_clock_freq(PERF_COUNT_SW_CPU_CLOCK); 117e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (!ret) 118e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng ret = __test__sw_clock_freq(PERF_COUNT_SW_TASK_CLOCK); 119e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 120e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng return ret; 121e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng} 122