]> www.infradead.org Git - users/hch/misc.git/commitdiff
perf python: Add evlist metrics function
authorIan Rogers <irogers@google.com>
Tue, 19 Aug 2025 01:39:37 +0000 (18:39 -0700)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Wed, 3 Sep 2025 15:34:54 +0000 (12:34 -0300)
The function returns a list of the names of metrics within the
evlist. For example:
```
>>> import perf
>>> perf.parse_metrics("TopdownL1").metrics()
['tma_bad_speculation', 'tma_frontend_bound', 'tma_backend_bound', 'tma_retiring']
```

Reviewed-by: Howard Chu <howardchu95@gmail.com>
Signed-off-by: Ian Rogers <irogers@google.com>
Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: Chun-Tse Shao <ctshao@google.com>
Cc: Collin Funk <collin.funk1@gmail.com>
Cc: Dr. David Alan Gilbert <linux@treblig.org>
Cc: Gautam Menghani <gautam@linux.ibm.com>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: James Clark <james.clark@linaro.org>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Kan Liang <kan.liang@linux.intel.com>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Masami Hiramatsu <mhiramat@kernel.org>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas Falcon <thomas.falcon@intel.com>
Cc: Thomas Richter <tmricht@linux.ibm.com>
Cc: Tiezhu Yang <yangtiezhu@loongson.cn>
Cc: Weilin Wang <weilin.wang@intel.com>
Cc: Xu Yang <xu.yang_2@nxp.com>
Link: https://lore.kernel.org/r/20250819013941.209033-8-irogers@google.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/util/python.c

index 48308ed4e1c73782ba9f0ef651ca340379d180ee..31089f8e5519ee144b78cd28ff043d3cd973b25a 100644 (file)
@@ -1303,6 +1303,33 @@ static PyObject *pyrf_evlist__all_cpus(struct pyrf_evlist *pevlist)
        return (PyObject *)pcpu_map;
 }
 
+static PyObject *pyrf_evlist__metrics(struct pyrf_evlist *pevlist)
+{
+       PyObject *list = PyList_New(/*len=*/0);
+       struct rb_node *node;
+
+       if (!list)
+               return NULL;
+
+       for (node = rb_first_cached(&pevlist->evlist.metric_events.entries); node;
+            node = rb_next(node)) {
+               struct metric_event *me = container_of(node, struct metric_event, nd);
+               struct list_head *pos;
+
+               list_for_each(pos, &me->head) {
+                       struct metric_expr *expr = container_of(pos, struct metric_expr, nd);
+                       PyObject *str = PyUnicode_FromString(expr->metric_name);
+
+                       if (!str || PyList_Append(list, str) != 0) {
+                               Py_DECREF(list);
+                               return NULL;
+                       }
+                       Py_DECREF(str);
+               }
+       }
+       return list;
+}
+
 static PyObject *pyrf_evlist__mmap(struct pyrf_evlist *pevlist,
                                   PyObject *args, PyObject *kwargs)
 {
@@ -1531,6 +1558,12 @@ static PyMethodDef pyrf_evlist__methods[] = {
                .ml_flags = METH_NOARGS,
                .ml_doc   = PyDoc_STR("CPU map union of all evsel CPU maps.")
        },
+       {
+               .ml_name  = "metrics",
+               .ml_meth  = (PyCFunction)pyrf_evlist__metrics,
+               .ml_flags = METH_NOARGS,
+               .ml_doc   = PyDoc_STR("List of metric names within the evlist.")
+       },
        {
                .ml_name  = "mmap",
                .ml_meth  = (PyCFunction)pyrf_evlist__mmap,