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