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