summaryrefslogtreecommitdiffstats
path: root/tools/perf/util/metricgroup.h
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-11 08:27:49 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-11 08:27:49 +0000
commitace9429bb58fd418f0c81d4c2835699bddf6bde6 (patch)
treeb2d64bc10158fdd5497876388cd68142ca374ed3 /tools/perf/util/metricgroup.h
parentInitial commit. (diff)
downloadlinux-ace9429bb58fd418f0c81d4c2835699bddf6bde6.tar.xz
linux-ace9429bb58fd418f0c81d4c2835699bddf6bde6.zip
Adding upstream version 6.6.15.upstream/6.6.15
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'tools/perf/util/metricgroup.h')
-rw-r--r--tools/perf/util/metricgroup.h95
1 files changed, 95 insertions, 0 deletions
diff --git a/tools/perf/util/metricgroup.h b/tools/perf/util/metricgroup.h
new file mode 100644
index 0000000000..d5325c6ec8
--- /dev/null
+++ b/tools/perf/util/metricgroup.h
@@ -0,0 +1,95 @@
+// SPDX-License-Identifier: GPL-2.0-only
+#ifndef METRICGROUP_H
+#define METRICGROUP_H 1
+
+#include <linux/list.h>
+#include <linux/rbtree.h>
+#include <stdbool.h>
+#include "pmu-events/pmu-events.h"
+
+struct evlist;
+struct evsel;
+struct option;
+struct print_callbacks;
+struct rblist;
+struct cgroup;
+
+/**
+ * A node in a rblist keyed by the evsel. The global rblist of metric events
+ * generally exists in perf_stat_config. The evsel is looked up in the rblist
+ * yielding a list of metric_expr.
+ */
+struct metric_event {
+ struct rb_node nd;
+ struct evsel *evsel;
+ bool is_default; /* the metric evsel from the Default metricgroup */
+ struct list_head head; /* list of metric_expr */
+};
+
+/**
+ * A metric referenced by a metric_expr. When parsing a metric expression IDs
+ * will be looked up, matching either a value (from metric_events) or a
+ * metric_ref. A metric_ref will then be parsed recursively. The metric_refs and
+ * metric_events need to be known before parsing so that their values may be
+ * placed in the parse context for lookup.
+ */
+struct metric_ref {
+ const char *metric_name;
+ const char *metric_expr;
+};
+
+/**
+ * One in a list of metric_expr associated with an evsel. The data is used to
+ * generate a metric value during stat output.
+ */
+struct metric_expr {
+ struct list_head nd;
+ /** The expression to parse, for example, "instructions/cycles". */
+ const char *metric_expr;
+ /** The name of the meric such as "IPC". */
+ const char *metric_name;
+ const char *metric_threshold;
+ /**
+ * The "ScaleUnit" that scales and adds a unit to the metric during
+ * output. For example, "6.4e-05MiB" means to scale the resulting metric
+ * by 6.4e-05 (typically converting a unit like cache lines to something
+ * more human intelligible) and then add "MiB" afterward when displayed.
+ */
+ const char *metric_unit;
+ /** Displayed metricgroup name of the Default metricgroup */
+ const char *default_metricgroup_name;
+ /** Null terminated array of events used by the metric. */
+ struct evsel **metric_events;
+ /** Null terminated array of referenced metrics. */
+ struct metric_ref *metric_refs;
+ /** A value substituted for '?' during parsing. */
+ int runtime;
+};
+
+struct metric_event *metricgroup__lookup(struct rblist *metric_events,
+ struct evsel *evsel,
+ bool create);
+int metricgroup__parse_groups(struct evlist *perf_evlist,
+ const char *pmu,
+ const char *str,
+ bool metric_no_group,
+ bool metric_no_merge,
+ bool metric_no_threshold,
+ const char *user_requested_cpu_list,
+ bool system_wide,
+ struct rblist *metric_events);
+int metricgroup__parse_groups_test(struct evlist *evlist,
+ const struct pmu_metrics_table *table,
+ const char *str,
+ struct rblist *metric_events);
+
+void metricgroup__print(const struct print_callbacks *print_cb, void *print_state);
+bool metricgroup__has_metric(const char *pmu, const char *metric);
+unsigned int metricgroups__topdown_max_level(void);
+int arch_get_runtimeparam(const struct pmu_metric *pm);
+void metricgroup__rblist_exit(struct rblist *metric_events);
+
+int metricgroup__copy_metric_events(struct evlist *evlist, struct cgroup *cgrp,
+ struct rblist *new_metric_events,
+ struct rblist *old_metric_events);
+#endif