mirror of
https://github.com/raspberrypi/linux.git
synced 2025-12-14 22:10:14 +00:00
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:
committed by
Arnaldo Carvalho de Melo
parent
5c10f3b446
commit
f081defccd
@@ -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, }
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user