diff options
author | Feng Tang <feng.tang@intel.com> | 2012-08-09 01:46:13 -0400 |
---|---|---|
committer | Arnaldo Carvalho de Melo <acme@redhat.com> | 2012-08-09 12:26:19 -0400 |
commit | 87b6a3ad40ba304ec468b972e979e7e410852476 (patch) | |
tree | bcd273478dd47106378b429e85a28d438d82a7e8 | |
parent | 0076d546b4f9b5c15121c6959d108a83fe43fa9a (diff) |
perf script python: Correct handler check and spelling errors
Correct the checking for handler returned by PyDict_GetItemString(),
also fix some spelling error and remove some data code in
event_analyzing_sample.py, as suggested by Namhyung Kim.
v2: restore back the wrongly removed trace_unhandled() func
Signed-off-by: Feng Tang <feng.tang@intel.com>
Acked-by: Namhyung Kim <namhyung@kernel.org>
Cc: Andi Kleen <andi@firstfloor.org>
Cc: David Ahern <dsahern@gmail.com>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Robert Richter <robert.richter@amd.com>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/r/20120809134613.067104c4@feng-i7
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
3 files changed, 18 insertions, 24 deletions
diff --git a/tools/perf/scripts/python/Perf-Trace-Util/lib/Perf/Trace/EventClass.py b/tools/perf/scripts/python/Perf-Trace-Util/lib/Perf/Trace/EventClass.py index 6372431188de..9e0985794e20 100755 --- a/tools/perf/scripts/python/Perf-Trace-Util/lib/Perf/Trace/EventClass.py +++ b/tools/perf/scripts/python/Perf-Trace-Util/lib/Perf/Trace/EventClass.py | |||
@@ -1,12 +1,12 @@ | |||
1 | # EventClass.py | 1 | # EventClass.py |
2 | # | 2 | # |
3 | # This is a libray defining some events typs classes, which could | 3 | # This is a library defining some events types classes, which could |
4 | # be used by other scripts to analyzing the perf samples. | 4 | # be used by other scripts to analyzing the perf samples. |
5 | # | 5 | # |
6 | # Currently there are just a few classes defined for examples, | 6 | # Currently there are just a few classes defined for examples, |
7 | # PerfEvent is the base class for all perf event sample, PebsEvent | 7 | # PerfEvent is the base class for all perf event sample, PebsEvent |
8 | # is a HW base Intel x86 PEBS event, and user could add more SW/HW | 8 | # is a HW base Intel x86 PEBS event, and user could add more SW/HW |
9 | # event classes based on requriements. | 9 | # event classes based on requirements. |
10 | 10 | ||
11 | import struct | 11 | import struct |
12 | 12 | ||
diff --git a/tools/perf/scripts/python/event_analyzing_sample.py b/tools/perf/scripts/python/event_analyzing_sample.py index 46f05aad6d07..163c39fa12d9 100644 --- a/tools/perf/scripts/python/event_analyzing_sample.py +++ b/tools/perf/scripts/python/event_analyzing_sample.py | |||
@@ -1,15 +1,15 @@ | |||
1 | # process_event.py: general event handler in python | 1 | # event_analyzing_sample.py: general event handler in python |
2 | # | 2 | # |
3 | # Current perf report is alreay very powerful with the anotation integrated, | 3 | # Current perf report is already very powerful with the annotation integrated, |
4 | # and this script is not trying to be as powerful as perf report, but | 4 | # and this script is not trying to be as powerful as perf report, but |
5 | # providing end user/developer a flexible way to analyze the events other | 5 | # providing end user/developer a flexible way to analyze the events other |
6 | # than trace points. | 6 | # than trace points. |
7 | # | 7 | # |
8 | # The 2 database related functions in this script just show how to gather | 8 | # The 2 database related functions in this script just show how to gather |
9 | # the basic information, and users can modify and write their own functions | 9 | # the basic information, and users can modify and write their own functions |
10 | # according to their specific requirment. | 10 | # according to their specific requirement. |
11 | # | 11 | # |
12 | # The first sample "show_general_events" just does a baisc grouping for all | 12 | # The first function "show_general_events" just does a basic grouping for all |
13 | # generic events with the help of sqlite, and the 2nd one "show_pebs_ll" is | 13 | # generic events with the help of sqlite, and the 2nd one "show_pebs_ll" is |
14 | # for a x86 HW PMU event: PEBS with load latency data. | 14 | # for a x86 HW PMU event: PEBS with load latency data. |
15 | # | 15 | # |
@@ -85,7 +85,7 @@ def process_event(param_dict): | |||
85 | else: | 85 | else: |
86 | symbol = "Unknown_symbol" | 86 | symbol = "Unknown_symbol" |
87 | 87 | ||
88 | # Creat the event object and insert it to the right table in database | 88 | # Create the event object and insert it to the right table in database |
89 | event = create_event(name, comm, dso, symbol, raw_buf) | 89 | event = create_event(name, comm, dso, symbol, raw_buf) |
90 | insert_db(event) | 90 | insert_db(event) |
91 | 91 | ||
@@ -109,7 +109,7 @@ def trace_end(): | |||
109 | 109 | ||
110 | # | 110 | # |
111 | # As the event number may be very big, so we can't use linear way | 111 | # As the event number may be very big, so we can't use linear way |
112 | # to show the histgram in real number, but use a log2 algorithm. | 112 | # to show the histogram in real number, but use a log2 algorithm. |
113 | # | 113 | # |
114 | 114 | ||
115 | def num2sym(num): | 115 | def num2sym(num): |
@@ -130,18 +130,18 @@ def show_general_events(): | |||
130 | 130 | ||
131 | # Group by thread | 131 | # Group by thread |
132 | commq = con.execute("select comm, count(comm) from gen_events group by comm order by -count(comm)") | 132 | commq = con.execute("select comm, count(comm) from gen_events group by comm order by -count(comm)") |
133 | print "\n%16s %8s %16s\n%s" % ("comm", "number", "histgram", "="*42) | 133 | print "\n%16s %8s %16s\n%s" % ("comm", "number", "histogram", "="*42) |
134 | for row in commq: | 134 | for row in commq: |
135 | print "%16s %8d %s" % (row[0], row[1], num2sym(row[1])) | 135 | print "%16s %8d %s" % (row[0], row[1], num2sym(row[1])) |
136 | 136 | ||
137 | # Group by symbol | 137 | # Group by symbol |
138 | print "\n%32s %8s %16s\n%s" % ("symbol", "number", "histgram", "="*58) | 138 | print "\n%32s %8s %16s\n%s" % ("symbol", "number", "histogram", "="*58) |
139 | symbolq = con.execute("select symbol, count(symbol) from gen_events group by symbol order by -count(symbol)") | 139 | symbolq = con.execute("select symbol, count(symbol) from gen_events group by symbol order by -count(symbol)") |
140 | for row in symbolq: | 140 | for row in symbolq: |
141 | print "%32s %8d %s" % (row[0], row[1], num2sym(row[1])) | 141 | print "%32s %8d %s" % (row[0], row[1], num2sym(row[1])) |
142 | 142 | ||
143 | # Group by dso | 143 | # Group by dso |
144 | print "\n%40s %8s %16s\n%s" % ("dso", "number", "histgram", "="*74) | 144 | print "\n%40s %8s %16s\n%s" % ("dso", "number", "histogram", "="*74) |
145 | dsoq = con.execute("select dso, count(dso) from gen_events group by dso order by -count(dso)") | 145 | dsoq = con.execute("select dso, count(dso) from gen_events group by dso order by -count(dso)") |
146 | for row in dsoq: | 146 | for row in dsoq: |
147 | print "%40s %8d %s" % (row[0], row[1], num2sym(row[1])) | 147 | print "%40s %8d %s" % (row[0], row[1], num2sym(row[1])) |
@@ -163,31 +163,27 @@ def show_pebs_ll(): | |||
163 | 163 | ||
164 | # Group by thread | 164 | # Group by thread |
165 | commq = con.execute("select comm, count(comm) from pebs_ll group by comm order by -count(comm)") | 165 | commq = con.execute("select comm, count(comm) from pebs_ll group by comm order by -count(comm)") |
166 | print "\n%16s %8s %16s\n%s" % ("comm", "number", "histgram", "="*42) | 166 | print "\n%16s %8s %16s\n%s" % ("comm", "number", "histogram", "="*42) |
167 | for row in commq: | 167 | for row in commq: |
168 | print "%16s %8d %s" % (row[0], row[1], num2sym(row[1])) | 168 | print "%16s %8d %s" % (row[0], row[1], num2sym(row[1])) |
169 | 169 | ||
170 | # Group by symbol | 170 | # Group by symbol |
171 | print "\n%32s %8s %16s\n%s" % ("symbol", "number", "histgram", "="*58) | 171 | print "\n%32s %8s %16s\n%s" % ("symbol", "number", "histogram", "="*58) |
172 | symbolq = con.execute("select symbol, count(symbol) from pebs_ll group by symbol order by -count(symbol)") | 172 | symbolq = con.execute("select symbol, count(symbol) from pebs_ll group by symbol order by -count(symbol)") |
173 | for row in symbolq: | 173 | for row in symbolq: |
174 | print "%32s %8d %s" % (row[0], row[1], num2sym(row[1])) | 174 | print "%32s %8d %s" % (row[0], row[1], num2sym(row[1])) |
175 | 175 | ||
176 | # Group by dse | 176 | # Group by dse |
177 | dseq = con.execute("select dse, count(dse) from pebs_ll group by dse order by -count(dse)") | 177 | dseq = con.execute("select dse, count(dse) from pebs_ll group by dse order by -count(dse)") |
178 | print "\n%32s %8s %16s\n%s" % ("dse", "number", "histgram", "="*58) | 178 | print "\n%32s %8s %16s\n%s" % ("dse", "number", "histogram", "="*58) |
179 | for row in dseq: | 179 | for row in dseq: |
180 | print "%32s %8d %s" % (row[0], row[1], num2sym(row[1])) | 180 | print "%32s %8d %s" % (row[0], row[1], num2sym(row[1])) |
181 | 181 | ||
182 | # Group by latency | 182 | # Group by latency |
183 | latq = con.execute("select lat, count(lat) from pebs_ll group by lat order by lat") | 183 | latq = con.execute("select lat, count(lat) from pebs_ll group by lat order by lat") |
184 | print "\n%32s %8s %16s\n%s" % ("latency", "number", "histgram", "="*58) | 184 | print "\n%32s %8s %16s\n%s" % ("latency", "number", "histogram", "="*58) |
185 | for row in latq: | 185 | for row in latq: |
186 | print "%32s %8d %s" % (row[0], row[1], num2sym(row[1])) | 186 | print "%32s %8d %s" % (row[0], row[1], num2sym(row[1])) |
187 | 187 | ||
188 | def trace_unhandled(event_name, context, event_fields_dict): | 188 | def trace_unhandled(event_name, context, event_fields_dict): |
189 | print ' '.join(['%s=%s'%(k,str(v))for k,v in sorted(event_fields_dict.items())]) | 189 | print ' '.join(['%s=%s'%(k,str(v))for k,v in sorted(event_fields_dict.items())]) |
190 | |||
191 | def print_header(event_name, cpu, secs, nsecs, pid, comm): | ||
192 | print "%-20s %5u %05u.%09u %8u %-20s " % \ | ||
193 | (event_name, cpu, secs, nsecs, pid, comm), | ||
diff --git a/tools/perf/util/scripting-engines/trace-event-python.c b/tools/perf/util/scripting-engines/trace-event-python.c index 7e3f57656c55..afba09729183 100644 --- a/tools/perf/util/scripting-engines/trace-event-python.c +++ b/tools/perf/util/scripting-engines/trace-event-python.c | |||
@@ -343,7 +343,7 @@ static void python_process_general_event(union perf_event *perf_event __unused, | |||
343 | struct perf_sample *sample, | 343 | struct perf_sample *sample, |
344 | struct perf_evsel *evsel, | 344 | struct perf_evsel *evsel, |
345 | struct machine *machine __unused, | 345 | struct machine *machine __unused, |
346 | struct addr_location *al __unused) | 346 | struct addr_location *al) |
347 | { | 347 | { |
348 | PyObject *handler, *retval, *t, *dict; | 348 | PyObject *handler, *retval, *t, *dict; |
349 | static char handler_name[64]; | 349 | static char handler_name[64]; |
@@ -352,7 +352,7 @@ static void python_process_general_event(union perf_event *perf_event __unused, | |||
352 | 352 | ||
353 | /* | 353 | /* |
354 | * Use the MAX_FIELDS to make the function expandable, though | 354 | * Use the MAX_FIELDS to make the function expandable, though |
355 | * currently there is only one itme for the tuple. | 355 | * currently there is only one item for the tuple. |
356 | */ | 356 | */ |
357 | t = PyTuple_New(MAX_FIELDS); | 357 | t = PyTuple_New(MAX_FIELDS); |
358 | if (!t) | 358 | if (!t) |
@@ -365,10 +365,8 @@ static void python_process_general_event(union perf_event *perf_event __unused, | |||
365 | snprintf(handler_name, sizeof(handler_name), "%s", "process_event"); | 365 | snprintf(handler_name, sizeof(handler_name), "%s", "process_event"); |
366 | 366 | ||
367 | handler = PyDict_GetItemString(main_dict, handler_name); | 367 | handler = PyDict_GetItemString(main_dict, handler_name); |
368 | if (handler && !PyCallable_Check(handler)) { | 368 | if (!handler || !PyCallable_Check(handler)) |
369 | handler = NULL; | ||
370 | goto exit; | 369 | goto exit; |
371 | } | ||
372 | 370 | ||
373 | PyDict_SetItemString(dict, "ev_name", PyString_FromString(perf_evsel__name(evsel))); | 371 | PyDict_SetItemString(dict, "ev_name", PyString_FromString(perf_evsel__name(evsel))); |
374 | PyDict_SetItemString(dict, "attr", PyString_FromStringAndSize( | 372 | PyDict_SetItemString(dict, "attr", PyString_FromStringAndSize( |