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:
Arnaldo Carvalho de Melo 2012-06-27 13:08:42 -03:00
parent 7a25b2d32b
commit da3789628f
15 changed files with 314 additions and 182 deletions

View file

@ -32,29 +32,25 @@ int header_page_size_size;
int header_page_ts_size;
int header_page_data_offset;
struct pevent *perf_pevent;
static struct pevent *pevent;
bool latency_format;
int read_trace_init(int file_bigendian, int host_bigendian)
struct pevent *read_trace_init(int file_bigendian, int host_bigendian)
{
if (pevent)
return 0;
struct pevent *pevent = pevent_alloc();
perf_pevent = pevent_alloc();
pevent = perf_pevent;
if (pevent != NULL) {
pevent_set_flag(pevent, PEVENT_NSEC_OUTPUT);
pevent_set_file_bigendian(pevent, file_bigendian);
pevent_set_host_bigendian(pevent, host_bigendian);
}
pevent_set_flag(pevent, PEVENT_NSEC_OUTPUT);
pevent_set_file_bigendian(pevent, file_bigendian);
pevent_set_host_bigendian(pevent, host_bigendian);
return 0;
return pevent;
}
static int get_common_field(struct scripting_context *context,
int *offset, int *size, const char *type)
{
struct pevent *pevent = context->pevent;
struct event_format *event;
struct format_field *field;
@ -150,7 +146,7 @@ void *raw_field_ptr(struct event_format *event, const char *name, void *data)
return data + field->offset;
}
int trace_parse_common_type(void *data)
int trace_parse_common_type(struct pevent *pevent, void *data)
{
struct pevent_record record;
@ -158,7 +154,7 @@ int trace_parse_common_type(void *data)
return pevent_data_type(pevent, &record);
}
int trace_parse_common_pid(void *data)
int trace_parse_common_pid(struct pevent *pevent, void *data)
{
struct pevent_record record;
@ -166,27 +162,21 @@ int trace_parse_common_pid(void *data)
return pevent_data_pid(pevent, &record);
}
unsigned long long read_size(void *ptr, int size)
unsigned long long read_size(struct pevent *pevent, void *ptr, int size)
{
return pevent_read_number(pevent, ptr, size);
}
struct event_format *trace_find_event(int type)
{
return pevent_find_event(pevent, type);
}
void print_trace_event(int cpu, void *data, int size)
void print_trace_event(struct pevent *pevent, int cpu, void *data, int size)
{
struct event_format *event;
struct pevent_record record;
struct trace_seq s;
int type;
type = trace_parse_common_type(data);
type = trace_parse_common_type(pevent, data);
event = trace_find_event(type);
event = pevent_find_event(pevent, type);
if (!event) {
warning("ug! no event found for type %d", type);
return;
@ -203,8 +193,8 @@ void print_trace_event(int cpu, void *data, int size)
printf("\n");
}
void print_event(int cpu, void *data, int size, unsigned long long nsecs,
char *comm)
void print_event(struct pevent *pevent, int cpu, void *data, int size,
unsigned long long nsecs, char *comm)
{
struct pevent_record record;
struct trace_seq s;
@ -227,7 +217,8 @@ void print_event(int cpu, void *data, int size, unsigned long long nsecs,
printf("\n");
}
void parse_proc_kallsyms(char *file, unsigned int size __unused)
void parse_proc_kallsyms(struct pevent *pevent,
char *file, unsigned int size __unused)
{
unsigned long long addr;
char *func;
@ -258,7 +249,8 @@ void parse_proc_kallsyms(char *file, unsigned int size __unused)
}
}
void parse_ftrace_printk(char *file, unsigned int size __unused)
void parse_ftrace_printk(struct pevent *pevent,
char *file, unsigned int size __unused)
{
unsigned long long addr;
char *printk;
@ -282,17 +274,19 @@ void parse_ftrace_printk(char *file, unsigned int size __unused)
}
}
int parse_ftrace_file(char *buf, unsigned long size)
int parse_ftrace_file(struct pevent *pevent, char *buf, unsigned long size)
{
return pevent_parse_event(pevent, buf, size, "ftrace");
}
int parse_event_file(char *buf, unsigned long size, char *sys)
int parse_event_file(struct pevent *pevent,
char *buf, unsigned long size, char *sys)
{
return pevent_parse_event(pevent, buf, size, sys);
}
struct event_format *trace_find_next_event(struct event_format *event)
struct event_format *trace_find_next_event(struct pevent *pevent,
struct event_format *event)
{
static int idx;