aboutsummaryrefslogtreecommitdiffstats
path: root/tools/perf/util/scripting-engines/trace-event-python.c
diff options
context:
space:
mode:
authorJiri Olsa <jolsa@kernel.org>2014-10-26 18:44:05 -0400
committerArnaldo Carvalho de Melo <acme@redhat.com>2014-11-06 15:44:06 -0500
commitadf5bcf39583c4db1bf30069f8957400e61ccb18 (patch)
treeecebfc2cdf1d556df36dbe87662b96e56d001dd7 /tools/perf/util/scripting-engines/trace-event-python.c
parentcdae2d1e936457bf72673cb77e7f5f4b9d4c451e (diff)
perf script python: Removing event cache as it's no longer needed
We don't need to maintain cache of 'struct event_format' objects. Currently the 'struct perf_evsel' holds this reference already. Adding events_defined bitmap to keep track of defined events, which is much cheaper than array of pointers. Signed-off-by: Jiri Olsa <jolsa@kernel.org> Acked-by: Namhyung Kim <namhyung@gmail.com> Cc: Adrian Hunter <adrian.hunter@intel.com> Cc: David Ahern <dsahern@gmail.com> Cc: Frederic Weisbecker <fweisbec@gmail.com> Cc: Ingo Molnar <mingo@redhat.com> Cc: Namhyung Kim <namhyung@gmail.com> Cc: Paul Mackerras <paulus@samba.org> Cc: Peter Zijlstra <peterz@infradead.org> Link: http://lkml.kernel.org/r/1414363445-22370-3-git-send-email-jolsa@kernel.org Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Diffstat (limited to 'tools/perf/util/scripting-engines/trace-event-python.c')
-rw-r--r--tools/perf/util/scripting-engines/trace-event-python.c34
1 files changed, 6 insertions, 28 deletions
diff --git a/tools/perf/util/scripting-engines/trace-event-python.c b/tools/perf/util/scripting-engines/trace-event-python.c
index 118bc62850a8..d808a328f4dc 100644
--- a/tools/perf/util/scripting-engines/trace-event-python.c
+++ b/tools/perf/util/scripting-engines/trace-event-python.c
@@ -26,6 +26,7 @@
26#include <string.h> 26#include <string.h>
27#include <stdbool.h> 27#include <stdbool.h>
28#include <errno.h> 28#include <errno.h>
29#include <linux/bitmap.h>
29 30
30#include "../../perf.h" 31#include "../../perf.h"
31#include "../debug.h" 32#include "../debug.h"
@@ -46,7 +47,7 @@ PyMODINIT_FUNC initperf_trace_context(void);
46#define FTRACE_MAX_EVENT \ 47#define FTRACE_MAX_EVENT \
47 ((1 << (sizeof(unsigned short) * 8)) - 1) 48 ((1 << (sizeof(unsigned short) * 8)) - 1)
48 49
49struct event_format *events[FTRACE_MAX_EVENT]; 50static DECLARE_BITMAP(events_defined, FTRACE_MAX_EVENT);
50 51
51#define MAX_FIELDS 64 52#define MAX_FIELDS 64
52#define N_COMMON_FIELDS 7 53#define N_COMMON_FIELDS 7
@@ -255,31 +256,6 @@ static void define_event_symbols(struct event_format *event,
255 define_event_symbols(event, ev_name, args->next); 256 define_event_symbols(event, ev_name, args->next);
256} 257}
257 258
258static inline struct event_format *find_cache_event(struct perf_evsel *evsel)
259{
260 static char ev_name[256];
261 struct event_format *event;
262 int type = evsel->attr.config;
263
264 /*
265 * XXX: Do we really need to cache this since now we have evsel->tp_format
266 * cached already? Need to re-read this "cache" routine that as well calls
267 * define_event_symbols() :-\
268 */
269 if (events[type])
270 return events[type];
271
272 events[type] = event = evsel->tp_format;
273 if (!event)
274 return NULL;
275
276 sprintf(ev_name, "%s__%s", event->system, event->name);
277
278 define_event_symbols(event, ev_name, event->print_fmt.args);
279
280 return event;
281}
282
283static PyObject *get_field_numeric_entry(struct event_format *event, 259static PyObject *get_field_numeric_entry(struct event_format *event,
284 struct format_field *field, void *data) 260 struct format_field *field, void *data)
285{ 261{
@@ -403,12 +379,12 @@ static void python_process_tracepoint(struct perf_sample *sample,
403 struct thread *thread, 379 struct thread *thread,
404 struct addr_location *al) 380 struct addr_location *al)
405{ 381{
382 struct event_format *event = evsel->tp_format;
406 PyObject *handler, *context, *t, *obj, *callchain; 383 PyObject *handler, *context, *t, *obj, *callchain;
407 PyObject *dict = NULL; 384 PyObject *dict = NULL;
408 static char handler_name[256]; 385 static char handler_name[256];
409 struct format_field *field; 386 struct format_field *field;
410 unsigned long s, ns; 387 unsigned long s, ns;
411 struct event_format *event;
412 unsigned n = 0; 388 unsigned n = 0;
413 int pid; 389 int pid;
414 int cpu = sample->cpu; 390 int cpu = sample->cpu;
@@ -420,7 +396,6 @@ static void python_process_tracepoint(struct perf_sample *sample,
420 if (!t) 396 if (!t)
421 Py_FatalError("couldn't create Python tuple"); 397 Py_FatalError("couldn't create Python tuple");
422 398
423 event = find_cache_event(evsel);
424 if (!event) 399 if (!event)
425 die("ug! no event found for type %d", (int)evsel->attr.config); 400 die("ug! no event found for type %d", (int)evsel->attr.config);
426 401
@@ -428,6 +403,9 @@ static void python_process_tracepoint(struct perf_sample *sample,
428 403
429 sprintf(handler_name, "%s__%s", event->system, event->name); 404 sprintf(handler_name, "%s__%s", event->system, event->name);
430 405
406 if (!test_and_set_bit(event->id, events_defined))
407 define_event_symbols(event, handler_name, event->print_fmt.args);
408
431 handler = get_handler(handler_name); 409 handler = get_handler(handler_name);
432 if (!handler) { 410 if (!handler) {
433 dict = PyDict_New(); 411 dict = PyDict_New();