1 // SPDX-License-Identifier: GPL-2.0-only
3 #define METRICGROUP_H 1
5 #include <linux/list.h>
6 #include <linux/rbtree.h>
8 #include "pmu-events/pmu-events.h"
13 struct print_callbacks
;
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.
25 bool is_default
; /* the metric evsel from the Default metricgroup */
26 struct list_head head
; /* list of metric_expr */
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.
37 const char *metric_name
;
38 const char *metric_expr
;
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.
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
;
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.
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. */
69 struct metric_event
*metricgroup__lookup(struct rblist
*metric_events
,
72 int metricgroup__parse_groups(struct evlist
*perf_evlist
,
77 bool metric_no_threshold
,
78 const char *user_requested_cpu_list
,
80 bool hardware_aware_grouping
,
81 struct rblist
*metric_events
);
82 int metricgroup__parse_groups_test(struct evlist
*evlist
,
83 const struct pmu_metrics_table
*table
,
85 struct rblist
*metric_events
);
87 void metricgroup__print(const struct print_callbacks
*print_cb
, void *print_state
);
88 bool metricgroup__has_metric(const char *pmu
, const char *metric
);
89 unsigned int metricgroups__topdown_max_level(void);
90 int arch_get_runtimeparam(const struct pmu_metric
*pm
);
91 void metricgroup__rblist_exit(struct rblist
*metric_events
);
93 int metricgroup__copy_metric_events(struct evlist
*evlist
, struct cgroup
*cgrp
,
94 struct rblist
*new_metric_events
,
95 struct rblist
*old_metric_events
);