History

perf/scripts: Add Python scripting engine

Add base support for Python scripting to perf trace.

Tom Zanussi committed 16 years ago

Commit 7e4b21b1 parent 266fe2f8 files · +864 −0Browse files

Showing the changes to tools/perf/scripts/python (3 of 8 files). Show all

Unified · Split

3 files
  1. tools/perf/scripts/python/Perf-Trace-Util/Context.c +88 −0
  2. tools/perf/scripts/python/Perf-Trace-Util/lib/Perf/Trace/Core.py +91 −0
  3. tools/perf/scripts/python/Perf-Trace-Util/lib/Perf/Trace/Util.py +25 −0
tools/perf/scripts/python/Perf-Trace-Util/Context.c+88−0
@@ -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+}
tools/perf/scripts/python/Perf-Trace-Util/lib/Perf/Trace/Core.py+91−0
@@ -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
tools/perf/scripts/python/Perf-Trace-Util/lib/Perf/Trace/Util.py+25−0
@@ -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