~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/tools/perf/util/pmu.h

Version: ~ [ linux-6.11.5 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.58 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.114 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.169 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.228 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.284 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.322 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.9 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 /* SPDX-License-Identifier: GPL-2.0 */
  2 #ifndef __PMU_H
  3 #define __PMU_H
  4 
  5 #include <linux/bitmap.h>
  6 #include <linux/compiler.h>
  7 #include <linux/perf_event.h>
  8 #include <linux/list.h>
  9 #include <stdbool.h>
 10 #include <stdio.h>
 11 #include "parse-events.h"
 12 #include "pmu-events/pmu-events.h"
 13 #include "map_symbol.h"
 14 #include "mem-events.h"
 15 
 16 struct evsel_config_term;
 17 struct perf_cpu_map;
 18 struct print_callbacks;
 19 
 20 enum {
 21         PERF_PMU_FORMAT_VALUE_CONFIG,
 22         PERF_PMU_FORMAT_VALUE_CONFIG1,
 23         PERF_PMU_FORMAT_VALUE_CONFIG2,
 24         PERF_PMU_FORMAT_VALUE_CONFIG3,
 25         PERF_PMU_FORMAT_VALUE_CONFIG_END,
 26 };
 27 
 28 #define PERF_PMU_FORMAT_BITS 64
 29 #define MAX_PMU_NAME_LEN 128
 30 
 31 struct perf_event_attr;
 32 
 33 struct perf_pmu_caps {
 34         char *name;
 35         char *value;
 36         struct list_head list;
 37 };
 38 
 39 /**
 40  * struct perf_pmu
 41  */
 42 struct perf_pmu {
 43         /** @name: The name of the PMU such as "cpu". */
 44         const char *name;
 45         /**
 46          * @alias_name: Optional alternate name for the PMU determined in
 47          * architecture specific code.
 48          */
 49         char *alias_name;
 50         /**
 51          * @id: Optional PMU identifier read from
 52          * <sysfs>/bus/event_source/devices/<name>/identifier.
 53          */
 54         const char *id;
 55         /**
 56          * @type: Perf event attributed type value, read from
 57          * <sysfs>/bus/event_source/devices/<name>/type.
 58          */
 59         __u32 type;
 60         /**
 61          * @selectable: Can the PMU name be selected as if it were an event?
 62          */
 63         bool selectable;
 64         /**
 65          * @is_core: Is the PMU the core CPU PMU? Determined by the name being
 66          * "cpu" or by the presence of
 67          * <sysfs>/bus/event_source/devices/<name>/cpus. There may be >1 core
 68          * PMU on systems like Intel hybrid.
 69          */
 70         bool is_core;
 71         /**
 72          * @is_uncore: Is the PMU not within the CPU core? Determined by the
 73          * presence of <sysfs>/bus/event_source/devices/<name>/cpumask.
 74          */
 75         bool is_uncore;
 76         /**
 77          * @auxtrace: Are events auxiliary events? Determined in architecture
 78          * specific code.
 79          */
 80         bool auxtrace;
 81         /**
 82          * @formats_checked: Only check PMU's formats are valid for
 83          * perf_event_attr once.
 84          */
 85         bool formats_checked;
 86         /** @config_masks_present: Are there config format values? */
 87         bool config_masks_present;
 88         /** @config_masks_computed: Set when masks are lazily computed. */
 89         bool config_masks_computed;
 90         /**
 91          * @max_precise: Number of levels of :ppp precision supported by the
 92          * PMU, read from
 93          * <sysfs>/bus/event_source/devices/<name>/caps/max_precise.
 94          */
 95         int max_precise;
 96         /**
 97          * @perf_event_attr_init_default: Optional function to default
 98          * initialize PMU specific parts of the perf_event_attr.
 99          */
100         void (*perf_event_attr_init_default)(const struct perf_pmu *pmu,
101                                              struct perf_event_attr *attr);
102         /**
103          * @cpus: Empty or the contents of either of:
104          * <sysfs>/bus/event_source/devices/<name>/cpumask.
105          * <sysfs>/bus/event_source/devices/<cpu>/cpus.
106          */
107         struct perf_cpu_map *cpus;
108         /**
109          * @format: Holds the contents of files read from
110          * <sysfs>/bus/event_source/devices/<name>/format/. The contents specify
111          * which event parameter changes what config, config1 or config2 bits.
112          */
113         struct list_head format;
114         /**
115          * @aliases: List of struct perf_pmu_alias. Each alias corresponds to an
116          * event read from <sysfs>/bus/event_source/devices/<name>/events/ or
117          * from json events in pmu-events.c.
118          */
119         struct list_head aliases;
120         /**
121          * @events_table: The events table for json events in pmu-events.c.
122          */
123         const struct pmu_events_table *events_table;
124         /** @sysfs_aliases: Number of sysfs aliases loaded. */
125         uint32_t sysfs_aliases;
126         /** @cpu_json_aliases: Number of json event aliases loaded specific to the CPUID. */
127         uint32_t cpu_json_aliases;
128         /** @sys_json_aliases: Number of json event aliases loaded matching the PMU's identifier. */
129         uint32_t sys_json_aliases;
130         /** @sysfs_aliases_loaded: Are sysfs aliases loaded from disk? */
131         bool sysfs_aliases_loaded;
132         /**
133          * @cpu_aliases_added: Have all json events table entries for the PMU
134          * been added?
135          */
136         bool cpu_aliases_added;
137         /** @caps_initialized: Has the list caps been initialized? */
138         bool caps_initialized;
139         /** @nr_caps: The length of the list caps. */
140         u32 nr_caps;
141         /**
142          * @caps: Holds the contents of files read from
143          * <sysfs>/bus/event_source/devices/<name>/caps/.
144          *
145          * The contents are pairs of the filename with the value of its
146          * contents, for example, max_precise (see above) may have a value of 3.
147          */
148         struct list_head caps;
149         /** @list: Element on pmus list in pmu.c. */
150         struct list_head list;
151 
152         /**
153          * @config_masks: Derived from the PMU's format data, bits that are
154          * valid within the config value.
155          */
156         __u64 config_masks[PERF_PMU_FORMAT_VALUE_CONFIG_END];
157 
158         /**
159          * @missing_features: Features to inhibit when events on this PMU are
160          * opened.
161          */
162         struct {
163                 /**
164                  * @exclude_guest: Disables perf_event_attr exclude_guest and
165                  * exclude_host.
166                  */
167                 bool exclude_guest;
168         } missing_features;
169 
170         /**
171          * @mem_events: List of the supported mem events
172          */
173         struct perf_mem_event *mem_events;
174 };
175 
176 /** @perf_pmu__fake: A special global PMU used for testing. */
177 extern struct perf_pmu perf_pmu__fake;
178 
179 struct perf_pmu_info {
180         const char *unit;
181         double scale;
182         bool per_pkg;
183         bool snapshot;
184 };
185 
186 struct pmu_event_info {
187         const struct perf_pmu *pmu;
188         const char *name;
189         const char* alias;
190         const char *scale_unit;
191         const char *desc;
192         const char *long_desc;
193         const char *encoding_desc;
194         const char *topic;
195         const char *pmu_name;
196         const char *str;
197         bool deprecated;
198 };
199 
200 typedef int (*pmu_event_callback)(void *state, struct pmu_event_info *info);
201 typedef int (*pmu_format_callback)(void *state, const char *name, int config,
202                                    const unsigned long *bits);
203 
204 void pmu_add_sys_aliases(struct perf_pmu *pmu);
205 int perf_pmu__config(struct perf_pmu *pmu, struct perf_event_attr *attr,
206                      struct parse_events_terms *head_terms,
207                      struct parse_events_error *error);
208 int perf_pmu__config_terms(const struct perf_pmu *pmu,
209                            struct perf_event_attr *attr,
210                            struct parse_events_terms *terms,
211                            bool zero, struct parse_events_error *error);
212 __u64 perf_pmu__format_bits(struct perf_pmu *pmu, const char *name);
213 int perf_pmu__format_type(struct perf_pmu *pmu, const char *name);
214 int perf_pmu__check_alias(struct perf_pmu *pmu, struct parse_events_terms *head_terms,
215                           struct perf_pmu_info *info, bool *rewrote_terms,
216                           struct parse_events_error *err);
217 int perf_pmu__find_event(struct perf_pmu *pmu, const char *event, void *state, pmu_event_callback cb);
218 
219 void perf_pmu_format__set_value(void *format, int config, unsigned long *bits);
220 bool perf_pmu__has_format(const struct perf_pmu *pmu, const char *name);
221 int perf_pmu__for_each_format(struct perf_pmu *pmu, void *state, pmu_format_callback cb);
222 
223 bool is_pmu_core(const char *name);
224 bool perf_pmu__supports_legacy_cache(const struct perf_pmu *pmu);
225 bool perf_pmu__auto_merge_stats(const struct perf_pmu *pmu);
226 bool perf_pmu__have_event(struct perf_pmu *pmu, const char *name);
227 size_t perf_pmu__num_events(struct perf_pmu *pmu);
228 int perf_pmu__for_each_event(struct perf_pmu *pmu, bool skip_duplicate_pmus,
229                              void *state, pmu_event_callback cb);
230 bool pmu__name_match(const struct perf_pmu *pmu, const char *pmu_name);
231 
232 /**
233  * perf_pmu_is_software - is the PMU a software PMU as in it uses the
234  *                        perf_sw_context in the kernel?
235  */
236 bool perf_pmu__is_software(const struct perf_pmu *pmu);
237 
238 FILE *perf_pmu__open_file(const struct perf_pmu *pmu, const char *name);
239 FILE *perf_pmu__open_file_at(const struct perf_pmu *pmu, int dirfd, const char *name);
240 
241 int perf_pmu__scan_file(const struct perf_pmu *pmu, const char *name, const char *fmt, ...)
242         __scanf(3, 4);
243 int perf_pmu__scan_file_at(const struct perf_pmu *pmu, int dirfd, const char *name,
244                            const char *fmt, ...) __scanf(4, 5);
245 
246 bool perf_pmu__file_exists(const struct perf_pmu *pmu, const char *name);
247 
248 int perf_pmu__test(void);
249 
250 void perf_pmu__arch_init(struct perf_pmu *pmu);
251 void pmu_add_cpu_aliases_table(struct perf_pmu *pmu,
252                                const struct pmu_events_table *table);
253 
254 char *perf_pmu__getcpuid(struct perf_pmu *pmu);
255 const struct pmu_metrics_table *pmu_metrics_table__find(void);
256 bool pmu_uncore_identifier_match(const char *compat, const char *id);
257 
258 int perf_pmu__convert_scale(const char *scale, char **end, double *sval);
259 
260 int perf_pmu__caps_parse(struct perf_pmu *pmu);
261 
262 void perf_pmu__warn_invalid_config(struct perf_pmu *pmu, __u64 config,
263                                    const char *name, int config_num,
264                                    const char *config_name);
265 void perf_pmu__warn_invalid_formats(struct perf_pmu *pmu);
266 
267 bool perf_pmu__match(const struct perf_pmu *pmu, const char *tok);
268 
269 double perf_pmu__cpu_slots_per_cycle(void);
270 int perf_pmu__event_source_devices_scnprintf(char *pathname, size_t size);
271 int perf_pmu__pathname_scnprintf(char *buf, size_t size,
272                                  const char *pmu_name, const char *filename);
273 int perf_pmu__event_source_devices_fd(void);
274 int perf_pmu__pathname_fd(int dirfd, const char *pmu_name, const char *filename, int flags);
275 
276 struct perf_pmu *perf_pmu__lookup(struct list_head *pmus, int dirfd, const char *lookup_name,
277                                   bool eager_load);
278 struct perf_pmu *perf_pmu__create_placeholder_core_pmu(struct list_head *core_pmus);
279 void perf_pmu__delete(struct perf_pmu *pmu);
280 struct perf_pmu *perf_pmus__find_core_pmu(void);
281 const char *perf_pmu__name_from_config(struct perf_pmu *pmu, u64 config);
282 
283 #endif /* __PMU_H */
284 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php