| From foo@baz Wed Aug 22 09:33:46 CEST 2018 |
| From: Janne Huttunen <janne.huttunen@nokia.com> |
| Date: Mon, 9 Jul 2018 13:59:50 +0300 |
| Subject: perf script python: Fix dict reference counting |
| |
| From: Janne Huttunen <janne.huttunen@nokia.com> |
| |
| [ Upstream commit db0ba84c04ef2cf293aaada5ae97531127844d9d ] |
| |
| The dictionaries are attached to the parameter tuple that steals the |
| references and takes care of releasing them when appropriate. The code |
| should not decrement the reference counts explicitly. E.g. if libpython |
| has been built with reference debugging enabled, the superfluous DECREFs |
| will trigger this error when running perf script: |
| |
| Fatal Python error: Objects/tupleobject.c:238 object at |
| 0x7f10f2041b40 has negative ref count -1 |
| Aborted (core dumped) |
| |
| If the reference debugging is not enabled, the superfluous DECREFs might |
| cause the dict objects to be silently released while they are still in |
| use. This may trigger various other assertions or just cause perf |
| crashes and/or weird and unexpected data changes in the stored Python |
| objects. |
| |
| Signed-off-by: Janne Huttunen <janne.huttunen@nokia.com> |
| Acked-by: Jiri Olsa <jolsa@kernel.org> |
| Acked-by: Namhyung Kim <namhyung@kernel.org> |
| Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com> |
| Cc: Andi Kleen <ak@linux.intel.com> |
| Cc: Jaroslav Skarvada <jskarvad@redhat.com> |
| Cc: Namhyung Kim <namhyung@kernel.org> |
| Cc: Peter Zijlstra <peterz@infradead.org> |
| Link: http://lkml.kernel.org/r/1531133990-17485-1-git-send-email-janne.huttunen@nokia.com |
| Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com> |
| Signed-off-by: Sasha Levin <alexander.levin@microsoft.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| tools/perf/util/scripting-engines/trace-event-python.c | 8 ++------ |
| 1 file changed, 2 insertions(+), 6 deletions(-) |
| |
| --- a/tools/perf/util/scripting-engines/trace-event-python.c |
| +++ b/tools/perf/util/scripting-engines/trace-event-python.c |
| @@ -643,14 +643,11 @@ static void python_process_tracepoint(st |
| if (_PyTuple_Resize(&t, n) == -1) |
| Py_FatalError("error resizing Python tuple"); |
| |
| - if (!dict) { |
| + if (!dict) |
| call_object(handler, t, handler_name); |
| - } else { |
| + else |
| call_object(handler, t, default_handler_name); |
| - Py_DECREF(dict); |
| - } |
| |
| - Py_XDECREF(all_entries_dict); |
| Py_DECREF(t); |
| } |
| |
| @@ -970,7 +967,6 @@ static void python_process_general_event |
| |
| call_object(handler, t, handler_name); |
| |
| - Py_DECREF(dict); |
| Py_DECREF(t); |
| } |
| |