169aad6f1SArnaldo Carvalho de Melo #ifndef __PERF_EVSEL_H 269aad6f1SArnaldo Carvalho de Melo #define __PERF_EVSEL_H 1 369aad6f1SArnaldo Carvalho de Melo 469aad6f1SArnaldo Carvalho de Melo #include <linux/list.h> 5c52b12edSArnaldo Carvalho de Melo #include <stdbool.h> 6d030260aSStephane Eranian #include "../../../include/linux/perf_event.h" 769aad6f1SArnaldo Carvalho de Melo #include "types.h" 869aad6f1SArnaldo Carvalho de Melo #include "xyarray.h" 969aad6f1SArnaldo Carvalho de Melo 10c52b12edSArnaldo Carvalho de Melo struct perf_counts_values { 11c52b12edSArnaldo Carvalho de Melo union { 12c52b12edSArnaldo Carvalho de Melo struct { 13c52b12edSArnaldo Carvalho de Melo u64 val; 14c52b12edSArnaldo Carvalho de Melo u64 ena; 15c52b12edSArnaldo Carvalho de Melo u64 run; 16c52b12edSArnaldo Carvalho de Melo }; 17c52b12edSArnaldo Carvalho de Melo u64 values[3]; 18c52b12edSArnaldo Carvalho de Melo }; 19c52b12edSArnaldo Carvalho de Melo }; 20c52b12edSArnaldo Carvalho de Melo 21c52b12edSArnaldo Carvalho de Melo struct perf_counts { 22c52b12edSArnaldo Carvalho de Melo s8 scaled; 23c52b12edSArnaldo Carvalho de Melo struct perf_counts_values aggr; 24c52b12edSArnaldo Carvalho de Melo struct perf_counts_values cpu[]; 25c52b12edSArnaldo Carvalho de Melo }; 26c52b12edSArnaldo Carvalho de Melo 27*70db7533SArnaldo Carvalho de Melo struct perf_evsel; 28*70db7533SArnaldo Carvalho de Melo 29*70db7533SArnaldo Carvalho de Melo /* 30*70db7533SArnaldo Carvalho de Melo * Per fd, to map back from PERF_SAMPLE_ID to evsel, only used when there are 31*70db7533SArnaldo Carvalho de Melo * more than one entry in the evlist. 32*70db7533SArnaldo Carvalho de Melo */ 33*70db7533SArnaldo Carvalho de Melo struct perf_sample_id { 34*70db7533SArnaldo Carvalho de Melo struct hlist_node node; 35*70db7533SArnaldo Carvalho de Melo u64 id; 36*70db7533SArnaldo Carvalho de Melo struct perf_evsel *evsel; 37*70db7533SArnaldo Carvalho de Melo }; 38*70db7533SArnaldo Carvalho de Melo 3969aad6f1SArnaldo Carvalho de Melo struct perf_evsel { 4069aad6f1SArnaldo Carvalho de Melo struct list_head node; 4169aad6f1SArnaldo Carvalho de Melo struct perf_event_attr attr; 4269aad6f1SArnaldo Carvalho de Melo char *filter; 4369aad6f1SArnaldo Carvalho de Melo struct xyarray *fd; 44*70db7533SArnaldo Carvalho de Melo struct xyarray *id; 45c52b12edSArnaldo Carvalho de Melo struct perf_counts *counts; 4669aad6f1SArnaldo Carvalho de Melo int idx; 4769aad6f1SArnaldo Carvalho de Melo void *priv; 4869aad6f1SArnaldo Carvalho de Melo }; 4969aad6f1SArnaldo Carvalho de Melo 5086bd5e86SArnaldo Carvalho de Melo struct cpu_map; 5186bd5e86SArnaldo Carvalho de Melo struct thread_map; 5270082dd9SArnaldo Carvalho de Melo struct perf_evlist; 5386bd5e86SArnaldo Carvalho de Melo 5423a2f3abSLin Ming struct perf_evsel *perf_evsel__new(struct perf_event_attr *attr, int idx); 5569aad6f1SArnaldo Carvalho de Melo void perf_evsel__delete(struct perf_evsel *evsel); 5669aad6f1SArnaldo Carvalho de Melo 5769aad6f1SArnaldo Carvalho de Melo int perf_evsel__alloc_fd(struct perf_evsel *evsel, int ncpus, int nthreads); 58*70db7533SArnaldo Carvalho de Melo int perf_evsel__alloc_id(struct perf_evsel *evsel, int ncpus, int nthreads); 59c52b12edSArnaldo Carvalho de Melo int perf_evsel__alloc_counts(struct perf_evsel *evsel, int ncpus); 60*70db7533SArnaldo Carvalho de Melo int perf_evlist__alloc_mmap(struct perf_evlist *evlist, int ncpus); 6169aad6f1SArnaldo Carvalho de Melo void perf_evsel__free_fd(struct perf_evsel *evsel); 62*70db7533SArnaldo Carvalho de Melo void perf_evsel__free_id(struct perf_evsel *evsel); 63c52b12edSArnaldo Carvalho de Melo void perf_evsel__close_fd(struct perf_evsel *evsel, int ncpus, int nthreads); 6469aad6f1SArnaldo Carvalho de Melo 65f08199d3SArnaldo Carvalho de Melo int perf_evsel__open_per_cpu(struct perf_evsel *evsel, 669d04f178SArnaldo Carvalho de Melo struct cpu_map *cpus, bool group, bool inherit); 67f08199d3SArnaldo Carvalho de Melo int perf_evsel__open_per_thread(struct perf_evsel *evsel, 689d04f178SArnaldo Carvalho de Melo struct thread_map *threads, bool group, bool inherit); 69f08199d3SArnaldo Carvalho de Melo int perf_evsel__open(struct perf_evsel *evsel, struct cpu_map *cpus, 709d04f178SArnaldo Carvalho de Melo struct thread_map *threads, bool group, bool inherit); 71*70db7533SArnaldo Carvalho de Melo int perf_evlist__mmap(struct perf_evlist *evlist, struct cpu_map *cpus, 72*70db7533SArnaldo Carvalho de Melo struct thread_map *threads, int pages, bool overwrite); 73*70db7533SArnaldo Carvalho de Melo void perf_evlist__munmap(struct perf_evlist *evlist, int ncpus); 7448290609SArnaldo Carvalho de Melo 75daec78a0SArnaldo Carvalho de Melo #define perf_evsel__match(evsel, t, c) \ 76daec78a0SArnaldo Carvalho de Melo (evsel->attr.type == PERF_TYPE_##t && \ 77daec78a0SArnaldo Carvalho de Melo evsel->attr.config == PERF_COUNT_##c) 78daec78a0SArnaldo Carvalho de Melo 79c52b12edSArnaldo Carvalho de Melo int __perf_evsel__read_on_cpu(struct perf_evsel *evsel, 80c52b12edSArnaldo Carvalho de Melo int cpu, int thread, bool scale); 81c52b12edSArnaldo Carvalho de Melo 82c52b12edSArnaldo Carvalho de Melo /** 83c52b12edSArnaldo Carvalho de Melo * perf_evsel__read_on_cpu - Read out the results on a CPU and thread 84c52b12edSArnaldo Carvalho de Melo * 85c52b12edSArnaldo Carvalho de Melo * @evsel - event selector to read value 86c52b12edSArnaldo Carvalho de Melo * @cpu - CPU of interest 87c52b12edSArnaldo Carvalho de Melo * @thread - thread of interest 88c52b12edSArnaldo Carvalho de Melo */ 89c52b12edSArnaldo Carvalho de Melo static inline int perf_evsel__read_on_cpu(struct perf_evsel *evsel, 90c52b12edSArnaldo Carvalho de Melo int cpu, int thread) 91c52b12edSArnaldo Carvalho de Melo { 92c52b12edSArnaldo Carvalho de Melo return __perf_evsel__read_on_cpu(evsel, cpu, thread, false); 93c52b12edSArnaldo Carvalho de Melo } 94c52b12edSArnaldo Carvalho de Melo 95c52b12edSArnaldo Carvalho de Melo /** 96c52b12edSArnaldo Carvalho de Melo * perf_evsel__read_on_cpu_scaled - Read out the results on a CPU and thread, scaled 97c52b12edSArnaldo Carvalho de Melo * 98c52b12edSArnaldo Carvalho de Melo * @evsel - event selector to read value 99c52b12edSArnaldo Carvalho de Melo * @cpu - CPU of interest 100c52b12edSArnaldo Carvalho de Melo * @thread - thread of interest 101c52b12edSArnaldo Carvalho de Melo */ 102c52b12edSArnaldo Carvalho de Melo static inline int perf_evsel__read_on_cpu_scaled(struct perf_evsel *evsel, 103c52b12edSArnaldo Carvalho de Melo int cpu, int thread) 104c52b12edSArnaldo Carvalho de Melo { 105c52b12edSArnaldo Carvalho de Melo return __perf_evsel__read_on_cpu(evsel, cpu, thread, true); 106c52b12edSArnaldo Carvalho de Melo } 107c52b12edSArnaldo Carvalho de Melo 108c52b12edSArnaldo Carvalho de Melo int __perf_evsel__read(struct perf_evsel *evsel, int ncpus, int nthreads, 109c52b12edSArnaldo Carvalho de Melo bool scale); 110c52b12edSArnaldo Carvalho de Melo 111c52b12edSArnaldo Carvalho de Melo /** 112c52b12edSArnaldo Carvalho de Melo * perf_evsel__read - Read the aggregate results on all CPUs 113c52b12edSArnaldo Carvalho de Melo * 114c52b12edSArnaldo Carvalho de Melo * @evsel - event selector to read value 115c52b12edSArnaldo Carvalho de Melo * @ncpus - Number of cpus affected, from zero 116c52b12edSArnaldo Carvalho de Melo * @nthreads - Number of threads affected, from zero 117c52b12edSArnaldo Carvalho de Melo */ 118c52b12edSArnaldo Carvalho de Melo static inline int perf_evsel__read(struct perf_evsel *evsel, 119c52b12edSArnaldo Carvalho de Melo int ncpus, int nthreads) 120c52b12edSArnaldo Carvalho de Melo { 121c52b12edSArnaldo Carvalho de Melo return __perf_evsel__read(evsel, ncpus, nthreads, false); 122c52b12edSArnaldo Carvalho de Melo } 123c52b12edSArnaldo Carvalho de Melo 124c52b12edSArnaldo Carvalho de Melo /** 125c52b12edSArnaldo Carvalho de Melo * perf_evsel__read_scaled - Read the aggregate results on all CPUs, scaled 126c52b12edSArnaldo Carvalho de Melo * 127c52b12edSArnaldo Carvalho de Melo * @evsel - event selector to read value 128c52b12edSArnaldo Carvalho de Melo * @ncpus - Number of cpus affected, from zero 129c52b12edSArnaldo Carvalho de Melo * @nthreads - Number of threads affected, from zero 130c52b12edSArnaldo Carvalho de Melo */ 131c52b12edSArnaldo Carvalho de Melo static inline int perf_evsel__read_scaled(struct perf_evsel *evsel, 132c52b12edSArnaldo Carvalho de Melo int ncpus, int nthreads) 133c52b12edSArnaldo Carvalho de Melo { 134c52b12edSArnaldo Carvalho de Melo return __perf_evsel__read(evsel, ncpus, nthreads, true); 135c52b12edSArnaldo Carvalho de Melo } 136c52b12edSArnaldo Carvalho de Melo 13769aad6f1SArnaldo Carvalho de Melo #endif /* __PERF_EVSEL_H */ 138