From: tip-bot for Jiri Olsa <tipbot@zytor.com>
To: linux-tip-commits@vger.kernel.org
Cc: acme@redhat.com, tglx@linutronix.de, mingo@kernel.org,
a.p.zijlstra@chello.nl, namhyung@kernel.org, jiri@mellanox.com,
dsahern@gmail.com, jolsa@kernel.org, hpa@zytor.com,
linux-kernel@vger.kernel.org
Subject: [tip:perf/core] perf python: Add support to resolve tracepoint fields
Date: Wed, 13 Jul 2016 00:27:58 -0700 [thread overview]
Message-ID: <tip-bae57e3825a3dded15f61cd20c6757d60ad6c712@git.kernel.org> (raw)
In-Reply-To: <1468148882-10362-9-git-send-email-jolsa@kernel.org>
Commit-ID: bae57e3825a3dded15f61cd20c6757d60ad6c712
Gitweb: http://git.kernel.org/tip/bae57e3825a3dded15f61cd20c6757d60ad6c712
Author: Jiri Olsa <jolsa@kernel.org>
AuthorDate: Sun, 10 Jul 2016 13:08:00 +0200
Committer: Arnaldo Carvalho de Melo <acme@redhat.com>
CommitDate: Tue, 12 Jul 2016 16:19:16 -0300
perf python: Add support to resolve tracepoint fields
Adding tp_getattro callback for sample event. It resolves tracepoint
fields in runtime.
It's now possible to access tracepoint fields in normal fashion like
hardcoded ones (see the example in the next patch).
Reported-and-Tested-by: Jiri Pirko <jiri@mellanox.com>
Signed-off-by: Jiri Olsa <jolsa@kernel.org>
Cc: David Ahern <dsahern@gmail.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Link: http://lkml.kernel.org/r/1468148882-10362-9-git-send-email-jolsa@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
tools/perf/util/python.c | 92 ++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 92 insertions(+)
diff --git a/tools/perf/util/python.c b/tools/perf/util/python.c
index dc7adaa..d32f970 100644
--- a/tools/perf/util/python.c
+++ b/tools/perf/util/python.c
@@ -290,6 +290,97 @@ static PyObject *pyrf_sample_event__repr(struct pyrf_event *pevent)
return ret;
}
+static bool is_tracepoint(struct pyrf_event *pevent)
+{
+ return pevent->evsel->attr.type == PERF_TYPE_TRACEPOINT;
+}
+
+static int is_printable_array(char *p, unsigned int len)
+{
+ unsigned int i;
+
+ for (i = 0; i < len; i++) {
+ if (!isprint(p[i]) && !isspace(p[i]))
+ return 0;
+ }
+
+ return 1;
+}
+
+static PyObject*
+tracepoint_field(struct pyrf_event *pe, struct format_field *field)
+{
+ struct pevent *pevent = field->event->pevent;
+ void *data = pe->sample.raw_data;
+ PyObject *ret = NULL;
+ unsigned long long val;
+ unsigned int offset, len;
+
+ if (field->flags & FIELD_IS_ARRAY) {
+ offset = field->offset;
+ len = field->size;
+ if (field->flags & FIELD_IS_DYNAMIC) {
+ val = pevent_read_number(pevent, data + offset, len);
+ offset = val;
+ len = offset >> 16;
+ offset &= 0xffff;
+ }
+ if (field->flags & FIELD_IS_STRING &&
+ is_printable_array(data + offset, len)) {
+ ret = PyString_FromString((char *)data + offset);
+ } else {
+ ret = PyByteArray_FromStringAndSize((const char *) data + offset, len);
+ field->flags &= ~FIELD_IS_STRING;
+ }
+ } else {
+ val = pevent_read_number(pevent, data + field->offset,
+ field->size);
+ if (field->flags & FIELD_IS_POINTER)
+ ret = PyLong_FromUnsignedLong((unsigned long) val);
+ else if (field->flags & FIELD_IS_SIGNED)
+ ret = PyLong_FromLong((long) val);
+ else
+ ret = PyLong_FromUnsignedLong((unsigned long) val);
+ }
+
+ return ret;
+}
+
+static PyObject*
+get_tracepoint_field(struct pyrf_event *pevent, PyObject *attr_name)
+{
+ const char *str = PyString_AsString(PyObject_Str(attr_name));
+ struct perf_evsel *evsel = pevent->evsel;
+ struct format_field *field;
+
+ if (!evsel->tp_format) {
+ struct event_format *tp_format;
+
+ tp_format = trace_event__tp_format_id(evsel->attr.config);
+ if (!tp_format)
+ return NULL;
+
+ evsel->tp_format = tp_format;
+ }
+
+ field = pevent_find_any_field(evsel->tp_format, str);
+ if (!field)
+ return NULL;
+
+ return tracepoint_field(pevent, field);
+}
+
+static PyObject*
+pyrf_sample_event__getattro(struct pyrf_event *pevent, PyObject *attr_name)
+{
+ PyObject *obj = NULL;
+
+ if (is_tracepoint(pevent))
+ obj = get_tracepoint_field(pevent, attr_name);
+
+ return obj ?: PyObject_GenericGetAttr((PyObject *) pevent, attr_name);
+}
+
static PyTypeObject pyrf_sample_event__type = {
PyVarObject_HEAD_INIT(NULL, 0)
.tp_name = "perf.sample_event",
@@ -298,6 +389,7 @@ static PyTypeObject pyrf_sample_event__type = {
.tp_doc = pyrf_sample_event__doc,
.tp_members = pyrf_sample_event__members,
.tp_repr = (reprfunc)pyrf_sample_event__repr,
+ .tp_getattro = (getattrofunc) pyrf_sample_event__getattro,
};
static char pyrf_context_switch_event__doc[] = PyDoc_STR("perf context_switch event object.");
next prev parent reply other threads:[~2016-07-13 7:28 UTC|newest]
Thread overview: 30+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-07-10 11:07 [PATCH 00/10] perf python: Add support to access tracepoint fields Jiri Olsa
2016-07-10 11:07 ` [PATCH 01/10] perf tools: Make perf_evlist__event2evsel public Jiri Olsa
2016-07-13 7:24 ` [tip:perf/core] perf evlist: Make event2evsel public tip-bot for Jiri Olsa
2016-07-10 11:07 ` [PATCH 02/10] perf tools: Introduce trace_event__tp_format_id function Jiri Olsa
2016-07-13 7:25 ` [tip:perf/core] perf tools: Introduce trace_event__tp_format_id() tip-bot for Jiri Olsa
2016-07-10 11:07 ` [PATCH 03/10] perf python: Init perf_event_attr::size in perf.evsel constructor Jiri Olsa
2016-07-13 7:25 ` [tip:perf/core] " tip-bot for Jiri Olsa
2016-07-10 11:07 ` [PATCH 04/10] perf python: Fix pyrf_evlist__read_on_cpu event consuming Jiri Olsa
2016-07-13 7:26 ` [tip:perf/core] " tip-bot for Jiri Olsa
2016-07-10 11:07 ` [PATCH 05/10] perf python: Put perf.event objects into dictionary Jiri Olsa
2016-07-13 7:26 ` [tip:perf/core] " tip-bot for Jiri Olsa
2016-07-10 11:07 ` [PATCH 06/10] perf python: Add perf.tracepoint method Jiri Olsa
2016-07-13 7:27 ` [tip:perf/core] " tip-bot for Jiri Olsa
2016-07-10 11:07 ` [PATCH 07/10] perf python: Add struct evsel into struct pyrf_event Jiri Olsa
2016-07-13 7:27 ` [tip:perf/core] " tip-bot for Jiri Olsa
2016-07-10 11:08 ` [PATCH 08/10] perf python: Add support to resolve tracepoint fields Jiri Olsa
2016-07-13 7:27 ` tip-bot for Jiri Olsa [this message]
2016-07-10 11:08 ` [PATCH 09/10] perf python: Add tracepoint example Jiri Olsa
2016-07-13 7:28 ` [tip:perf/core] " tip-bot for Jiri Olsa
2016-07-10 11:08 ` [PATCH 10/10] perf script python: Fix string vs byte array resolving Jiri Olsa
2016-07-11 15:54 ` Steven Rostedt
2016-07-12 8:11 ` Jiri Olsa
2016-07-12 12:37 ` Steven Rostedt
2016-07-12 12:52 ` Jiri Olsa
2016-07-12 13:00 ` Steven Rostedt
2016-07-12 13:35 ` Jiri Olsa
2016-07-12 13:48 ` Steven Rostedt
2016-07-12 19:27 ` Arnaldo Carvalho de Melo
2016-07-12 19:48 ` Steven Rostedt
2016-07-13 9:06 ` Jiri Olsa
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=tip-bae57e3825a3dded15f61cd20c6757d60ad6c712@git.kernel.org \
--to=tipbot@zytor.com \
--cc=a.p.zijlstra@chello.nl \
--cc=acme@redhat.com \
--cc=dsahern@gmail.com \
--cc=hpa@zytor.com \
--cc=jiri@mellanox.com \
--cc=jolsa@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-tip-commits@vger.kernel.org \
--cc=mingo@kernel.org \
--cc=namhyung@kernel.org \
--cc=tglx@linutronix.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox