From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751656AbdGZRaZ (ORCPT ); Wed, 26 Jul 2017 13:30:25 -0400 Received: from terminus.zytor.com ([65.50.211.136]:39795 "EHLO terminus.zytor.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751539AbdGZRaW (ORCPT ); Wed, 26 Jul 2017 13:30:22 -0400 Date: Wed, 26 Jul 2017 10:25:29 -0700 From: tip-bot for Arun Kalyanasundaram Message-ID: Cc: sj38.park@gmail.com, daniel@iogearbox.net, mingo@kernel.org, davidcc@google.com, acme@redhat.com, peterz@infradead.org, jolsa@kernel.org, linux-kernel@vger.kernel.org, davem@davemloft.net, alexander.shishkin@linux.intel.com, arunkaly@google.com, eranian@google.com, hpa@zytor.com, tglx@linutronix.de Reply-To: daniel@iogearbox.net, sj38.park@gmail.com, mingo@kernel.org, davidcc@google.com, acme@redhat.com, peterz@infradead.org, jolsa@kernel.org, davem@davemloft.net, linux-kernel@vger.kernel.org, alexander.shishkin@linux.intel.com, arunkaly@google.com, eranian@google.com, tglx@linutronix.de, hpa@zytor.com In-Reply-To: <20170721220422.63962-5-arunkaly@google.com> References: <20170721220422.63962-5-arunkaly@google.com> To: linux-tip-commits@vger.kernel.org Subject: [tip:perf/core] perf script python: Add perf_sample dict to tracepoint handlers Git-Commit-ID: f38d281663b011d1d8a1b0119bb8357706d134a8 X-Mailer: tip-git-log-daemon Robot-ID: Robot-Unsubscribe: Contact to get blacklisted from these emails MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset=UTF-8 Content-Disposition: inline Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Commit-ID: f38d281663b011d1d8a1b0119bb8357706d134a8 Gitweb: http://git.kernel.org/tip/f38d281663b011d1d8a1b0119bb8357706d134a8 Author: Arun Kalyanasundaram AuthorDate: Fri, 21 Jul 2017 15:04:21 -0700 Committer: Arnaldo Carvalho de Melo CommitDate: Tue, 25 Jul 2017 22:43:20 -0300 perf script python: Add perf_sample dict to tracepoint handlers The process_event python hook receives a dict with all perf_sample entries, but the tracepoint specific and trace_unhandled hooks predate the introduction of this dict, and do not receive it. Add the aforementioned dict as an additional argument to the affected handlers. To keep backwards compatibility (and avoid unnecessary work), do not pass the dict if the number of arguments signals that handler version predates this change. Signed-off-by: Arun Kalyanasundaram Acked-by: Jiri Olsa Cc: Alexander Shishkin Cc: Daniel Borkmann Cc: David Carrillo-Cisneros Cc: David S. Miller Cc: Peter Zijlstra Cc: Seongjae Park Cc: Stephane Eranian Link: http://lkml.kernel.org/r/20170721220422.63962-5-arunkaly@google.com Signed-off-by: Arnaldo Carvalho de Melo --- .../util/scripting-engines/trace-event-python.c | 41 +++++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) diff --git a/tools/perf/util/scripting-engines/trace-event-python.c b/tools/perf/util/scripting-engines/trace-event-python.c index 55a4578..938b39f 100644 --- a/tools/perf/util/scripting-engines/trace-event-python.c +++ b/tools/perf/util/scripting-engines/trace-event-python.c @@ -116,6 +116,34 @@ static PyObject *get_handler(const char *handler_name) return handler; } +static int get_argument_count(PyObject *handler) +{ + int arg_count = 0; + + /* + * The attribute for the code object is func_code in Python 2, + * whereas it is __code__ in Python 3.0+. + */ + PyObject *code_obj = PyObject_GetAttrString(handler, + "func_code"); + if (PyErr_Occurred()) { + PyErr_Clear(); + code_obj = PyObject_GetAttrString(handler, + "__code__"); + } + PyErr_Clear(); + if (code_obj) { + PyObject *arg_count_obj = PyObject_GetAttrString(code_obj, + "co_argcount"); + if (arg_count_obj) { + arg_count = (int) PyInt_AsLong(arg_count_obj); + Py_DECREF(arg_count_obj); + } + Py_DECREF(code_obj); + } + return arg_count; +} + static void call_object(PyObject *handler, PyObject *args, const char *die_msg) { PyObject *retval; @@ -499,7 +527,7 @@ static void python_process_tracepoint(struct perf_sample *sample, { struct event_format *event = evsel->tp_format; PyObject *handler, *context, *t, *obj = NULL, *callchain; - PyObject *dict = NULL; + PyObject *dict = NULL, *all_entries_dict = NULL; static char handler_name[256]; struct format_field *field; unsigned long s, ns; @@ -552,6 +580,8 @@ static void python_process_tracepoint(struct perf_sample *sample, /* ip unwinding */ callchain = python_process_callchain(sample, evsel, al); + /* Need an additional reference for the perf_sample dict */ + Py_INCREF(callchain); if (!dict) { PyTuple_SetItem(t, n++, PyInt_FromLong(cpu)); @@ -602,6 +632,14 @@ static void python_process_tracepoint(struct perf_sample *sample, if (dict) PyTuple_SetItem(t, n++, dict); + if (get_argument_count(handler) == (int) n + 1) { + all_entries_dict = get_perf_sample_dict(sample, evsel, al, + callchain); + PyTuple_SetItem(t, n++, all_entries_dict); + } else { + Py_DECREF(callchain); + } + if (_PyTuple_Resize(&t, n) == -1) Py_FatalError("error resizing Python tuple"); @@ -612,6 +650,7 @@ static void python_process_tracepoint(struct perf_sample *sample, Py_DECREF(dict); } + Py_XDECREF(all_entries_dict); Py_DECREF(t); }