Linux Perf
builtin-test.c
Go to the documentation of this file.
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * builtin-test.c
4  *
5  * Builtin regression testing command: ever growing number of sanity tests
6  */
7 #include <fcntl.h>
8 #include <errno.h>
9 #include <unistd.h>
10 #include <string.h>
11 #include <sys/types.h>
12 #include <dirent.h>
13 #include <sys/wait.h>
14 #include <sys/stat.h>
15 #include "builtin.h"
16 #include "hist.h"
17 #include "intlist.h"
18 #include "tests.h"
19 #include "debug.h"
20 #include "color.h"
21 #include <subcmd/parse-options.h>
22 #include "string2.h"
23 #include "symbol.h"
24 #include <linux/kernel.h>
25 #include <subcmd/exec-cmd.h>
26 
27 static bool dont_fork;
28 
29 struct test __weak arch_tests[] = {
30  {
31  .func = NULL,
32  },
33 };
34 
35 static struct test generic_tests[] = {
36  {
37  .desc = "vmlinux symtab matches kallsyms",
39  },
40  {
41  .desc = "Detect openat syscall event",
43  },
44  {
45  .desc = "Detect openat syscall event on all cpus",
47  },
48  {
49  .desc = "Read samples using the mmap interface",
50  .func = test__basic_mmap,
51  },
52  {
53  .desc = "Test data source output",
54  .func = test__mem,
55  },
56  {
57  .desc = "Parse event definition strings",
58  .func = test__parse_events,
59  },
60  {
61  .desc = "Simple expression parser",
62  .func = test__expr,
63  },
64  {
65  .desc = "PERF_RECORD_* events & perf_sample fields",
66  .func = test__PERF_RECORD,
67  },
68  {
69  .desc = "Parse perf pmu format",
70  .func = test__pmu,
71  },
72  {
73  .desc = "DSO data read",
74  .func = test__dso_data,
75  },
76  {
77  .desc = "DSO data cache",
78  .func = test__dso_data_cache,
79  },
80  {
81  .desc = "DSO data reopen",
82  .func = test__dso_data_reopen,
83  },
84  {
85  .desc = "Roundtrip evsel->name",
87  },
88  {
89  .desc = "Parse sched tracepoints fields",
91  },
92  {
93  .desc = "syscalls:sys_enter_openat event fields",
95  },
96  {
97  .desc = "Setup struct perf_event_attr",
98  .func = test__attr,
99  },
100  {
101  .desc = "Match and link multiple hists",
102  .func = test__hists_link,
103  },
104  {
105  .desc = "'import perf' in python",
106  .func = test__python_use,
107  },
108  {
109  .desc = "Breakpoint overflow signal handler",
110  .func = test__bp_signal,
111  .is_supported = test__bp_signal_is_supported,
112  },
113  {
114  .desc = "Breakpoint overflow sampling",
115  .func = test__bp_signal_overflow,
116  .is_supported = test__bp_signal_is_supported,
117  },
118  {
119  .desc = "Breakpoint accounting",
120  .func = test__bp_accounting,
121  .is_supported = test__bp_signal_is_supported,
122  },
123  {
124  .desc = "Number of exit events of a simple workload",
125  .func = test__task_exit,
126  },
127  {
128  .desc = "Software clock events period values",
129  .func = test__sw_clock_freq,
130  },
131  {
132  .desc = "Object code reading",
133  .func = test__code_reading,
134  },
135  {
136  .desc = "Sample parsing",
137  .func = test__sample_parsing,
138  },
139  {
140  .desc = "Use a dummy software event to keep tracking",
141  .func = test__keep_tracking,
142  },
143  {
144  .desc = "Parse with no sample_id_all bit set",
146  },
147  {
148  .desc = "Filter hist entries",
149  .func = test__hists_filter,
150  },
151  {
152  .desc = "Lookup mmap thread",
153  .func = test__mmap_thread_lookup,
154  },
155  {
156  .desc = "Share thread mg",
157  .func = test__thread_mg_share,
158  },
159  {
160  .desc = "Sort output of hist entries",
161  .func = test__hists_output,
162  },
163  {
164  .desc = "Cumulate child hist entries",
165  .func = test__hists_cumulate,
166  },
167  {
168  .desc = "Track with sched_switch",
169  .func = test__switch_tracking,
170  },
171  {
172  .desc = "Filter fds with revents mask in a fdarray",
173  .func = test__fdarray__filter,
174  },
175  {
176  .desc = "Add fd to a fdarray, making it autogrow",
177  .func = test__fdarray__add,
178  },
179  {
180  .desc = "kmod_path__parse",
181  .func = test__kmod_path__parse,
182  },
183  {
184  .desc = "Thread map",
185  .func = test__thread_map,
186  },
187  {
188  .desc = "LLVM search and compile",
189  .func = test__llvm,
190  .subtest = {
191  .skip_if_fail = true,
192  .get_nr = test__llvm_subtest_get_nr,
193  .get_desc = test__llvm_subtest_get_desc,
194  },
195  },
196  {
197  .desc = "Session topology",
198  .func = test__session_topology,
199  },
200  {
201  .desc = "BPF filter",
202  .func = test__bpf,
203  .subtest = {
204  .skip_if_fail = true,
205  .get_nr = test__bpf_subtest_get_nr,
206  .get_desc = test__bpf_subtest_get_desc,
207  },
208  },
209  {
210  .desc = "Synthesize thread map",
212  },
213  {
214  .desc = "Remove thread map",
215  .func = test__thread_map_remove,
216  },
217  {
218  .desc = "Synthesize cpu map",
219  .func = test__cpu_map_synthesize,
220  },
221  {
222  .desc = "Synthesize stat config",
224  },
225  {
226  .desc = "Synthesize stat",
227  .func = test__synthesize_stat,
228  },
229  {
230  .desc = "Synthesize stat round",
232  },
233  {
234  .desc = "Synthesize attr update",
235  .func = test__event_update,
236  },
237  {
238  .desc = "Event times",
239  .func = test__event_times,
240  },
241  {
242  .desc = "Read backward ring buffer",
244  },
245  {
246  .desc = "Print cpu map",
247  .func = test__cpu_map_print,
248  },
249  {
250  .desc = "Probe SDT events",
251  .func = test__sdt_event,
252  },
253  {
254  .desc = "is_printable_array",
255  .func = test__is_printable_array,
256  },
257  {
258  .desc = "Print bitmap",
259  .func = test__bitmap_print,
260  },
261  {
262  .desc = "perf hooks",
263  .func = test__perf_hooks,
264  },
265  {
266  .desc = "builtin clang support",
267  .func = test__clang,
268  .subtest = {
269  .skip_if_fail = true,
270  .get_nr = test__clang_subtest_get_nr,
271  .get_desc = test__clang_subtest_get_desc,
272  }
273  },
274  {
275  .desc = "unit_number__scnprintf",
277  },
278  {
279  .desc = "mem2node",
280  .func = test__mem2node,
281  },
282  {
283  .func = NULL,
284  },
285 };
286 
287 static struct test *tests[] = {
289  arch_tests,
290 };
291 
292 static bool perf_test__matches(struct test *test, int curr, int argc, const char *argv[])
293 {
294  int i;
295 
296  if (argc == 0)
297  return true;
298 
299  for (i = 0; i < argc; ++i) {
300  char *end;
301  long nr = strtoul(argv[i], &end, 10);
302 
303  if (*end == '\0') {
304  if (nr == curr + 1)
305  return true;
306  continue;
307  }
308 
309  if (strcasestr(test->desc, argv[i]))
310  return true;
311  }
312 
313  return false;
314 }
315 
316 static int run_test(struct test *test, int subtest)
317 {
318  int status, err = -1, child = dont_fork ? 0 : fork();
319  char sbuf[STRERR_BUFSIZE];
320 
321  if (child < 0) {
322  pr_err("failed to fork test: %s\n",
323  str_error_r(errno, sbuf, sizeof(sbuf)));
324  return -1;
325  }
326 
327  if (!child) {
328  if (!dont_fork) {
329  pr_debug("test child forked, pid %d\n", getpid());
330 
331  if (verbose <= 0) {
332  int nullfd = open("/dev/null", O_WRONLY);
333 
334  if (nullfd >= 0) {
335  close(STDERR_FILENO);
336  close(STDOUT_FILENO);
337 
338  dup2(nullfd, STDOUT_FILENO);
339  dup2(STDOUT_FILENO, STDERR_FILENO);
340  close(nullfd);
341  }
342  } else {
343  signal(SIGSEGV, sighandler_dump_stack);
344  signal(SIGFPE, sighandler_dump_stack);
345  }
346  }
347 
348  err = test->func(test, subtest);
349  if (!dont_fork)
350  exit(err);
351  }
352 
353  if (!dont_fork) {
354  wait(&status);
355 
356  if (WIFEXITED(status)) {
357  err = (signed char)WEXITSTATUS(status);
358  pr_debug("test child finished with %d\n", err);
359  } else if (WIFSIGNALED(status)) {
360  err = -1;
361  pr_debug("test child interrupted\n");
362  }
363  }
364 
365  return err;
366 }
367 
368 #define for_each_test(j, t) \
369  for (j = 0; j < ARRAY_SIZE(tests); j++) \
370  for (t = &tests[j][0]; t->func; t++)
371 
372 static int test_and_print(struct test *t, bool force_skip, int subtest)
373 {
374  int err;
375 
376  if (!force_skip) {
377  pr_debug("\n--- start ---\n");
378  err = run_test(t, subtest);
379  pr_debug("---- end ----\n");
380  } else {
381  pr_debug("\n--- force skipped ---\n");
382  err = TEST_SKIP;
383  }
384 
385  if (!t->subtest.get_nr)
386  pr_debug("%s:", t->desc);
387  else
388  pr_debug("%s subtest %d:", t->desc, subtest);
389 
390  switch (err) {
391  case TEST_OK:
392  pr_info(" Ok\n");
393  break;
394  case TEST_SKIP:
395  color_fprintf(stderr, PERF_COLOR_YELLOW, " Skip\n");
396  break;
397  case TEST_FAIL:
398  default:
399  color_fprintf(stderr, PERF_COLOR_RED, " FAILED!\n");
400  break;
401  }
402 
403  return err;
404 }
405 
406 static const char *shell_test__description(char *description, size_t size,
407  const char *path, const char *name)
408 {
409  FILE *fp;
410  char filename[PATH_MAX];
411 
412  path__join(filename, sizeof(filename), path, name);
413  fp = fopen(filename, "r");
414  if (!fp)
415  return NULL;
416 
417  description = fgets(description, size, fp);
418  fclose(fp);
419 
420  return description ? trim(description + 1) : NULL;
421 }
422 
423 #define for_each_shell_test(dir, base, ent) \
424  while ((ent = readdir(dir)) != NULL) \
425  if (!is_directory(base, ent))
426 
427 static const char *shell_tests__dir(char *path, size_t size)
428 {
429  const char *devel_dirs[] = { "./tools/perf/tests", "./tests", };
430  char *exec_path;
431  unsigned int i;
432 
433  for (i = 0; i < ARRAY_SIZE(devel_dirs); ++i) {
434  struct stat st;
435  if (!lstat(devel_dirs[i], &st)) {
436  scnprintf(path, size, "%s/shell", devel_dirs[i]);
437  if (!lstat(devel_dirs[i], &st))
438  return path;
439  }
440  }
441 
442  /* Then installed path. */
443  exec_path = get_argv_exec_path();
444  scnprintf(path, size, "%s/tests/shell", exec_path);
445  free(exec_path);
446  return path;
447 }
448 
450 {
451  DIR *dir;
452  struct dirent *ent;
453  char path_dir[PATH_MAX];
454  const char *path = shell_tests__dir(path_dir, sizeof(path_dir));
455  int width = 0;
456 
457  if (path == NULL)
458  return -1;
459 
460  dir = opendir(path);
461  if (!dir)
462  return -1;
463 
464  for_each_shell_test(dir, path, ent) {
465  char bf[256];
466  const char *desc = shell_test__description(bf, sizeof(bf), path, ent->d_name);
467 
468  if (desc) {
469  int len = strlen(desc);
470 
471  if (width < len)
472  width = len;
473  }
474  }
475 
476  closedir(dir);
477  return width;
478 }
479 
480 struct shell_test {
481  const char *dir;
482  const char *file;
483 };
484 
485 static int shell_test__run(struct test *test, int subdir __maybe_unused)
486 {
487  int err;
488  char script[PATH_MAX];
489  struct shell_test *st = test->priv;
490 
491  path__join(script, sizeof(script), st->dir, st->file);
492 
493  err = system(script);
494  if (!err)
495  return TEST_OK;
496 
497  return WEXITSTATUS(err) == 2 ? TEST_SKIP : TEST_FAIL;
498 }
499 
500 static int run_shell_tests(int argc, const char *argv[], int i, int width)
501 {
502  DIR *dir;
503  struct dirent *ent;
504  char path_dir[PATH_MAX];
505  struct shell_test st = {
506  .dir = shell_tests__dir(path_dir, sizeof(path_dir)),
507  };
508 
509  if (st.dir == NULL)
510  return -1;
511 
512  dir = opendir(st.dir);
513  if (!dir)
514  return -1;
515 
516  for_each_shell_test(dir, st.dir, ent) {
517  int curr = i++;
518  char desc[256];
519  struct test test = {
520  .desc = shell_test__description(desc, sizeof(desc), st.dir, ent->d_name),
521  .func = shell_test__run,
522  .priv = &st,
523  };
524 
525  if (!perf_test__matches(&test, curr, argc, argv))
526  continue;
527 
528  st.file = ent->d_name;
529  pr_info("%2d: %-*s:", i, width, test.desc);
530  test_and_print(&test, false, -1);
531  }
532 
533  closedir(dir);
534  return 0;
535 }
536 
537 static int __cmd_test(int argc, const char *argv[], struct intlist *skiplist)
538 {
539  struct test *t;
540  unsigned int j;
541  int i = 0;
542  int width = shell_tests__max_desc_width();
543 
544  for_each_test(j, t) {
545  int len = strlen(t->desc);
546 
547  if (width < len)
548  width = len;
549  }
550 
551  for_each_test(j, t) {
552  int curr = i++, err;
553 
554  if (!perf_test__matches(t, curr, argc, argv))
555  continue;
556 
557  if (t->is_supported && !t->is_supported()) {
558  pr_debug("%2d: %-*s: Disabled\n", i, width, t->desc);
559  continue;
560  }
561 
562  pr_info("%2d: %-*s:", i, width, t->desc);
563 
564  if (intlist__find(skiplist, i)) {
565  color_fprintf(stderr, PERF_COLOR_YELLOW, " Skip (user override)\n");
566  continue;
567  }
568 
569  if (!t->subtest.get_nr) {
570  test_and_print(t, false, -1);
571  } else {
572  int subn = t->subtest.get_nr();
573  /*
574  * minus 2 to align with normal testcases.
575  * For subtest we print additional '.x' in number.
576  * for example:
577  *
578  * 35: Test LLVM searching and compiling :
579  * 35.1: Basic BPF llvm compiling test : Ok
580  */
581  int subw = width > 2 ? width - 2 : width;
582  bool skip = false;
583  int subi;
584 
585  if (subn <= 0) {
587  " Skip (not compiled in)\n");
588  continue;
589  }
590  pr_info("\n");
591 
592  for (subi = 0; subi < subn; subi++) {
593  int len = strlen(t->subtest.get_desc(subi));
594 
595  if (subw < len)
596  subw = len;
597  }
598 
599  for (subi = 0; subi < subn; subi++) {
600  pr_info("%2d.%1d: %-*s:", i, subi + 1, subw,
601  t->subtest.get_desc(subi));
602  err = test_and_print(t, skip, subi);
603  if (err != TEST_OK && t->subtest.skip_if_fail)
604  skip = true;
605  }
606  }
607  }
608 
609  return run_shell_tests(argc, argv, i, width);
610 }
611 
612 static int perf_test__list_shell(int argc, const char **argv, int i)
613 {
614  DIR *dir;
615  struct dirent *ent;
616  char path_dir[PATH_MAX];
617  const char *path = shell_tests__dir(path_dir, sizeof(path_dir));
618 
619  if (path == NULL)
620  return -1;
621 
622  dir = opendir(path);
623  if (!dir)
624  return -1;
625 
626  for_each_shell_test(dir, path, ent) {
627  int curr = i++;
628  char bf[256];
629  struct test t = {
630  .desc = shell_test__description(bf, sizeof(bf), path, ent->d_name),
631  };
632 
633  if (!perf_test__matches(&t, curr, argc, argv))
634  continue;
635 
636  pr_info("%2d: %s\n", i, t.desc);
637  }
638 
639  closedir(dir);
640  return 0;
641 }
642 
643 static int perf_test__list(int argc, const char **argv)
644 {
645  unsigned int j;
646  struct test *t;
647  int i = 0;
648 
649  for_each_test(j, t) {
650  int curr = i++;
651 
652  if (!perf_test__matches(t, curr, argc, argv) ||
653  (t->is_supported && !t->is_supported()))
654  continue;
655 
656  pr_info("%2d: %s\n", i, t->desc);
657 
658  if (t->subtest.get_nr) {
659  int subn = t->subtest.get_nr();
660  int subi;
661 
662  for (subi = 0; subi < subn; subi++)
663  pr_info("%2d:%1d: %s\n", i, subi + 1,
664  t->subtest.get_desc(subi));
665  }
666  }
667 
668  perf_test__list_shell(argc, argv, i);
669 
670  return 0;
671 }
672 
673 int cmd_test(int argc, const char **argv)
674 {
675  const char *test_usage[] = {
676  "perf test [<options>] [{list <test-name-fragment>|[<test-name-fragments>|<test-numbers>]}]",
677  NULL,
678  };
679  const char *skip = NULL;
680  const struct option test_options[] = {
681  OPT_STRING('s', "skip", &skip, "tests", "tests to skip"),
682  OPT_INCR('v', "verbose", &verbose,
683  "be more verbose (show symbol address, etc)"),
684  OPT_BOOLEAN('F', "dont-fork", &dont_fork,
685  "Do not fork for testcase"),
686  OPT_END()
687  };
688  const char * const test_subcommands[] = { "list", NULL };
689  struct intlist *skiplist = NULL;
690  int ret = hists__init();
691 
692  if (ret < 0)
693  return ret;
694 
695  argc = parse_options_subcommand(argc, argv, test_options, test_subcommands, test_usage, 0);
696  if (argc >= 1 && !strcmp(argv[0], "list"))
697  return perf_test__list(argc - 1, argv + 1);
698 
699  symbol_conf.priv_size = sizeof(int);
700  symbol_conf.sort_by_name = true;
702 
703  if (symbol__init(NULL) < 0)
704  return -1;
705 
706  if (skip != NULL)
707  skiplist = intlist__new(skip);
708 
709  return __cmd_test(argc, argv, skiplist);
710 }
int test__thread_map_remove(struct test *test, int subtest)
int test__backward_ring_buffer(struct test *test __maybe_unused, int subtest __maybe_unused)
int color_fprintf(FILE *fp, const char *color, const char *fmt,...)
Definition: color.c:123
int test__basic_mmap(struct test *test __maybe_unused, int subtest __maybe_unused)
Definition: mmap-basic.c:26
static int shell_test__run(struct test *test, int subdir __maybe_unused)
Definition: builtin-test.c:485
bool skip_if_fail
Definition: tests.h:34
int test__cpu_map_synthesize(struct test *test __maybe_unused, int subtest __maybe_unused)
Definition: cpumap.c:76
int test__PERF_RECORD(struct test *test __maybe_unused, int subtest __maybe_unused)
Definition: perf-record.c:41
static struct test generic_tests[]
Definition: builtin-test.c:35
size_t size
Definition: evsel.c:60
bool test__bp_signal_is_supported(void)
Definition: bp_signal.c:292
int test__pmu(struct test *test __maybe_unused, int subtest __maybe_unused)
Definition: pmu.c:139
static char * dir
Definition: attr.c:39
static void skip(int size)
int test__bp_signal_overflow(struct test *test __maybe_unused, int subtest __maybe_unused)
const char * dir
Definition: builtin-test.c:481
#define for_each_test(j, t)
Definition: builtin-test.c:368
const char * filename
Definition: hists_common.c:26
int int err
Definition: 5sec.c:44
bool try_vmlinux_path
Definition: symbol.h:93
int test__parse_no_sample_id_all(struct test *test __maybe_unused, int subtest __maybe_unused)
int test__bpf(struct test *test __maybe_unused, int i __maybe_unused)
Definition: bpf.c:356
struct test::@31 subtest
int test__bp_signal(struct test *test __maybe_unused, int subtest __maybe_unused)
Definition: bp_signal.c:168
const char * desc
Definition: tests.h:31
int test__thread_map_synthesize(struct test *test, int subtest)
int test__expr(struct test *t __maybe_unused, int subtest __maybe_unused)
Definition: expr.c:17
int test__thread_mg_share(struct test *test, int subtest)
int test__synthesize_stat(struct test *test __maybe_unused, int subtest __maybe_unused)
Definition: stat.c:79
bool(* is_supported)(void)
Definition: tests.h:38
int test__sw_clock_freq(struct test *test __maybe_unused, int subtest __maybe_unused)
Definition: sw-clock.c:135
static char * trim(char *s)
Definition: string2.h:25
int test__fdarray__filter(struct test *test __maybe_unused, int subtest __maybe_unused)
Definition: fdarray.c:30
int test__synthesize_stat_config(struct test *test __maybe_unused, int subtest __maybe_unused)
Definition: stat.c:49
static int perf_test__list_shell(int argc, const char **argv, int i)
Definition: builtin-test.c:612
int(* func)(struct test *test, int subtest)
Definition: tests.h:32
#define pr_err(fmt,...)
Definition: json.h:21
int test__fdarray__add(struct test *test __maybe_unused, int subtest __maybe_unused)
Definition: fdarray.c:108
int test__unit_number__scnprint(struct test *test, int subtest)
static bool dont_fork
Definition: builtin-test.c:27
static int __cmd_test(int argc, const char *argv[], struct intlist *skiplist)
Definition: builtin-test.c:537
int test__hists_output(struct test *test __maybe_unused, int subtest __maybe_unused)
Definition: hists_output.c:577
static const char * shell_test__description(char *description, size_t size, const char *path, const char *name)
Definition: builtin-test.c:406
int path__join(char *bf, size_t size, const char *path1, const char *path2)
Definition: path.c:61
int test__parse_events(struct test *test __maybe_unused, int subtest __maybe_unused)
struct int_node * intlist__find(struct intlist *ilist, int i)
Definition: intlist.c:81
int test__attr(struct test *test __maybe_unused, int subtest __maybe_unused)
Definition: attr.c:179
const char * name
static int run_test(struct test *test, int subtest)
Definition: builtin-test.c:316
static int run_shell_tests(int argc, const char *argv[], int i, int width)
Definition: builtin-test.c:500
int(* get_nr)(void)
Definition: tests.h:35
unsigned short priv_size
Definition: symbol.h:92
#define pr_debug(fmt,...)
Definition: json.h:27
int test__bitmap_print(struct test *test __maybe_unused, int subtest __maybe_unused)
Definition: bitmap.c:44
void * priv
Definition: tests.h:39
const char * test__llvm_subtest_get_desc(int subtest)
Definition: llvm.c:166
static struct test * tests[]
Definition: builtin-test.c:287
int test__bp_accounting(struct test *test __maybe_unused, int subtest __maybe_unused)
Definition: bp_account.c:179
description
Definition: setup.py:55
struct test __weak arch_tests[]
Definition: builtin-test.c:29
int test__keep_tracking(struct test *test __maybe_unused, int subtest __maybe_unused)
Definition: keep-tracking.c:58
int test__hists_cumulate(struct test *test __maybe_unused, int subtest __maybe_unused)
int test__llvm_subtest_get_nr(void)
Definition: llvm.c:161
static const char * shell_tests__dir(char *path, size_t size)
Definition: builtin-test.c:427
int test__clang(struct test *test __maybe_unused, int i __maybe_unused)
Definition: clang.c:37
const char * test__bpf_subtest_get_desc(int i __maybe_unused)
Definition: bpf.c:351
#define PATH_MAX
Definition: jevents.c:1042
int test__task_exit(struct test *test __maybe_unused, int subtest __maybe_unused)
Definition: task-exit.c:36
const char * test__clang_subtest_get_desc(int i)
Definition: clang.c:29
int test__dso_data(struct test *test __maybe_unused, int subtest __maybe_unused)
Definition: dso-data.c:116
int test__llvm(struct test *test __maybe_unused, int subtest)
Definition: llvm.c:136
int test__cpu_map_print(struct test *test __maybe_unused, int subtest __maybe_unused)
Definition: cpumap.c:110
int hists__init(void)
Definition: hist.c:2629
int test__hists_filter(struct test *test __maybe_unused, int subtest __maybe_unused)
Definition: hists_filter.c:105
int test__sample_parsing(struct test *test __maybe_unused, int subtest __maybe_unused)
int test__python_use(struct test *test __maybe_unused, int subtest __maybe_unused)
Definition: python-use.c:12
int test__mem(struct test *text __maybe_unused, int subtest __maybe_unused)
Definition: mem.c:24
struct intlist * intlist__new(const char *slist)
Definition: intlist.c:110
static int perf_test__list(int argc, const char **argv)
Definition: builtin-test.c:643
int test__openat_syscall_event(struct test *test __maybe_unused, int subtest __maybe_unused)
const char * desc
Definition: clang.c:10
int test__code_reading(struct test *test __maybe_unused, int subtest __maybe_unused)
Definition: code-reading.c:713
int test__clang_subtest_get_nr(void)
Definition: clang.c:24
int test__event_update(struct test *test __maybe_unused, int subtest __maybe_unused)
Definition: event_update.c:80
int test__kmod_path__parse(struct test *t __maybe_unused, int subtest __maybe_unused)
Definition: kmod-path.c:54
int test__synthesize_stat_round(struct test *test __maybe_unused, int subtest __maybe_unused)
Definition: stat.c:105
int test__bpf_subtest_get_nr(void)
Definition: bpf.c:346
bool sort_by_name
Definition: symbol.h:93
int test__mem2node(struct test *t __maybe_unused, int subtest __maybe_unused)
Definition: mem2node.c:42
Definition: tests.h:30
int test__thread_map(struct test *test, int subtest)
int test__dso_data_cache(struct test *test __maybe_unused, int subtest __maybe_unused)
Definition: dso-data.c:251
int test__perf_hooks(struct test *test __maybe_unused, int subtest __maybe_unused)
Definition: perf-hooks.c:31
static bool perf_test__matches(struct test *test, int curr, int argc, const char *argv[])
Definition: builtin-test.c:292
int test__dso_data_reopen(struct test *test __maybe_unused, int subtest __maybe_unused)
Definition: dso-data.c:311
int symbol__init(struct perf_env *env)
Definition: symbol.c:2112
#define PERF_COLOR_RED
Definition: color.h:13
#define pr_info(fmt,...)
Definition: json.h:24
int test__perf_evsel__tp_sched_test(struct test *test __maybe_unused, int subtest __maybe_unused)
#define STRERR_BUFSIZE
Definition: debug.h:43
void free(void *)
int test__vmlinux_matches_kallsyms(struct test *test, int subtest)
int test__sdt_event(struct test *test __maybe_unused, int subtests __maybe_unused)
Definition: sdt.c:113
int verbose
Definition: jevents.c:53
const char *(* get_desc)(int subtest)
Definition: tests.h:36
#define PERF_COLOR_YELLOW
Definition: color.h:15
int test__event_times(struct test *test __maybe_unused, int subtest __maybe_unused)
Definition: event-times.c:217
int test__session_topology(struct test *test, int subtest)
int test__is_printable_array(struct test *test __maybe_unused, int subtest __maybe_unused)
int test__mmap_thread_lookup(struct test *test __maybe_unused, int subtest __maybe_unused)
void sighandler_dump_stack(int sig)
Definition: debug.c:278
int test__syscall_openat_tp_fields(struct test *test __maybe_unused, int subtest __maybe_unused)
#define for_each_shell_test(dir, base, ent)
Definition: builtin-test.c:423
const char * file
Definition: builtin-test.c:482
int test__switch_tracking(struct test *test __maybe_unused, int subtest __maybe_unused)
int test__openat_syscall_event_on_all_cpus(struct test *test __maybe_unused, int subtest __maybe_unused)
int cmd_test(int argc, const char **argv)
Definition: builtin-test.c:673
static int test_and_print(struct test *t, bool force_skip, int subtest)
Definition: builtin-test.c:372
Definition: tests.h:25
static int shell_tests__max_desc_width(void)
Definition: builtin-test.c:449
int test__perf_evsel__roundtrip_name_test(struct test *test __maybe_unused, int subtest __maybe_unused)