Back to home page

OSCL-LXR

 
 

    


0001 #include <linux/perf_event.h>
0002 #include <perf/evlist.h>
0003 #include <perf/evsel.h>
0004 #include <perf/cpumap.h>
0005 #include <perf/threadmap.h>
0006 #include <perf/mmap.h>
0007 #include <perf/core.h>
0008 #include <perf/event.h>
0009 #include <stdio.h>
0010 #include <unistd.h>
0011 
0012 static int libperf_print(enum libperf_print_level level,
0013                          const char *fmt, va_list ap)
0014 {
0015     return vfprintf(stderr, fmt, ap);
0016 }
0017 
0018 int main(int argc, char **argv)
0019 {
0020     int count = 100000, err = 0;
0021     struct perf_evlist *evlist;
0022     struct perf_evsel *evsel;
0023     struct perf_thread_map *threads;
0024     struct perf_counts_values counts;
0025 
0026     struct perf_event_attr attr1 = {
0027         .type        = PERF_TYPE_SOFTWARE,
0028         .config      = PERF_COUNT_SW_CPU_CLOCK,
0029         .read_format = PERF_FORMAT_TOTAL_TIME_ENABLED|PERF_FORMAT_TOTAL_TIME_RUNNING,
0030         .disabled    = 1,
0031     };
0032     struct perf_event_attr attr2 = {
0033         .type        = PERF_TYPE_SOFTWARE,
0034         .config      = PERF_COUNT_SW_TASK_CLOCK,
0035         .read_format = PERF_FORMAT_TOTAL_TIME_ENABLED|PERF_FORMAT_TOTAL_TIME_RUNNING,
0036         .disabled    = 1,
0037     };
0038 
0039     libperf_init(libperf_print);
0040     threads = perf_thread_map__new_dummy();
0041     if (!threads) {
0042         fprintf(stderr, "failed to create threads\n");
0043         return -1;
0044     }
0045     perf_thread_map__set_pid(threads, 0, 0);
0046     evlist = perf_evlist__new();
0047     if (!evlist) {
0048         fprintf(stderr, "failed to create evlist\n");
0049         goto out_threads;
0050     }
0051     evsel = perf_evsel__new(&attr1);
0052     if (!evsel) {
0053         fprintf(stderr, "failed to create evsel1\n");
0054         goto out_evlist;
0055     }
0056     perf_evlist__add(evlist, evsel);
0057     evsel = perf_evsel__new(&attr2);
0058     if (!evsel) {
0059         fprintf(stderr, "failed to create evsel2\n");
0060         goto out_evlist;
0061     }
0062     perf_evlist__add(evlist, evsel);
0063     perf_evlist__set_maps(evlist, NULL, threads);
0064     err = perf_evlist__open(evlist);
0065     if (err) {
0066         fprintf(stderr, "failed to open evsel\n");
0067         goto out_evlist;
0068     }
0069     perf_evlist__enable(evlist);
0070     while (count--);
0071     perf_evlist__disable(evlist);
0072     perf_evlist__for_each_evsel(evlist, evsel) {
0073         perf_evsel__read(evsel, 0, 0, &counts);
0074         fprintf(stdout, "count %llu, enabled %llu, run %llu\n",
0075                 counts.val, counts.ena, counts.run);
0076     }
0077     perf_evlist__close(evlist);
0078 out_evlist:
0079     perf_evlist__delete(evlist);
0080 out_threads:
0081     perf_thread_map__put(threads);
0082     return err;
0083 }