open-syscall-tp-fields.c 2.4 KB

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