diff options
| author | Tom Zanussi <tzanussi@gmail.com> | 2010-01-27 03:27:57 -0500 |
|---|---|---|
| committer | Frederic Weisbecker <fweisbec@gmail.com> | 2010-02-24 22:07:29 -0500 |
| commit | 7e4b21b84c43bb8a80b916e40718ca4ed1fc52e6 (patch) | |
| tree | cafeb2a119cfa4aad3252f8d9ad164b276153f3e /tools/perf/scripts/python/Perf-Trace-Util/lib | |
| parent | 266fe2f217d1dc9f8041e395c0ab4569a5bad91a (diff) | |
perf/scripts: Add Python scripting engine
Add base support for Python scripting to perf trace.
Signed-off-by: Tom Zanussi <tzanussi@gmail.com>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: Keiichi KII <k-keiichi@bx.jp.nec.com>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
LKML-Reference: <1264580883-15324-6-git-send-email-tzanussi@gmail.com>
Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com>
Diffstat (limited to 'tools/perf/scripts/python/Perf-Trace-Util/lib')
| -rw-r--r-- | tools/perf/scripts/python/Perf-Trace-Util/lib/Perf/Trace/Core.py | 91 | ||||
| -rw-r--r-- | tools/perf/scripts/python/Perf-Trace-Util/lib/Perf/Trace/Util.py | 25 |
2 files changed, 116 insertions, 0 deletions
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 | ||
