1e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng/* 2e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * builtin-test.c 3e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * 4e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng * Builtin regression testing command: ever growing number of sanity tests 5e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng */ 6e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "builtin.h" 7e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "intlist.h" 8e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "tests.h" 9e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "debug.h" 10e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "color.h" 11e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "parse-options.h" 12e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "symbol.h" 13e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 14e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic struct test { 15e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng const char *desc; 16e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng int (*func)(void); 17e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng} tests[] = { 18e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng { 19e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng .desc = "vmlinux symtab matches kallsyms", 20e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng .func = test__vmlinux_matches_kallsyms, 21e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng }, 22e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng { 23e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng .desc = "detect open syscall event", 24e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng .func = test__open_syscall_event, 25e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng }, 26e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng { 27e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng .desc = "detect open syscall event on all cpus", 28e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng .func = test__open_syscall_event_on_all_cpus, 29e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng }, 30e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng { 31e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng .desc = "read samples using the mmap interface", 32e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng .func = test__basic_mmap, 33e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng }, 34e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng { 35e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng .desc = "parse events tests", 36e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng .func = test__parse_events, 37e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng }, 38e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#if defined(__x86_64__) || defined(__i386__) 39e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng { 40e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng .desc = "x86 rdpmc test", 41e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng .func = test__rdpmc, 42e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng }, 43e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#endif 44e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng { 45e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng .desc = "Validate PERF_RECORD_* events & perf_sample fields", 46e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng .func = test__PERF_RECORD, 47e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng }, 48e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng { 49e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng .desc = "Test perf pmu format parsing", 50e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng .func = test__pmu, 51e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng }, 52e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng { 53e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng .desc = "Test dso data interface", 54e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng .func = test__dso_data, 55e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng }, 56e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng { 57e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng .desc = "roundtrip evsel->name check", 58e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng .func = test__perf_evsel__roundtrip_name_test, 59e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng }, 60e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng { 61e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng .desc = "Check parsing of sched tracepoints fields", 62e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng .func = test__perf_evsel__tp_sched_test, 63e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng }, 64e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng { 65e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng .desc = "Generate and check syscalls:sys_enter_open event fields", 66e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng .func = test__syscall_open_tp_fields, 67e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng }, 68e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng { 69e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng .desc = "struct perf_event_attr setup", 70e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng .func = test__attr, 71e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng }, 72e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng { 73e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng .desc = "Test matching and linking multiple hists", 74e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng .func = test__hists_link, 75e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng }, 76e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng { 77e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng .desc = "Try 'use perf' in python, checking link problems", 78e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng .func = test__python_use, 79e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng }, 80e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng { 81e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng .desc = "Test breakpoint overflow signal handler", 82e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng .func = test__bp_signal, 83e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng }, 84e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng { 85e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng .desc = "Test breakpoint overflow sampling", 86e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng .func = test__bp_signal_overflow, 87e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng }, 88e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng { 89e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng .desc = "Test number of exit event of a simple workload", 90e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng .func = test__task_exit, 91e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng }, 92e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng { 93e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng .desc = "Test software clock events have valid period values", 94e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng .func = test__sw_clock_freq, 95e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng }, 96e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#if defined(__x86_64__) || defined(__i386__) 97e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng { 98e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng .desc = "Test converting perf time to TSC", 99e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng .func = test__perf_time_to_tsc, 100e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng }, 101e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#endif 102e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng { 103e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng .desc = "Test object code reading", 104e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng .func = test__code_reading, 105e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng }, 106e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng { 107e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng .desc = "Test sample parsing", 108e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng .func = test__sample_parsing, 109e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng }, 110e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng { 111e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng .desc = "Test using a dummy software event to keep tracking", 112e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng .func = test__keep_tracking, 113e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng }, 114e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng { 115e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng .desc = "Test parsing with no sample_id_all bit set", 116e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng .func = test__parse_no_sample_id_all, 117e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng }, 118e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng { 119e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng .func = NULL, 120e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng }, 121e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}; 122e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 123e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic bool perf_test__matches(int curr, int argc, const char *argv[]) 124e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{ 125e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng int i; 126e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 127e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (argc == 0) 128e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng return true; 129e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 130e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng for (i = 0; i < argc; ++i) { 131e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng char *end; 132e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng long nr = strtoul(argv[i], &end, 10); 133e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 134e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (*end == '\0') { 135e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (nr == curr + 1) 136e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng return true; 137e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng continue; 138e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng } 139e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 140e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (strstr(tests[curr].desc, argv[i])) 141e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng return true; 142e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng } 143e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 144e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng return false; 145e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng} 146e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 147e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic int __cmd_test(int argc, const char *argv[], struct intlist *skiplist) 148e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{ 149e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng int i = 0; 150e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng int width = 0; 151e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 152e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng while (tests[i].func) { 153e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng int len = strlen(tests[i].desc); 154e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 155e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (width < len) 156e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng width = len; 157e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng ++i; 158e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng } 159e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 160e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng i = 0; 161e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng while (tests[i].func) { 162e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng int curr = i++, err; 163e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 164e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (!perf_test__matches(curr, argc, argv)) 165e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng continue; 166e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 167e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng pr_info("%2d: %-*s:", i, width, tests[curr].desc); 168e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 169e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (intlist__find(skiplist, i)) { 170e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng color_fprintf(stderr, PERF_COLOR_YELLOW, " Skip (user override)\n"); 171e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng continue; 172e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng } 173e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 174e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng pr_debug("\n--- start ---\n"); 175e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng err = tests[curr].func(); 176e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng pr_debug("---- end ----\n%s:", tests[curr].desc); 177e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 178e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng switch (err) { 179e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng case TEST_OK: 180e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng pr_info(" Ok\n"); 181e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng break; 182e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng case TEST_SKIP: 183e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng color_fprintf(stderr, PERF_COLOR_YELLOW, " Skip\n"); 184e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng break; 185e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng case TEST_FAIL: 186e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng default: 187e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng color_fprintf(stderr, PERF_COLOR_RED, " FAILED!\n"); 188e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng break; 189e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng } 190e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng } 191e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 192e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng return 0; 193e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng} 194e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 195e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic int perf_test__list(int argc, const char **argv) 196e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{ 197e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng int i = 0; 198e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 199e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng while (tests[i].func) { 200e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng int curr = i++; 201e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 202e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (argc > 1 && !strstr(tests[curr].desc, argv[1])) 203e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng continue; 204e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 205e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng pr_info("%2d: %s\n", i, tests[curr].desc); 206e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng } 207e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 208e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng return 0; 209e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng} 210e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 211e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengint cmd_test(int argc, const char **argv, const char *prefix __maybe_unused) 212e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{ 213e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng const char * const test_usage[] = { 214e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng "perf test [<options>] [{list <test-name-fragment>|[<test-name-fragments>|<test-numbers>]}]", 215e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng NULL, 216e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng }; 217e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng const char *skip = NULL; 218e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng const struct option test_options[] = { 219e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng OPT_STRING('s', "skip", &skip, "tests", "tests to skip"), 220e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng OPT_INCR('v', "verbose", &verbose, 221e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng "be more verbose (show symbol address, etc)"), 222e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng OPT_END() 223e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng }; 224e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng struct intlist *skiplist = NULL; 225e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 226e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng argc = parse_options(argc, argv, test_options, test_usage, 0); 227e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (argc >= 1 && !strcmp(argv[0], "list")) 228e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng return perf_test__list(argc, argv); 229e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 230e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng symbol_conf.priv_size = sizeof(int); 231e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng symbol_conf.sort_by_name = true; 232e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng symbol_conf.try_vmlinux_path = true; 233e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 234e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (symbol__init() < 0) 235e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng return -1; 236e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 237e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng if (skip != NULL) 238e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng skiplist = intlist__new(skip); 239e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng 240e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng return __cmd_test(argc, argv, skiplist); 241e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng} 242