perf python: Add parse_events function

Add basic parse_events function that takes a string and returns an
evlist. As the python evlist is embedded in a pyrf_evlist, and the
evsels are embedded in pyrf_evsels, copy the parsed data into those
structs and update evsel__clone to enable this.

Signed-off-by: Ian Rogers <irogers@google.com>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: Athira Rajeev <atrajeev@linux.vnet.ibm.com>
Cc: Colin Ian King <colin.i.king@gmail.com>
Cc: Dapeng Mi <dapeng1.mi@linux.intel.com>
Cc: Howard Chu <howardchu95@gmail.com>
Cc: Ilya Leoshkevich <iii@linux.ibm.com>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: James Clark <james.clark@linaro.org>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Josh Poimboeuf <jpoimboe@redhat.com>
Cc: Kan Liang <kan.liang@linux.intel.com>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Michael Petlan <mpetlan@redhat.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas Richter <tmricht@linux.ibm.com>
Cc: Veronika Molnarova <vmolnaro@redhat.com>
Cc: Weilin Wang <weilin.wang@intel.com>
Link: https://lore.kernel.org/r/20241119011644.971342-20-irogers@google.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
Ian Rogers
2024-11-18 17:16:41 -08:00
committed by Arnaldo Carvalho de Melo
parent 5c10f3b446
commit f081defccd
4 changed files with 75 additions and 9 deletions

View File

@@ -13,6 +13,7 @@
#include "evsel.h"
#include "event.h"
#include "print_binary.h"
#include "strbuf.h"
#include "thread_map.h"
#include "trace-event.h"
#include "mmap.h"
@@ -1201,6 +1202,60 @@ static PyObject *pyrf__tracepoint(struct pyrf_evsel *pevsel,
#endif // HAVE_LIBTRACEEVENT
}
static PyObject *pyrf_evsel__from_evsel(struct evsel *evsel)
{
struct pyrf_evsel *pevsel = PyObject_New(struct pyrf_evsel, &pyrf_evsel__type);
if (!pevsel)
return NULL;
memset(&pevsel->evsel, 0, sizeof(pevsel->evsel));
evsel__init(&pevsel->evsel, &evsel->core.attr, evsel->core.idx);
evsel__clone(&pevsel->evsel, evsel);
return (PyObject *)pevsel;
}
static PyObject *pyrf_evlist__from_evlist(struct evlist *evlist)
{
struct pyrf_evlist *pevlist = PyObject_New(struct pyrf_evlist, &pyrf_evlist__type);
struct evsel *pos;
if (!pevlist)
return NULL;
memset(&pevlist->evlist, 0, sizeof(pevlist->evlist));
evlist__init(&pevlist->evlist, evlist->core.all_cpus, evlist->core.threads);
evlist__for_each_entry(evlist, pos) {
struct pyrf_evsel *pevsel = (void *)pyrf_evsel__from_evsel(pos);
evlist__add(&pevlist->evlist, &pevsel->evsel);
}
return (PyObject *)pevlist;
}
static PyObject *pyrf__parse_events(PyObject *self, PyObject *args)
{
const char *input;
struct evlist evlist = {};
struct parse_events_error err;
PyObject *result;
if (!PyArg_ParseTuple(args, "s", &input))
return NULL;
parse_events_error__init(&err);
evlist__init(&evlist, NULL, NULL);
if (parse_events(&evlist, input, &err)) {
parse_events_error__print(&err, input);
PyErr_SetFromErrno(PyExc_OSError);
return NULL;
}
result = pyrf_evlist__from_evlist(&evlist);
evlist__exit(&evlist);
return result;
}
static PyMethodDef perf__methods[] = {
{
.ml_name = "tracepoint",
@@ -1208,6 +1263,12 @@ static PyMethodDef perf__methods[] = {
.ml_flags = METH_VARARGS | METH_KEYWORDS,
.ml_doc = PyDoc_STR("Get tracepoint config.")
},
{
.ml_name = "parse_events",
.ml_meth = (PyCFunction) pyrf__parse_events,
.ml_flags = METH_VARARGS,
.ml_doc = PyDoc_STR("Parse a string of events and return an evlist.")
},
{ .ml_name = NULL, }
};