1*4882a593Smuzhiyunlibperf(3) 2*4882a593Smuzhiyun========== 3*4882a593Smuzhiyun 4*4882a593SmuzhiyunNAME 5*4882a593Smuzhiyun---- 6*4882a593Smuzhiyunlibperf - Linux kernel perf event library 7*4882a593Smuzhiyun 8*4882a593Smuzhiyun 9*4882a593SmuzhiyunSYNOPSIS 10*4882a593Smuzhiyun-------- 11*4882a593Smuzhiyun*Generic API:* 12*4882a593Smuzhiyun 13*4882a593Smuzhiyun[source,c] 14*4882a593Smuzhiyun-- 15*4882a593Smuzhiyun #include <perf/core.h> 16*4882a593Smuzhiyun 17*4882a593Smuzhiyun enum libperf_print_level { 18*4882a593Smuzhiyun LIBPERF_ERR, 19*4882a593Smuzhiyun LIBPERF_WARN, 20*4882a593Smuzhiyun LIBPERF_INFO, 21*4882a593Smuzhiyun LIBPERF_DEBUG, 22*4882a593Smuzhiyun LIBPERF_DEBUG2, 23*4882a593Smuzhiyun LIBPERF_DEBUG3, 24*4882a593Smuzhiyun }; 25*4882a593Smuzhiyun 26*4882a593Smuzhiyun typedef int (*libperf_print_fn_t)(enum libperf_print_level level, 27*4882a593Smuzhiyun const char *, va_list ap); 28*4882a593Smuzhiyun 29*4882a593Smuzhiyun void libperf_init(libperf_print_fn_t fn); 30*4882a593Smuzhiyun-- 31*4882a593Smuzhiyun 32*4882a593Smuzhiyun*API to handle CPU maps:* 33*4882a593Smuzhiyun 34*4882a593Smuzhiyun[source,c] 35*4882a593Smuzhiyun-- 36*4882a593Smuzhiyun #include <perf/cpumap.h> 37*4882a593Smuzhiyun 38*4882a593Smuzhiyun struct perf_cpu_map; 39*4882a593Smuzhiyun 40*4882a593Smuzhiyun struct perf_cpu_map *perf_cpu_map__dummy_new(void); 41*4882a593Smuzhiyun struct perf_cpu_map *perf_cpu_map__new(const char *cpu_list); 42*4882a593Smuzhiyun struct perf_cpu_map *perf_cpu_map__read(FILE *file); 43*4882a593Smuzhiyun struct perf_cpu_map *perf_cpu_map__get(struct perf_cpu_map *map); 44*4882a593Smuzhiyun struct perf_cpu_map *perf_cpu_map__merge(struct perf_cpu_map *orig, 45*4882a593Smuzhiyun struct perf_cpu_map *other); 46*4882a593Smuzhiyun void perf_cpu_map__put(struct perf_cpu_map *map); 47*4882a593Smuzhiyun int perf_cpu_map__cpu(const struct perf_cpu_map *cpus, int idx); 48*4882a593Smuzhiyun int perf_cpu_map__nr(const struct perf_cpu_map *cpus); 49*4882a593Smuzhiyun bool perf_cpu_map__empty(const struct perf_cpu_map *map); 50*4882a593Smuzhiyun int perf_cpu_map__max(struct perf_cpu_map *map); 51*4882a593Smuzhiyun 52*4882a593Smuzhiyun #define perf_cpu_map__for_each_cpu(cpu, idx, cpus) 53*4882a593Smuzhiyun-- 54*4882a593Smuzhiyun 55*4882a593Smuzhiyun*API to handle thread maps:* 56*4882a593Smuzhiyun 57*4882a593Smuzhiyun[source,c] 58*4882a593Smuzhiyun-- 59*4882a593Smuzhiyun #include <perf/threadmap.h> 60*4882a593Smuzhiyun 61*4882a593Smuzhiyun struct perf_thread_map; 62*4882a593Smuzhiyun 63*4882a593Smuzhiyun struct perf_thread_map *perf_thread_map__new_dummy(void); 64*4882a593Smuzhiyun 65*4882a593Smuzhiyun void perf_thread_map__set_pid(struct perf_thread_map *map, int thread, pid_t pid); 66*4882a593Smuzhiyun char *perf_thread_map__comm(struct perf_thread_map *map, int thread); 67*4882a593Smuzhiyun int perf_thread_map__nr(struct perf_thread_map *threads); 68*4882a593Smuzhiyun pid_t perf_thread_map__pid(struct perf_thread_map *map, int thread); 69*4882a593Smuzhiyun 70*4882a593Smuzhiyun struct perf_thread_map *perf_thread_map__get(struct perf_thread_map *map); 71*4882a593Smuzhiyun void perf_thread_map__put(struct perf_thread_map *map); 72*4882a593Smuzhiyun-- 73*4882a593Smuzhiyun 74*4882a593Smuzhiyun*API to handle event lists:* 75*4882a593Smuzhiyun 76*4882a593Smuzhiyun[source,c] 77*4882a593Smuzhiyun-- 78*4882a593Smuzhiyun #include <perf/evlist.h> 79*4882a593Smuzhiyun 80*4882a593Smuzhiyun struct perf_evlist; 81*4882a593Smuzhiyun 82*4882a593Smuzhiyun void perf_evlist__add(struct perf_evlist *evlist, 83*4882a593Smuzhiyun struct perf_evsel *evsel); 84*4882a593Smuzhiyun void perf_evlist__remove(struct perf_evlist *evlist, 85*4882a593Smuzhiyun struct perf_evsel *evsel); 86*4882a593Smuzhiyun struct perf_evlist *perf_evlist__new(void); 87*4882a593Smuzhiyun void perf_evlist__delete(struct perf_evlist *evlist); 88*4882a593Smuzhiyun struct perf_evsel* perf_evlist__next(struct perf_evlist *evlist, 89*4882a593Smuzhiyun struct perf_evsel *evsel); 90*4882a593Smuzhiyun int perf_evlist__open(struct perf_evlist *evlist); 91*4882a593Smuzhiyun void perf_evlist__close(struct perf_evlist *evlist); 92*4882a593Smuzhiyun void perf_evlist__enable(struct perf_evlist *evlist); 93*4882a593Smuzhiyun void perf_evlist__disable(struct perf_evlist *evlist); 94*4882a593Smuzhiyun 95*4882a593Smuzhiyun #define perf_evlist__for_each_evsel(evlist, pos) 96*4882a593Smuzhiyun 97*4882a593Smuzhiyun void perf_evlist__set_maps(struct perf_evlist *evlist, 98*4882a593Smuzhiyun struct perf_cpu_map *cpus, 99*4882a593Smuzhiyun struct perf_thread_map *threads); 100*4882a593Smuzhiyun int perf_evlist__poll(struct perf_evlist *evlist, int timeout); 101*4882a593Smuzhiyun int perf_evlist__filter_pollfd(struct perf_evlist *evlist, 102*4882a593Smuzhiyun short revents_and_mask); 103*4882a593Smuzhiyun 104*4882a593Smuzhiyun int perf_evlist__mmap(struct perf_evlist *evlist, int pages); 105*4882a593Smuzhiyun void perf_evlist__munmap(struct perf_evlist *evlist); 106*4882a593Smuzhiyun 107*4882a593Smuzhiyun struct perf_mmap *perf_evlist__next_mmap(struct perf_evlist *evlist, 108*4882a593Smuzhiyun struct perf_mmap *map, 109*4882a593Smuzhiyun bool overwrite); 110*4882a593Smuzhiyun 111*4882a593Smuzhiyun #define perf_evlist__for_each_mmap(evlist, pos, overwrite) 112*4882a593Smuzhiyun-- 113*4882a593Smuzhiyun 114*4882a593Smuzhiyun*API to handle events:* 115*4882a593Smuzhiyun 116*4882a593Smuzhiyun[source,c] 117*4882a593Smuzhiyun-- 118*4882a593Smuzhiyun #include <perf/evsel.h>* 119*4882a593Smuzhiyun 120*4882a593Smuzhiyun struct perf_evsel; 121*4882a593Smuzhiyun 122*4882a593Smuzhiyun struct perf_counts_values { 123*4882a593Smuzhiyun union { 124*4882a593Smuzhiyun struct { 125*4882a593Smuzhiyun uint64_t val; 126*4882a593Smuzhiyun uint64_t ena; 127*4882a593Smuzhiyun uint64_t run; 128*4882a593Smuzhiyun }; 129*4882a593Smuzhiyun uint64_t values[3]; 130*4882a593Smuzhiyun }; 131*4882a593Smuzhiyun }; 132*4882a593Smuzhiyun 133*4882a593Smuzhiyun struct perf_evsel *perf_evsel__new(struct perf_event_attr *attr); 134*4882a593Smuzhiyun void perf_evsel__delete(struct perf_evsel *evsel); 135*4882a593Smuzhiyun int perf_evsel__open(struct perf_evsel *evsel, struct perf_cpu_map *cpus, 136*4882a593Smuzhiyun struct perf_thread_map *threads); 137*4882a593Smuzhiyun void perf_evsel__close(struct perf_evsel *evsel); 138*4882a593Smuzhiyun void perf_evsel__close_cpu(struct perf_evsel *evsel, int cpu); 139*4882a593Smuzhiyun int perf_evsel__read(struct perf_evsel *evsel, int cpu, int thread, 140*4882a593Smuzhiyun struct perf_counts_values *count); 141*4882a593Smuzhiyun int perf_evsel__enable(struct perf_evsel *evsel); 142*4882a593Smuzhiyun int perf_evsel__enable_cpu(struct perf_evsel *evsel, int cpu); 143*4882a593Smuzhiyun int perf_evsel__disable(struct perf_evsel *evsel); 144*4882a593Smuzhiyun int perf_evsel__disable_cpu(struct perf_evsel *evsel, int cpu); 145*4882a593Smuzhiyun struct perf_cpu_map *perf_evsel__cpus(struct perf_evsel *evsel); 146*4882a593Smuzhiyun struct perf_thread_map *perf_evsel__threads(struct perf_evsel *evsel); 147*4882a593Smuzhiyun struct perf_event_attr *perf_evsel__attr(struct perf_evsel *evsel); 148*4882a593Smuzhiyun-- 149*4882a593Smuzhiyun 150*4882a593Smuzhiyun*API to handle maps (perf ring buffers):* 151*4882a593Smuzhiyun 152*4882a593Smuzhiyun[source,c] 153*4882a593Smuzhiyun-- 154*4882a593Smuzhiyun #include <perf/mmap.h> 155*4882a593Smuzhiyun 156*4882a593Smuzhiyun struct perf_mmap; 157*4882a593Smuzhiyun 158*4882a593Smuzhiyun void perf_mmap__consume(struct perf_mmap *map); 159*4882a593Smuzhiyun int perf_mmap__read_init(struct perf_mmap *map); 160*4882a593Smuzhiyun void perf_mmap__read_done(struct perf_mmap *map); 161*4882a593Smuzhiyun union perf_event *perf_mmap__read_event(struct perf_mmap *map); 162*4882a593Smuzhiyun-- 163*4882a593Smuzhiyun 164*4882a593Smuzhiyun*Structures to access perf API events:* 165*4882a593Smuzhiyun 166*4882a593Smuzhiyun[source,c] 167*4882a593Smuzhiyun-- 168*4882a593Smuzhiyun #include <perf/event.h> 169*4882a593Smuzhiyun 170*4882a593Smuzhiyun struct perf_record_mmap; 171*4882a593Smuzhiyun struct perf_record_mmap2; 172*4882a593Smuzhiyun struct perf_record_comm; 173*4882a593Smuzhiyun struct perf_record_namespaces; 174*4882a593Smuzhiyun struct perf_record_fork; 175*4882a593Smuzhiyun struct perf_record_lost; 176*4882a593Smuzhiyun struct perf_record_lost_samples; 177*4882a593Smuzhiyun struct perf_record_read; 178*4882a593Smuzhiyun struct perf_record_throttle; 179*4882a593Smuzhiyun struct perf_record_ksymbol; 180*4882a593Smuzhiyun struct perf_record_bpf_event; 181*4882a593Smuzhiyun struct perf_record_sample; 182*4882a593Smuzhiyun struct perf_record_switch; 183*4882a593Smuzhiyun struct perf_record_header_attr; 184*4882a593Smuzhiyun struct perf_record_record_cpu_map; 185*4882a593Smuzhiyun struct perf_record_cpu_map_data; 186*4882a593Smuzhiyun struct perf_record_cpu_map; 187*4882a593Smuzhiyun struct perf_record_event_update_cpus; 188*4882a593Smuzhiyun struct perf_record_event_update_scale; 189*4882a593Smuzhiyun struct perf_record_event_update; 190*4882a593Smuzhiyun struct perf_trace_event_type; 191*4882a593Smuzhiyun struct perf_record_header_event_type; 192*4882a593Smuzhiyun struct perf_record_header_tracing_data; 193*4882a593Smuzhiyun struct perf_record_header_build_id; 194*4882a593Smuzhiyun struct perf_record_id_index; 195*4882a593Smuzhiyun struct perf_record_auxtrace_info; 196*4882a593Smuzhiyun struct perf_record_auxtrace; 197*4882a593Smuzhiyun struct perf_record_auxtrace_error; 198*4882a593Smuzhiyun struct perf_record_aux; 199*4882a593Smuzhiyun struct perf_record_itrace_start; 200*4882a593Smuzhiyun struct perf_record_thread_map_entry; 201*4882a593Smuzhiyun struct perf_record_thread_map; 202*4882a593Smuzhiyun struct perf_record_stat_config_entry; 203*4882a593Smuzhiyun struct perf_record_stat_config; 204*4882a593Smuzhiyun struct perf_record_stat; 205*4882a593Smuzhiyun struct perf_record_stat_round; 206*4882a593Smuzhiyun struct perf_record_time_conv; 207*4882a593Smuzhiyun struct perf_record_header_feature; 208*4882a593Smuzhiyun struct perf_record_compressed; 209*4882a593Smuzhiyun-- 210*4882a593Smuzhiyun 211*4882a593SmuzhiyunDESCRIPTION 212*4882a593Smuzhiyun----------- 213*4882a593SmuzhiyunThe libperf library provides an API to access the linux kernel perf 214*4882a593Smuzhiyunevents subsystem. 215*4882a593Smuzhiyun 216*4882a593SmuzhiyunFollowing objects are key to the libperf interface: 217*4882a593Smuzhiyun 218*4882a593Smuzhiyun[horizontal] 219*4882a593Smuzhiyun 220*4882a593Smuzhiyunstruct perf_cpu_map:: Provides a CPU list abstraction. 221*4882a593Smuzhiyun 222*4882a593Smuzhiyunstruct perf_thread_map:: Provides a thread list abstraction. 223*4882a593Smuzhiyun 224*4882a593Smuzhiyunstruct perf_evsel:: Provides an abstraction for single a perf event. 225*4882a593Smuzhiyun 226*4882a593Smuzhiyunstruct perf_evlist:: Gathers several struct perf_evsel object and performs functions on all of them. 227*4882a593Smuzhiyun 228*4882a593Smuzhiyunstruct perf_mmap:: Provides an abstraction for accessing perf ring buffer. 229*4882a593Smuzhiyun 230*4882a593SmuzhiyunThe exported API functions bind these objects together. 231*4882a593Smuzhiyun 232*4882a593SmuzhiyunREPORTING BUGS 233*4882a593Smuzhiyun-------------- 234*4882a593SmuzhiyunReport bugs to <linux-perf-users@vger.kernel.org>. 235*4882a593Smuzhiyun 236*4882a593SmuzhiyunLICENSE 237*4882a593Smuzhiyun------- 238*4882a593Smuzhiyunlibperf is Free Software licensed under the GNU LGPL 2.1 239*4882a593Smuzhiyun 240*4882a593SmuzhiyunRESOURCES 241*4882a593Smuzhiyun--------- 242*4882a593Smuzhiyunhttps://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git 243*4882a593Smuzhiyun 244*4882a593SmuzhiyunSEE ALSO 245*4882a593Smuzhiyun-------- 246*4882a593Smuzhiyunlibperf-sampling(7), libperf-counting(7) 247