162306a36Sopenharmony_ci#include <linux/perf_event.h> 262306a36Sopenharmony_ci#include <perf/evlist.h> 362306a36Sopenharmony_ci#include <perf/evsel.h> 462306a36Sopenharmony_ci#include <perf/cpumap.h> 562306a36Sopenharmony_ci#include <perf/threadmap.h> 662306a36Sopenharmony_ci#include <perf/mmap.h> 762306a36Sopenharmony_ci#include <perf/core.h> 862306a36Sopenharmony_ci#include <perf/event.h> 962306a36Sopenharmony_ci#include <stdio.h> 1062306a36Sopenharmony_ci#include <unistd.h> 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_cistatic int libperf_print(enum libperf_print_level level, 1362306a36Sopenharmony_ci const char *fmt, va_list ap) 1462306a36Sopenharmony_ci{ 1562306a36Sopenharmony_ci return vfprintf(stderr, fmt, ap); 1662306a36Sopenharmony_ci} 1762306a36Sopenharmony_ci 1862306a36Sopenharmony_ciint main(int argc, char **argv) 1962306a36Sopenharmony_ci{ 2062306a36Sopenharmony_ci int count = 100000, err = 0; 2162306a36Sopenharmony_ci struct perf_evlist *evlist; 2262306a36Sopenharmony_ci struct perf_evsel *evsel; 2362306a36Sopenharmony_ci struct perf_thread_map *threads; 2462306a36Sopenharmony_ci struct perf_counts_values counts; 2562306a36Sopenharmony_ci 2662306a36Sopenharmony_ci struct perf_event_attr attr1 = { 2762306a36Sopenharmony_ci .type = PERF_TYPE_SOFTWARE, 2862306a36Sopenharmony_ci .config = PERF_COUNT_SW_CPU_CLOCK, 2962306a36Sopenharmony_ci .read_format = PERF_FORMAT_TOTAL_TIME_ENABLED|PERF_FORMAT_TOTAL_TIME_RUNNING, 3062306a36Sopenharmony_ci .disabled = 1, 3162306a36Sopenharmony_ci }; 3262306a36Sopenharmony_ci struct perf_event_attr attr2 = { 3362306a36Sopenharmony_ci .type = PERF_TYPE_SOFTWARE, 3462306a36Sopenharmony_ci .config = PERF_COUNT_SW_TASK_CLOCK, 3562306a36Sopenharmony_ci .read_format = PERF_FORMAT_TOTAL_TIME_ENABLED|PERF_FORMAT_TOTAL_TIME_RUNNING, 3662306a36Sopenharmony_ci .disabled = 1, 3762306a36Sopenharmony_ci }; 3862306a36Sopenharmony_ci 3962306a36Sopenharmony_ci libperf_init(libperf_print); 4062306a36Sopenharmony_ci threads = perf_thread_map__new_dummy(); 4162306a36Sopenharmony_ci if (!threads) { 4262306a36Sopenharmony_ci fprintf(stderr, "failed to create threads\n"); 4362306a36Sopenharmony_ci return -1; 4462306a36Sopenharmony_ci } 4562306a36Sopenharmony_ci perf_thread_map__set_pid(threads, 0, 0); 4662306a36Sopenharmony_ci evlist = perf_evlist__new(); 4762306a36Sopenharmony_ci if (!evlist) { 4862306a36Sopenharmony_ci fprintf(stderr, "failed to create evlist\n"); 4962306a36Sopenharmony_ci goto out_threads; 5062306a36Sopenharmony_ci } 5162306a36Sopenharmony_ci evsel = perf_evsel__new(&attr1); 5262306a36Sopenharmony_ci if (!evsel) { 5362306a36Sopenharmony_ci fprintf(stderr, "failed to create evsel1\n"); 5462306a36Sopenharmony_ci goto out_evlist; 5562306a36Sopenharmony_ci } 5662306a36Sopenharmony_ci perf_evlist__add(evlist, evsel); 5762306a36Sopenharmony_ci evsel = perf_evsel__new(&attr2); 5862306a36Sopenharmony_ci if (!evsel) { 5962306a36Sopenharmony_ci fprintf(stderr, "failed to create evsel2\n"); 6062306a36Sopenharmony_ci goto out_evlist; 6162306a36Sopenharmony_ci } 6262306a36Sopenharmony_ci perf_evlist__add(evlist, evsel); 6362306a36Sopenharmony_ci perf_evlist__set_maps(evlist, NULL, threads); 6462306a36Sopenharmony_ci err = perf_evlist__open(evlist); 6562306a36Sopenharmony_ci if (err) { 6662306a36Sopenharmony_ci fprintf(stderr, "failed to open evsel\n"); 6762306a36Sopenharmony_ci goto out_evlist; 6862306a36Sopenharmony_ci } 6962306a36Sopenharmony_ci perf_evlist__enable(evlist); 7062306a36Sopenharmony_ci while (count--); 7162306a36Sopenharmony_ci perf_evlist__disable(evlist); 7262306a36Sopenharmony_ci perf_evlist__for_each_evsel(evlist, evsel) { 7362306a36Sopenharmony_ci perf_evsel__read(evsel, 0, 0, &counts); 7462306a36Sopenharmony_ci fprintf(stdout, "count %llu, enabled %llu, run %llu\n", 7562306a36Sopenharmony_ci counts.val, counts.ena, counts.run); 7662306a36Sopenharmony_ci } 7762306a36Sopenharmony_ci perf_evlist__close(evlist); 7862306a36Sopenharmony_ciout_evlist: 7962306a36Sopenharmony_ci perf_evlist__delete(evlist); 8062306a36Sopenharmony_ciout_threads: 8162306a36Sopenharmony_ci perf_thread_map__put(threads); 8262306a36Sopenharmony_ci return err; 8362306a36Sopenharmony_ci} 84