diff options
| author | Takashi Iwai <tiwai@suse.de> | 2010-03-22 12:05:48 -0400 |
|---|---|---|
| committer | Takashi Iwai <tiwai@suse.de> | 2010-03-22 12:05:48 -0400 |
| commit | 2fb20b61550d3c5335e59819ed22734900d4d6e3 (patch) | |
| tree | 5ac7690306a0230b51e79afe5cfd3e6575b98cb1 /tools/perf/scripts/python/Perf-Trace-Util | |
| parent | 23caaf19b11eda7054348452e1618d4512a86907 (diff) | |
| parent | 6da7a2aa899f75116e1a62cef78c358ada9878b7 (diff) | |
Merge branch 'topic/misc' into topic/usb
Diffstat (limited to 'tools/perf/scripts/python/Perf-Trace-Util')
3 files changed, 204 insertions, 0 deletions
diff --git a/tools/perf/scripts/python/Perf-Trace-Util/Context.c b/tools/perf/scripts/python/Perf-Trace-Util/Context.c new file mode 100644 index 000000000000..957085dd5d8d --- /dev/null +++ b/tools/perf/scripts/python/Perf-Trace-Util/Context.c | |||
| @@ -0,0 +1,88 @@ | |||
| 1 | /* | ||
| 2 | * Context.c. Python interfaces for perf trace. | ||
| 3 | * | ||
| 4 | * Copyright (C) 2010 Tom Zanussi <tzanussi@gmail.com> | ||
| 5 | * | ||
| 6 | * This program is free software; you can redistribute it and/or modify | ||
| 7 | * it under the terms of the GNU General Public License as published by | ||
| 8 | * the Free Software Foundation; either version 2 of the License, or | ||
| 9 | * (at your option) any later version. | ||
| 10 | * | ||
| 11 | * This program is distributed in the hope that it will be useful, | ||
| 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 14 | * GNU General Public License for more details. | ||
| 15 | * | ||
| 16 | * You should have received a copy of the GNU General Public License | ||
| 17 | * along with this program; if not, write to the Free Software | ||
| 18 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
| 19 | * | ||
| 20 | */ | ||
| 21 | |||
| 22 | #include <Python.h> | ||
| 23 | #include "../../../perf.h" | ||
| 24 | #include "../../../util/trace-event.h" | ||
| 25 | |||
| 26 | PyMODINIT_FUNC initperf_trace_context(void); | ||
| 27 | |||
| 28 | static PyObject *perf_trace_context_common_pc(PyObject *self, PyObject *args) | ||
| 29 | { | ||
| 30 | static struct scripting_context *scripting_context; | ||
| 31 | PyObject *context; | ||
| 32 | int retval; | ||
| 33 | |||
| 34 | if (!PyArg_ParseTuple(args, "O", &context)) | ||
| 35 | return NULL; | ||
| 36 | |||
| 37 | scripting_context = PyCObject_AsVoidPtr(context); | ||
| 38 | retval = common_pc(scripting_context); | ||
| 39 | |||
| 40 | return Py_BuildValue("i", retval); | ||
| 41 | } | ||
| 42 | |||
| 43 | static PyObject *perf_trace_context_common_flags(PyObject *self, | ||
| 44 | PyObject *args) | ||
| 45 | { | ||
| 46 | static struct scripting_context *scripting_context; | ||
| 47 | PyObject *context; | ||
| 48 | int retval; | ||
| 49 | |||
| 50 | if (!PyArg_ParseTuple(args, "O", &context)) | ||
| 51 | return NULL; | ||
| 52 | |||
| 53 | scripting_context = PyCObject_AsVoidPtr(context); | ||
| 54 | retval = common_flags(scripting_context); | ||
| 55 | |||
| 56 | return Py_BuildValue("i", retval); | ||
| 57 | } | ||
| 58 | |||
| 59 | static PyObject *perf_trace_context_common_lock_depth(PyObject *self, | ||
| 60 | PyObject *args) | ||
| 61 | { | ||
| 62 | static struct scripting_context *scripting_context; | ||
| 63 | PyObject *context; | ||
| 64 | int retval; | ||
| 65 | |||
| 66 | if (!PyArg_ParseTuple(args, "O", &context)) | ||
| 67 | return NULL; | ||
| 68 | |||
| 69 | scripting_context = PyCObject_AsVoidPtr(context); | ||
| 70 | retval = common_lock_depth(scripting_context); | ||
| 71 | |||
| 72 | return Py_BuildValue("i", retval); | ||
| 73 | } | ||
| 74 | |||
| 75 | static PyMethodDef ContextMethods[] = { | ||
| 76 | { "common_pc", perf_trace_context_common_pc, METH_VARARGS, | ||
| 77 | "Get the common preempt count event field value."}, | ||
| 78 | { "common_flags", perf_trace_context_common_flags, METH_VARARGS, | ||
| 79 | "Get the common flags event field value."}, | ||
| 80 | { "common_lock_depth", perf_trace_context_common_lock_depth, | ||
| 81 | METH_VARARGS, "Get the common lock depth event field value."}, | ||
| 82 | { NULL, NULL, 0, NULL} | ||
| 83 | }; | ||
| 84 | |||
| 85 | PyMODINIT_FUNC initperf_trace_context(void) | ||
| 86 | { | ||
| 87 | (void) Py_InitModule("perf_trace_context", ContextMethods); | ||
| 88 | } | ||
diff --git a/tools/perf/scripts/python/Perf-Trace-Util/lib/Perf/Trace/Core.py b/tools/perf/scripts/python/Perf-Trace-Util/lib/Perf/Trace/Core.py new file mode 100644 index 000000000000..1dc464ee2ca8 --- /dev/null +++ b/tools/perf/scripts/python/Perf-Trace-Util/lib/Perf/Trace/Core.py | |||
| @@ -0,0 +1,91 @@ | |||
| 1 | # Core.py - Python extension for perf trace, core functions | ||
| 2 | # | ||
| 3 | # Copyright (C) 2010 by Tom Zanussi <tzanussi@gmail.com> | ||
| 4 | # | ||
| 5 | # This software may be distributed under the terms of the GNU General | ||
| 6 | # Public License ("GPL") version 2 as published by the Free Software | ||
| 7 | # Foundation. | ||
| 8 | |||
| 9 | from collections import defaultdict | ||
| 10 | |||
| 11 | def autodict(): | ||
| 12 | return defaultdict(autodict) | ||
| 13 | |||
| 14 | flag_fields = autodict() | ||
| 15 | symbolic_fields = autodict() | ||
| 16 | |||
| 17 | def define_flag_field(event_name, field_name, delim): | ||
| 18 | flag_fields[event_name][field_name]['delim'] = delim | ||
| 19 | |||
| 20 | def define_flag_value(event_name, field_name, value, field_str): | ||
| 21 | flag_fields[event_name][field_name]['values'][value] = field_str | ||
| 22 | |||
| 23 | def define_symbolic_field(event_name, field_name): | ||
| 24 | # nothing to do, really | ||
| 25 | pass | ||
| 26 | |||
| 27 | def define_symbolic_value(event_name, field_name, value, field_str): | ||
| 28 | symbolic_fields[event_name][field_name]['values'][value] = field_str | ||
| 29 | |||
| 30 | def flag_str(event_name, field_name, value): | ||
| 31 | string = "" | ||
| 32 | |||
| 33 | if flag_fields[event_name][field_name]: | ||
| 34 | print_delim = 0 | ||
| 35 | keys = flag_fields[event_name][field_name]['values'].keys() | ||
| 36 | keys.sort() | ||
| 37 | for idx in keys: | ||
| 38 | if not value and not idx: | ||
| 39 | string += flag_fields[event_name][field_name]['values'][idx] | ||
| 40 | break | ||
| 41 | if idx and (value & idx) == idx: | ||
| 42 | if print_delim and flag_fields[event_name][field_name]['delim']: | ||
| 43 | string += " " + flag_fields[event_name][field_name]['delim'] + " " | ||
| 44 | string += flag_fields[event_name][field_name]['values'][idx] | ||
| 45 | print_delim = 1 | ||
| 46 | value &= ~idx | ||
| 47 | |||
| 48 | return string | ||
| 49 | |||
| 50 | def symbol_str(event_name, field_name, value): | ||
| 51 | string = "" | ||
| 52 | |||
| 53 | if symbolic_fields[event_name][field_name]: | ||
| 54 | keys = symbolic_fields[event_name][field_name]['values'].keys() | ||
| 55 | keys.sort() | ||
| 56 | for idx in keys: | ||
| 57 | if not value and not idx: | ||
| 58 | string = symbolic_fields[event_name][field_name]['values'][idx] | ||
| 59 | break | ||
| 60 | if (value == idx): | ||
| 61 | string = symbolic_fields[event_name][field_name]['values'][idx] | ||
| 62 | break | ||
| 63 | |||
| 64 | return string | ||
| 65 | |||
| 66 | trace_flags = { 0x00: "NONE", \ | ||
| 67 | 0x01: "IRQS_OFF", \ | ||
| 68 | 0x02: "IRQS_NOSUPPORT", \ | ||
| 69 | 0x04: "NEED_RESCHED", \ | ||
| 70 | 0x08: "HARDIRQ", \ | ||
| 71 | 0x10: "SOFTIRQ" } | ||
| 72 | |||
| 73 | def trace_flag_str(value): | ||
| 74 | string = "" | ||
| 75 | print_delim = 0 | ||
| 76 | |||
| 77 | keys = trace_flags.keys() | ||
| 78 | |||
| 79 | for idx in keys: | ||
| 80 | if not value and not idx: | ||
| 81 | string += "NONE" | ||
| 82 | break | ||
| 83 | |||
| 84 | if idx and (value & idx) == idx: | ||
| 85 | if print_delim: | ||
| 86 | string += " | "; | ||
| 87 | string += trace_flags[idx] | ||
| 88 | print_delim = 1 | ||
| 89 | value &= ~idx | ||
| 90 | |||
| 91 | return string | ||
diff --git a/tools/perf/scripts/python/Perf-Trace-Util/lib/Perf/Trace/Util.py b/tools/perf/scripts/python/Perf-Trace-Util/lib/Perf/Trace/Util.py new file mode 100644 index 000000000000..83e91435ed09 --- /dev/null +++ b/tools/perf/scripts/python/Perf-Trace-Util/lib/Perf/Trace/Util.py | |||
| @@ -0,0 +1,25 @@ | |||
| 1 | # Util.py - Python extension for perf trace, miscellaneous utility code | ||
| 2 | # | ||
| 3 | # Copyright (C) 2010 by Tom Zanussi <tzanussi@gmail.com> | ||
| 4 | # | ||
| 5 | # This software may be distributed under the terms of the GNU General | ||
| 6 | # Public License ("GPL") version 2 as published by the Free Software | ||
| 7 | # Foundation. | ||
| 8 | |||
| 9 | NSECS_PER_SEC = 1000000000 | ||
| 10 | |||
| 11 | def avg(total, n): | ||
| 12 | return total / n | ||
| 13 | |||
| 14 | def nsecs(secs, nsecs): | ||
| 15 | return secs * NSECS_PER_SEC + nsecs | ||
| 16 | |||
| 17 | def nsecs_secs(nsecs): | ||
| 18 | return nsecs / NSECS_PER_SEC | ||
| 19 | |||
| 20 | def nsecs_nsecs(nsecs): | ||
| 21 | return nsecs % NSECS_PER_SEC | ||
| 22 | |||
| 23 | def nsecs_str(nsecs): | ||
| 24 | str = "%5u.%09u" % (nsecs_secs(nsecs), nsecs_nsecs(nsecs)), | ||
| 25 | return str | ||
