#include <linux/perf_event.h> #include <perf/evlist.h> #include <perf/evsel.h> #include <perf/cpumap.h> #include <perf/threadmap.h> #include <perf/mmap.h> #include <perf/core.h> #include <perf/event.h> #include <stdio.h> #include <unistd.h> static int libperf_print(enum libperf_print_level level, const char *fmt, va_list ap) { return vfprintf(stderr, fmt, ap); } int main(int argc, char **argv) { int count = 100000, err = 0; struct perf_evlist *evlist; struct perf_evsel *evsel; struct perf_thread_map *threads; struct perf_counts_values counts; struct perf_event_attr attr1 = { .type = PERF_TYPE_SOFTWARE, .config = PERF_COUNT_SW_CPU_CLOCK, .read_format = PERF_FORMAT_TOTAL_TIME_ENABLED|PERF_FORMAT_TOTAL_TIME_RUNNING, .disabled = 1, }; struct perf_event_attr attr2 = { .type = PERF_TYPE_SOFTWARE, .config = PERF_COUNT_SW_TASK_CLOCK, .read_format = PERF_FORMAT_TOTAL_TIME_ENABLED|PERF_FORMAT_TOTAL_TIME_RUNNING, .disabled = 1, }; libperf_init(libperf_print); threads = perf_thread_map__new_dummy(); if (!threads) { fprintf(stderr, "failed to create threads\n"); return -1; } perf_thread_map__set_pid(threads, 0, 0); evlist = perf_evlist__new(); if (!evlist) { fprintf(stderr, "failed to create evlist\n"); goto out_threads; } evsel = perf_evsel__new(&attr1); if (!evsel) { fprintf(stderr, "failed to create evsel1\n"); goto out_evlist; } perf_evlist__add(evlist, evsel); evsel = perf_evsel__new(&attr2); if (!evsel) { fprintf(stderr, "failed to create evsel2\n"); goto out_evlist; } perf_evlist__add(evlist, evsel); perf_evlist__set_maps(evlist, NULL, threads); err = perf_evlist__open(evlist); if (err) { fprintf(stderr, "failed to open evsel\n"); goto out_evlist; } perf_evlist__enable(evlist); while (count--); perf_evlist__disable(evlist); perf_evlist__for_each_evsel(evlist, evsel) { perf_evsel__read(evsel, 0, 0, &counts); fprintf(stdout, "count %llu, enabled %llu, run %llu\n", counts.val, counts.ena, counts.run); } perf_evlist__close(evlist); out_evlist: perf_evlist__delete(evlist); out_threads: perf_thread_map__put(threads); return err; }