aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJanne Huttunen <janne.huttunen@nokia.com>2018-07-09 06:59:50 -0400
committerArnaldo Carvalho de Melo <acme@redhat.com>2018-07-11 09:45:24 -0400
commitdb0ba84c04ef2cf293aaada5ae97531127844d9d (patch)
tree5a223bcaff04457be57c161178a7cc4e50bd1557
parentc818cc063089e78bc31845d1eb6a1f0bedee1eae (diff)
perf script python: Fix dict reference counting
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>
-rw-r--r--tools/perf/util/scripting-engines/trace-event-python.c8
1 files changed, 2 insertions, 6 deletions
diff --git a/tools/perf/util/scripting-engines/trace-event-python.c b/tools/perf/util/scripting-engines/trace-event-python.c
index 8b2eb6dbff4d..bc32e57d17be 100644
--- a/tools/perf/util/scripting-engines/trace-event-python.c
+++ b/tools/perf/util/scripting-engines/trace-event-python.c
@@ -908,14 +908,11 @@ static void python_process_tracepoint(struct perf_sample *sample,
908 if (_PyTuple_Resize(&t, n) == -1) 908 if (_PyTuple_Resize(&t, n) == -1)
909 Py_FatalError("error resizing Python tuple"); 909 Py_FatalError("error resizing Python tuple");
910 910
911 if (!dict) { 911 if (!dict)
912 call_object(handler, t, handler_name); 912 call_object(handler, t, handler_name);
913 } else { 913 else
914 call_object(handler, t, default_handler_name); 914 call_object(handler, t, default_handler_name);
915 Py_DECREF(dict);
916 }
917 915
918 Py_XDECREF(all_entries_dict);
919 Py_DECREF(t); 916 Py_DECREF(t);
920} 917}
921 918
@@ -1235,7 +1232,6 @@ static void python_process_general_event(struct perf_sample *sample,
1235 1232
1236 call_object(handler, t, handler_name); 1233 call_object(handler, t, handler_name);
1237 1234
1238 Py_DECREF(dict);
1239 Py_DECREF(t); 1235 Py_DECREF(t);
1240} 1236}
1241 1237