18c2ecf20Sopenharmony_ci#include <linux/perf_event.h> 28c2ecf20Sopenharmony_ci#include <perf/evlist.h> 38c2ecf20Sopenharmony_ci#include <perf/evsel.h> 48c2ecf20Sopenharmony_ci#include <perf/cpumap.h> 58c2ecf20Sopenharmony_ci#include <perf/threadmap.h> 68c2ecf20Sopenharmony_ci#include <perf/mmap.h> 78c2ecf20Sopenharmony_ci#include <perf/core.h> 88c2ecf20Sopenharmony_ci#include <perf/event.h> 98c2ecf20Sopenharmony_ci#include <stdio.h> 108c2ecf20Sopenharmony_ci#include <unistd.h> 118c2ecf20Sopenharmony_ci 128c2ecf20Sopenharmony_cistatic int libperf_print(enum libperf_print_level level, 138c2ecf20Sopenharmony_ci const char *fmt, va_list ap) 148c2ecf20Sopenharmony_ci{ 158c2ecf20Sopenharmony_ci return vfprintf(stderr, fmt, ap); 168c2ecf20Sopenharmony_ci} 178c2ecf20Sopenharmony_ci 188c2ecf20Sopenharmony_ciint main(int argc, char **argv) 198c2ecf20Sopenharmony_ci{ 208c2ecf20Sopenharmony_ci int count = 100000, err = 0; 218c2ecf20Sopenharmony_ci struct perf_evlist *evlist; 228c2ecf20Sopenharmony_ci struct perf_evsel *evsel; 238c2ecf20Sopenharmony_ci struct perf_thread_map *threads; 248c2ecf20Sopenharmony_ci struct perf_counts_values counts; 258c2ecf20Sopenharmony_ci 268c2ecf20Sopenharmony_ci struct perf_event_attr attr1 = { 278c2ecf20Sopenharmony_ci .type = PERF_TYPE_SOFTWARE, 288c2ecf20Sopenharmony_ci .config = PERF_COUNT_SW_CPU_CLOCK, 298c2ecf20Sopenharmony_ci .read_format = PERF_FORMAT_TOTAL_TIME_ENABLED|PERF_FORMAT_TOTAL_TIME_RUNNING, 308c2ecf20Sopenharmony_ci .disabled = 1, 318c2ecf20Sopenharmony_ci }; 328c2ecf20Sopenharmony_ci struct perf_event_attr attr2 = { 338c2ecf20Sopenharmony_ci .type = PERF_TYPE_SOFTWARE, 348c2ecf20Sopenharmony_ci .config = PERF_COUNT_SW_TASK_CLOCK, 358c2ecf20Sopenharmony_ci .read_format = PERF_FORMAT_TOTAL_TIME_ENABLED|PERF_FORMAT_TOTAL_TIME_RUNNING, 368c2ecf20Sopenharmony_ci .disabled = 1, 378c2ecf20Sopenharmony_ci }; 388c2ecf20Sopenharmony_ci 398c2ecf20Sopenharmony_ci libperf_init(libperf_print); 408c2ecf20Sopenharmony_ci threads = perf_thread_map__new_dummy(); 418c2ecf20Sopenharmony_ci if (!threads) { 428c2ecf20Sopenharmony_ci fprintf(stderr, "failed to create threads\n"); 438c2ecf20Sopenharmony_ci return -1; 448c2ecf20Sopenharmony_ci } 458c2ecf20Sopenharmony_ci perf_thread_map__set_pid(threads, 0, 0); 468c2ecf20Sopenharmony_ci evlist = perf_evlist__new(); 478c2ecf20Sopenharmony_ci if (!evlist) { 488c2ecf20Sopenharmony_ci fprintf(stderr, "failed to create evlist\n"); 498c2ecf20Sopenharmony_ci goto out_threads; 508c2ecf20Sopenharmony_ci } 518c2ecf20Sopenharmony_ci evsel = perf_evsel__new(&attr1); 528c2ecf20Sopenharmony_ci if (!evsel) { 538c2ecf20Sopenharmony_ci fprintf(stderr, "failed to create evsel1\n"); 548c2ecf20Sopenharmony_ci goto out_evlist; 558c2ecf20Sopenharmony_ci } 568c2ecf20Sopenharmony_ci perf_evlist__add(evlist, evsel); 578c2ecf20Sopenharmony_ci evsel = perf_evsel__new(&attr2); 588c2ecf20Sopenharmony_ci if (!evsel) { 598c2ecf20Sopenharmony_ci fprintf(stderr, "failed to create evsel2\n"); 608c2ecf20Sopenharmony_ci goto out_evlist; 618c2ecf20Sopenharmony_ci } 628c2ecf20Sopenharmony_ci perf_evlist__add(evlist, evsel); 638c2ecf20Sopenharmony_ci perf_evlist__set_maps(evlist, NULL, threads); 648c2ecf20Sopenharmony_ci err = perf_evlist__open(evlist); 658c2ecf20Sopenharmony_ci if (err) { 668c2ecf20Sopenharmony_ci fprintf(stderr, "failed to open evsel\n"); 678c2ecf20Sopenharmony_ci goto out_evlist; 688c2ecf20Sopenharmony_ci } 698c2ecf20Sopenharmony_ci perf_evlist__enable(evlist); 708c2ecf20Sopenharmony_ci while (count--); 718c2ecf20Sopenharmony_ci perf_evlist__disable(evlist); 728c2ecf20Sopenharmony_ci perf_evlist__for_each_evsel(evlist, evsel) { 738c2ecf20Sopenharmony_ci perf_evsel__read(evsel, 0, 0, &counts); 748c2ecf20Sopenharmony_ci fprintf(stdout, "count %llu, enabled %llu, run %llu\n", 758c2ecf20Sopenharmony_ci counts.val, counts.ena, counts.run); 768c2ecf20Sopenharmony_ci } 778c2ecf20Sopenharmony_ci perf_evlist__close(evlist); 788c2ecf20Sopenharmony_ciout_evlist: 798c2ecf20Sopenharmony_ci perf_evlist__delete(evlist); 808c2ecf20Sopenharmony_ciout_threads: 818c2ecf20Sopenharmony_ci perf_thread_map__put(threads); 828c2ecf20Sopenharmony_ci return err; 838c2ecf20Sopenharmony_ci} 84