diff options
author | Pierre Tardy <tardyp@gmail.com> | 2010-05-31 17:12:09 -0400 |
---|---|---|
committer | Arnaldo Carvalho de Melo <acme@redhat.com> | 2010-06-01 05:12:35 -0400 |
commit | c02514850d67be8db6b2b6658cbc23ac1fbf8bc7 (patch) | |
tree | 309a7df9e2cb7ae681479ae36fd39e710721c472 /tools/perf | |
parent | 75d9ef1707cf3db264a549142a1f54a5380d63dc (diff) |
perf scripts python: Give field dict to unhandled callback
trace_unhandled() callback does not allow to access event fields, this patch
resolves the problem.
It can also been used as a more pythonic and flexible way for script writters
to demux event types
This will for example greatly simplify pytimechart event demux.
Acked-by: Frederic Weisbecker <fweisbec@gmail.com>
Acked-by: Tom Zanussi <tzanussi@gmail.com>
Cc: Ingo Molnar <mingo@elte.hu>,
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Tom Zanussi <tzanussi@gmail.com>
LKML-Reference: <1275340329-2397-1-git-send-email-tardyp@gmail.com>
Signed-off-by: Pierre Tardy <tardyp@gmail.com>
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Diffstat (limited to 'tools/perf')
-rw-r--r-- | tools/perf/scripts/python/check-perf-trace.py | 3 | ||||
-rw-r--r-- | tools/perf/util/scripting-engines/trace-event-python.c | 50 |
2 files changed, 35 insertions, 18 deletions
diff --git a/tools/perf/scripts/python/check-perf-trace.py b/tools/perf/scripts/python/check-perf-trace.py index 964d934395ff..d9f7893e315c 100644 --- a/tools/perf/scripts/python/check-perf-trace.py +++ b/tools/perf/scripts/python/check-perf-trace.py | |||
@@ -51,8 +51,7 @@ def kmem__kmalloc(event_name, context, common_cpu, | |||
51 | 51 | ||
52 | flag_str("kmem__kmalloc", "gfp_flags", gfp_flags)), | 52 | flag_str("kmem__kmalloc", "gfp_flags", gfp_flags)), |
53 | 53 | ||
54 | def trace_unhandled(event_name, context, common_cpu, common_secs, common_nsecs, | 54 | def trace_unhandled(event_name, context, event_fields_dict): |
55 | common_pid, common_comm): | ||
56 | try: | 55 | try: |
57 | unhandled[event_name] += 1 | 56 | unhandled[event_name] += 1 |
58 | except TypeError: | 57 | except TypeError: |
diff --git a/tools/perf/util/scripting-engines/trace-event-python.c b/tools/perf/util/scripting-engines/trace-event-python.c index 81f39cab3aaa..33a632523743 100644 --- a/tools/perf/util/scripting-engines/trace-event-python.c +++ b/tools/perf/util/scripting-engines/trace-event-python.c | |||
@@ -208,7 +208,7 @@ static void python_process_event(int cpu, void *data, | |||
208 | int size __unused, | 208 | int size __unused, |
209 | unsigned long long nsecs, char *comm) | 209 | unsigned long long nsecs, char *comm) |
210 | { | 210 | { |
211 | PyObject *handler, *retval, *context, *t, *obj; | 211 | PyObject *handler, *retval, *context, *t, *obj, *dict = NULL; |
212 | static char handler_name[256]; | 212 | static char handler_name[256]; |
213 | struct format_field *field; | 213 | struct format_field *field; |
214 | unsigned long long val; | 214 | unsigned long long val; |
@@ -232,6 +232,14 @@ static void python_process_event(int cpu, void *data, | |||
232 | 232 | ||
233 | sprintf(handler_name, "%s__%s", event->system, event->name); | 233 | sprintf(handler_name, "%s__%s", event->system, event->name); |
234 | 234 | ||
235 | handler = PyDict_GetItemString(main_dict, handler_name); | ||
236 | if (handler && !PyCallable_Check(handler)) | ||
237 | handler = NULL; | ||
238 | if (!handler) { | ||
239 | dict = PyDict_New(); | ||
240 | if (!dict) | ||
241 | Py_FatalError("couldn't create Python dict"); | ||
242 | } | ||
235 | s = nsecs / NSECS_PER_SEC; | 243 | s = nsecs / NSECS_PER_SEC; |
236 | ns = nsecs - s * NSECS_PER_SEC; | 244 | ns = nsecs - s * NSECS_PER_SEC; |
237 | 245 | ||
@@ -242,12 +250,20 @@ static void python_process_event(int cpu, void *data, | |||
242 | PyTuple_SetItem(t, n++, PyString_FromString(handler_name)); | 250 | PyTuple_SetItem(t, n++, PyString_FromString(handler_name)); |
243 | PyTuple_SetItem(t, n++, | 251 | PyTuple_SetItem(t, n++, |
244 | PyCObject_FromVoidPtr(scripting_context, NULL)); | 252 | PyCObject_FromVoidPtr(scripting_context, NULL)); |
245 | PyTuple_SetItem(t, n++, PyInt_FromLong(cpu)); | ||
246 | PyTuple_SetItem(t, n++, PyInt_FromLong(s)); | ||
247 | PyTuple_SetItem(t, n++, PyInt_FromLong(ns)); | ||
248 | PyTuple_SetItem(t, n++, PyInt_FromLong(pid)); | ||
249 | PyTuple_SetItem(t, n++, PyString_FromString(comm)); | ||
250 | 253 | ||
254 | if (handler) { | ||
255 | PyTuple_SetItem(t, n++, PyInt_FromLong(cpu)); | ||
256 | PyTuple_SetItem(t, n++, PyInt_FromLong(s)); | ||
257 | PyTuple_SetItem(t, n++, PyInt_FromLong(ns)); | ||
258 | PyTuple_SetItem(t, n++, PyInt_FromLong(pid)); | ||
259 | PyTuple_SetItem(t, n++, PyString_FromString(comm)); | ||
260 | } else { | ||
261 | PyDict_SetItemString(dict, "common_cpu", PyInt_FromLong(cpu)); | ||
262 | PyDict_SetItemString(dict, "common_s", PyInt_FromLong(s)); | ||
263 | PyDict_SetItemString(dict, "common_ns", PyInt_FromLong(ns)); | ||
264 | PyDict_SetItemString(dict, "common_pid", PyInt_FromLong(pid)); | ||
265 | PyDict_SetItemString(dict, "common_comm", PyString_FromString(comm)); | ||
266 | } | ||
251 | for (field = event->format.fields; field; field = field->next) { | 267 | for (field = event->format.fields; field; field = field->next) { |
252 | if (field->flags & FIELD_IS_STRING) { | 268 | if (field->flags & FIELD_IS_STRING) { |
253 | int offset; | 269 | int offset; |
@@ -272,27 +288,31 @@ static void python_process_event(int cpu, void *data, | |||
272 | obj = PyLong_FromUnsignedLongLong(val); | 288 | obj = PyLong_FromUnsignedLongLong(val); |
273 | } | 289 | } |
274 | } | 290 | } |
275 | PyTuple_SetItem(t, n++, obj); | 291 | if (handler) |
292 | PyTuple_SetItem(t, n++, obj); | ||
293 | else | ||
294 | PyDict_SetItemString(dict, field->name, obj); | ||
295 | |||
276 | } | 296 | } |
297 | if (!handler) | ||
298 | PyTuple_SetItem(t, n++, dict); | ||
277 | 299 | ||
278 | if (_PyTuple_Resize(&t, n) == -1) | 300 | if (_PyTuple_Resize(&t, n) == -1) |
279 | Py_FatalError("error resizing Python tuple"); | 301 | Py_FatalError("error resizing Python tuple"); |
280 | 302 | ||
281 | handler = PyDict_GetItemString(main_dict, handler_name); | 303 | if (handler) { |
282 | if (handler && PyCallable_Check(handler)) { | ||
283 | retval = PyObject_CallObject(handler, t); | 304 | retval = PyObject_CallObject(handler, t); |
284 | if (retval == NULL) | 305 | if (retval == NULL) |
285 | handler_call_die(handler_name); | 306 | handler_call_die(handler_name); |
286 | } else { | 307 | } else { |
287 | handler = PyDict_GetItemString(main_dict, "trace_unhandled"); | 308 | handler = PyDict_GetItemString(main_dict, "trace_unhandled"); |
288 | if (handler && PyCallable_Check(handler)) { | 309 | if (handler && PyCallable_Check(handler)) { |
289 | if (_PyTuple_Resize(&t, N_COMMON_FIELDS) == -1) | ||
290 | Py_FatalError("error resizing Python tuple"); | ||
291 | 310 | ||
292 | retval = PyObject_CallObject(handler, t); | 311 | retval = PyObject_CallObject(handler, t); |
293 | if (retval == NULL) | 312 | if (retval == NULL) |
294 | handler_call_die("trace_unhandled"); | 313 | handler_call_die("trace_unhandled"); |
295 | } | 314 | } |
315 | Py_DECREF(dict); | ||
296 | } | 316 | } |
297 | 317 | ||
298 | Py_DECREF(t); | 318 | Py_DECREF(t); |
@@ -548,12 +568,10 @@ static int python_generate_script(const char *outfile) | |||
548 | } | 568 | } |
549 | 569 | ||
550 | fprintf(ofp, "def trace_unhandled(event_name, context, " | 570 | fprintf(ofp, "def trace_unhandled(event_name, context, " |
551 | "common_cpu, common_secs, common_nsecs,\n\t\t" | 571 | "event_fields_dict):\n"); |
552 | "common_pid, common_comm):\n"); | ||
553 | 572 | ||
554 | fprintf(ofp, "\t\tprint_header(event_name, common_cpu, " | 573 | fprintf(ofp, "\t\tprint ' '.join(['%%s=%%s'%%(k,str(v))" |
555 | "common_secs, common_nsecs,\n\t\tcommon_pid, " | 574 | "for k,v in sorted(event_fields_dict.items())])\n\n"); |
556 | "common_comm)\n\n"); | ||
557 | 575 | ||
558 | fprintf(ofp, "def print_header(" | 576 | fprintf(ofp, "def print_header(" |
559 | "event_name, cpu, secs, nsecs, pid, comm):\n" | 577 | "event_name, cpu, secs, nsecs, pid, comm):\n" |