counting.c 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. #include <linux/perf_event.h>
  2. #include <perf/evlist.h>
  3. #include <perf/evsel.h>
  4. #include <perf/cpumap.h>
  5. #include <perf/threadmap.h>
  6. #include <perf/mmap.h>
  7. #include <perf/core.h>
  8. #include <perf/event.h>
  9. #include <stdio.h>
  10. #include <unistd.h>
  11. static int libperf_print(enum libperf_print_level level,
  12. const char *fmt, va_list ap)
  13. {
  14. return vfprintf(stderr, fmt, ap);
  15. }
  16. int main(int argc, char **argv)
  17. {
  18. int count = 100000, err = 0;
  19. struct perf_evlist *evlist;
  20. struct perf_evsel *evsel;
  21. struct perf_thread_map *threads;
  22. struct perf_counts_values counts;
  23. struct perf_event_attr attr1 = {
  24. .type = PERF_TYPE_SOFTWARE,
  25. .config = PERF_COUNT_SW_CPU_CLOCK,
  26. .read_format = PERF_FORMAT_TOTAL_TIME_ENABLED|PERF_FORMAT_TOTAL_TIME_RUNNING,
  27. .disabled = 1,
  28. };
  29. struct perf_event_attr attr2 = {
  30. .type = PERF_TYPE_SOFTWARE,
  31. .config = PERF_COUNT_SW_TASK_CLOCK,
  32. .read_format = PERF_FORMAT_TOTAL_TIME_ENABLED|PERF_FORMAT_TOTAL_TIME_RUNNING,
  33. .disabled = 1,
  34. };
  35. libperf_init(libperf_print);
  36. threads = perf_thread_map__new_dummy();
  37. if (!threads) {
  38. fprintf(stderr, "failed to create threads\n");
  39. return -1;
  40. }
  41. perf_thread_map__set_pid(threads, 0, 0);
  42. evlist = perf_evlist__new();
  43. if (!evlist) {
  44. fprintf(stderr, "failed to create evlist\n");
  45. goto out_threads;
  46. }
  47. evsel = perf_evsel__new(&attr1);
  48. if (!evsel) {
  49. fprintf(stderr, "failed to create evsel1\n");
  50. goto out_evlist;
  51. }
  52. perf_evlist__add(evlist, evsel);
  53. evsel = perf_evsel__new(&attr2);
  54. if (!evsel) {
  55. fprintf(stderr, "failed to create evsel2\n");
  56. goto out_evlist;
  57. }
  58. perf_evlist__add(evlist, evsel);
  59. perf_evlist__set_maps(evlist, NULL, threads);
  60. err = perf_evlist__open(evlist);
  61. if (err) {
  62. fprintf(stderr, "failed to open evsel\n");
  63. goto out_evlist;
  64. }
  65. perf_evlist__enable(evlist);
  66. while (count--);
  67. perf_evlist__disable(evlist);
  68. perf_evlist__for_each_evsel(evlist, evsel) {
  69. perf_evsel__read(evsel, 0, 0, &counts);
  70. fprintf(stdout, "count %llu, enabled %llu, run %llu\n",
  71. counts.val, counts.ena, counts.run);
  72. }
  73. perf_evlist__close(evlist);
  74. out_evlist:
  75. perf_evlist__delete(evlist);
  76. out_threads:
  77. perf_thread_map__put(threads);
  78. return err;
  79. }