1 | // SPDX-License-Identifier: GPL-2.0-only |
2 | #ifndef METRICGROUP_H |
3 | #define METRICGROUP_H 1 |
4 | |
5 | #include <linux/list.h> |
6 | #include <linux/rbtree.h> |
7 | #include <stdbool.h> |
8 | #include "pmu-events/pmu-events.h" |
9 | |
10 | struct evlist; |
11 | struct evsel; |
12 | struct option; |
13 | struct print_callbacks; |
14 | struct rblist; |
15 | struct cgroup; |
16 | |
17 | /** |
18 | * A node in a rblist keyed by the evsel. The global rblist of metric events |
19 | * generally exists in perf_stat_config. The evsel is looked up in the rblist |
20 | * yielding a list of metric_expr. |
21 | */ |
22 | struct metric_event { |
23 | struct rb_node nd; |
24 | struct evsel *evsel; |
25 | bool is_default; /* the metric evsel from the Default metricgroup */ |
26 | struct list_head head; /* list of metric_expr */ |
27 | }; |
28 | |
29 | /** |
30 | * A metric referenced by a metric_expr. When parsing a metric expression IDs |
31 | * will be looked up, matching either a value (from metric_events) or a |
32 | * metric_ref. A metric_ref will then be parsed recursively. The metric_refs and |
33 | * metric_events need to be known before parsing so that their values may be |
34 | * placed in the parse context for lookup. |
35 | */ |
36 | struct metric_ref { |
37 | const char *metric_name; |
38 | const char *metric_expr; |
39 | }; |
40 | |
41 | /** |
42 | * One in a list of metric_expr associated with an evsel. The data is used to |
43 | * generate a metric value during stat output. |
44 | */ |
45 | struct metric_expr { |
46 | struct list_head nd; |
47 | /** The expression to parse, for example, "instructions/cycles". */ |
48 | const char *metric_expr; |
49 | /** The name of the meric such as "IPC". */ |
50 | const char *metric_name; |
51 | const char *metric_threshold; |
52 | /** |
53 | * The "ScaleUnit" that scales and adds a unit to the metric during |
54 | * output. For example, "6.4e-05MiB" means to scale the resulting metric |
55 | * by 6.4e-05 (typically converting a unit like cache lines to something |
56 | * more human intelligible) and then add "MiB" afterward when displayed. |
57 | */ |
58 | const char *metric_unit; |
59 | /** Displayed metricgroup name of the Default metricgroup */ |
60 | const char *default_metricgroup_name; |
61 | /** Null terminated array of events used by the metric. */ |
62 | struct evsel **metric_events; |
63 | /** Null terminated array of referenced metrics. */ |
64 | struct metric_ref *metric_refs; |
65 | /** A value substituted for '?' during parsing. */ |
66 | int runtime; |
67 | }; |
68 | |
69 | struct metric_event *metricgroup__lookup(struct rblist *metric_events, |
70 | struct evsel *evsel, |
71 | bool create); |
72 | int metricgroup__parse_groups(struct evlist *perf_evlist, |
73 | const char *pmu, |
74 | const char *str, |
75 | bool metric_no_group, |
76 | bool metric_no_merge, |
77 | bool metric_no_threshold, |
78 | const char *user_requested_cpu_list, |
79 | bool system_wide, |
80 | struct rblist *metric_events); |
81 | int metricgroup__parse_groups_test(struct evlist *evlist, |
82 | const struct pmu_metrics_table *table, |
83 | const char *str, |
84 | struct rblist *metric_events); |
85 | |
86 | void metricgroup__print(const struct print_callbacks *print_cb, void *print_state); |
87 | bool metricgroup__has_metric(const char *pmu, const char *metric); |
88 | unsigned int metricgroups__topdown_max_level(void); |
89 | int arch_get_runtimeparam(const struct pmu_metric *pm); |
90 | void metricgroup__rblist_exit(struct rblist *metric_events); |
91 | |
92 | int metricgroup__copy_metric_events(struct evlist *evlist, struct cgroup *cgrp, |
93 | struct rblist *new_metric_events, |
94 | struct rblist *old_metric_events); |
95 | #endif |
96 | |