perf tools: Stop using a global trace events description list
The pevent thing is per perf.data file, so I made it stop being static and become a perf_session member, so tools processing perf.data files use perf_session and _there_ we read the trace events description into session->pevent and then change everywhere to stop using that single global pevent variable and use the per session one. Note that it _doesn't_ fall backs to trace__event_id, as we're not interested at all in what is present in the /sys/kernel/debug/tracing/events in the workstation doing the analysis, just in what is in the perf.data file. This patch also introduces perf_session__set_tracepoints_handlers that is the perf perf.data/session way to associate handlers to tracepoint events by resolving their IDs using the events descriptions stored in a perf.data file. Make 'perf sched' use it. Reported-by: Dmitry Antipov <dmitry.antipov@linaro.org> Tested-by: Dmitry Antipov <dmitry.antipov@linaro.org> Cc: Frederic Weisbecker <fweisbec@gmail.com> Cc: Namhyung Kim <namhyung@gmail.com> Cc: Paul Mackerras <paulus@samba.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: linaro-dev@lists.linaro.org Cc: patches@linaro.org Link: http://lkml.kernel.org/r/20120625232016.GA28525@infradead.org Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
@@ -233,7 +233,8 @@ static void define_event_symbols(struct event_format *event,
|
||||
define_event_symbols(event, ev_name, args->next);
|
||||
}
|
||||
|
||||
static inline struct event_format *find_cache_event(int type)
|
||||
static inline
|
||||
struct event_format *find_cache_event(struct pevent *pevent, int type)
|
||||
{
|
||||
static char ev_name[256];
|
||||
struct event_format *event;
|
||||
@@ -241,7 +242,7 @@ static inline struct event_format *find_cache_event(int type)
|
||||
if (events[type])
|
||||
return events[type];
|
||||
|
||||
events[type] = event = trace_find_event(type);
|
||||
events[type] = event = pevent_find_event(pevent, type);
|
||||
if (!event)
|
||||
return NULL;
|
||||
|
||||
@@ -252,7 +253,8 @@ static inline struct event_format *find_cache_event(int type)
|
||||
return event;
|
||||
}
|
||||
|
||||
static void perl_process_tracepoint(union perf_event *pevent __unused,
|
||||
static void perl_process_tracepoint(union perf_event *perf_event __unused,
|
||||
struct pevent *pevent,
|
||||
struct perf_sample *sample,
|
||||
struct perf_evsel *evsel,
|
||||
struct machine *machine __unused,
|
||||
@@ -275,13 +277,13 @@ static void perl_process_tracepoint(union perf_event *pevent __unused,
|
||||
if (evsel->attr.type != PERF_TYPE_TRACEPOINT)
|
||||
return;
|
||||
|
||||
type = trace_parse_common_type(data);
|
||||
type = trace_parse_common_type(pevent, data);
|
||||
|
||||
event = find_cache_event(type);
|
||||
event = find_cache_event(pevent, type);
|
||||
if (!event)
|
||||
die("ug! no event found for type %d", type);
|
||||
|
||||
pid = trace_parse_common_pid(data);
|
||||
pid = trace_parse_common_pid(pevent, data);
|
||||
|
||||
sprintf(handler, "%s::%s", event->system, event->name);
|
||||
|
||||
@@ -314,7 +316,8 @@ static void perl_process_tracepoint(union perf_event *pevent __unused,
|
||||
offset = field->offset;
|
||||
XPUSHs(sv_2mortal(newSVpv((char *)data + offset, 0)));
|
||||
} else { /* FIELD_IS_NUMERIC */
|
||||
val = read_size(data + field->offset, field->size);
|
||||
val = read_size(pevent, data + field->offset,
|
||||
field->size);
|
||||
if (field->flags & FIELD_IS_SIGNED) {
|
||||
XPUSHs(sv_2mortal(newSViv(val)));
|
||||
} else {
|
||||
@@ -368,14 +371,15 @@ static void perl_process_event_generic(union perf_event *pevent __unused,
|
||||
LEAVE;
|
||||
}
|
||||
|
||||
static void perl_process_event(union perf_event *pevent,
|
||||
static void perl_process_event(union perf_event *event,
|
||||
struct pevent *pevent,
|
||||
struct perf_sample *sample,
|
||||
struct perf_evsel *evsel,
|
||||
struct machine *machine,
|
||||
struct thread *thread)
|
||||
{
|
||||
perl_process_tracepoint(pevent, sample, evsel, machine, thread);
|
||||
perl_process_event_generic(pevent, sample, evsel, machine, thread);
|
||||
perl_process_tracepoint(event, pevent, sample, evsel, machine, thread);
|
||||
perl_process_event_generic(event, sample, evsel, machine, thread);
|
||||
}
|
||||
|
||||
static void run_start_sub(void)
|
||||
@@ -448,7 +452,7 @@ static int perl_stop_script(void)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int perl_generate_script(const char *outfile)
|
||||
static int perl_generate_script(struct pevent *pevent, const char *outfile)
|
||||
{
|
||||
struct event_format *event = NULL;
|
||||
struct format_field *f;
|
||||
@@ -495,7 +499,7 @@ static int perl_generate_script(const char *outfile)
|
||||
fprintf(ofp, "sub trace_begin\n{\n\t# optional\n}\n\n");
|
||||
fprintf(ofp, "sub trace_end\n{\n\t# optional\n}\n\n");
|
||||
|
||||
while ((event = trace_find_next_event(event))) {
|
||||
while ((event = trace_find_next_event(pevent, event))) {
|
||||
fprintf(ofp, "sub %s::%s\n{\n", event->system, event->name);
|
||||
fprintf(ofp, "\tmy (");
|
||||
|
||||
|
Reference in New Issue
Block a user