Commit c019879b authored by Arnaldo Carvalho de Melo's avatar Arnaldo Carvalho de Melo Committed by Ingo Molnar

perf session: Adopt the sample_type variable

All tools had copies, and perf diff would have to specify a
sample_type_check method just for copying it.
Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
Cc: Frédéric Weisbecker <fweisbec@gmail.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Paul Mackerras <paulus@samba.org>
LKML-Reference: <1260807780-19377-2-git-send-email-acme@infradead.org>
Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
parent a328626b
...@@ -20,8 +20,6 @@ typedef int (*sort_fn_t)(struct alloc_stat *, struct alloc_stat *); ...@@ -20,8 +20,6 @@ typedef int (*sort_fn_t)(struct alloc_stat *, struct alloc_stat *);
static char const *input_name = "perf.data"; static char const *input_name = "perf.data";
static u64 sample_type;
static int alloc_flag; static int alloc_flag;
static int caller_flag; static int caller_flag;
...@@ -321,7 +319,7 @@ static int process_sample_event(event_t *event, struct perf_session *session) ...@@ -321,7 +319,7 @@ static int process_sample_event(event_t *event, struct perf_session *session)
data.cpu = -1; data.cpu = -1;
data.period = 1; data.period = 1;
event__parse_sample(event, sample_type, &data); event__parse_sample(event, session->sample_type, &data);
dump_printf("(IP, %d): %d/%d: %p period: %Ld\n", dump_printf("(IP, %d): %d/%d: %p period: %Ld\n",
event->header.misc, event->header.misc,
...@@ -344,11 +342,9 @@ static int process_sample_event(event_t *event, struct perf_session *session) ...@@ -344,11 +342,9 @@ static int process_sample_event(event_t *event, struct perf_session *session)
return 0; return 0;
} }
static int sample_type_check(u64 type, struct perf_session *session __used) static int sample_type_check(struct perf_session *session)
{ {
sample_type = type; if (!(session->sample_type & PERF_SAMPLE_RAW)) {
if (!(sample_type & PERF_SAMPLE_RAW)) {
fprintf(stderr, fprintf(stderr,
"No trace sample to read. Did you call perf record " "No trace sample to read. Did you call perf record "
"without -R?"); "without -R?");
......
...@@ -52,8 +52,6 @@ static int exclude_other = 1; ...@@ -52,8 +52,6 @@ static int exclude_other = 1;
static char callchain_default_opt[] = "fractal,0.5"; static char callchain_default_opt[] = "fractal,0.5";
static u64 sample_type;
struct symbol_conf symbol_conf; struct symbol_conf symbol_conf;
...@@ -557,7 +555,7 @@ static int process_sample_event(event_t *event, struct perf_session *session) ...@@ -557,7 +555,7 @@ static int process_sample_event(event_t *event, struct perf_session *session)
memset(&data, 0, sizeof(data)); memset(&data, 0, sizeof(data));
data.period = 1; data.period = 1;
event__parse_sample(event, sample_type, &data); event__parse_sample(event, session->sample_type, &data);
dump_printf("(IP, %d): %d/%d: %p period: %Ld\n", dump_printf("(IP, %d): %d/%d: %p period: %Ld\n",
event->header.misc, event->header.misc,
...@@ -565,7 +563,7 @@ static int process_sample_event(event_t *event, struct perf_session *session) ...@@ -565,7 +563,7 @@ static int process_sample_event(event_t *event, struct perf_session *session)
(void *)(long)data.ip, (void *)(long)data.ip,
(long long)data.period); (long long)data.period);
if (sample_type & PERF_SAMPLE_CALLCHAIN) { if (session->sample_type & PERF_SAMPLE_CALLCHAIN) {
unsigned int i; unsigned int i;
dump_printf("... chain: nr:%Lu\n", data.callchain->nr); dump_printf("... chain: nr:%Lu\n", data.callchain->nr);
...@@ -664,11 +662,9 @@ static int process_read_event(event_t *event, struct perf_session *session __use ...@@ -664,11 +662,9 @@ static int process_read_event(event_t *event, struct perf_session *session __use
return 0; return 0;
} }
static int sample_type_check(u64 type, struct perf_session *session) static int sample_type_check(struct perf_session *session)
{ {
sample_type = type; if (!(session->sample_type & PERF_SAMPLE_CALLCHAIN)) {
if (!(sample_type & PERF_SAMPLE_CALLCHAIN)) {
if (sort__has_parent) { if (sort__has_parent) {
fprintf(stderr, "selected --sort parent, but no" fprintf(stderr, "selected --sort parent, but no"
" callchain data. Did you call" " callchain data. Did you call"
......
...@@ -21,8 +21,6 @@ ...@@ -21,8 +21,6 @@
static char const *input_name = "perf.data"; static char const *input_name = "perf.data";
static u64 sample_type;
static char default_sort_order[] = "avg, max, switch, runtime"; static char default_sort_order[] = "avg, max, switch, runtime";
static char *sort_order = default_sort_order; static char *sort_order = default_sort_order;
...@@ -1613,7 +1611,7 @@ static int process_sample_event(event_t *event, struct perf_session *session) ...@@ -1613,7 +1611,7 @@ static int process_sample_event(event_t *event, struct perf_session *session)
struct sample_data data; struct sample_data data;
struct thread *thread; struct thread *thread;
if (!(sample_type & PERF_SAMPLE_RAW)) if (!(session->sample_type & PERF_SAMPLE_RAW))
return 0; return 0;
memset(&data, 0, sizeof(data)); memset(&data, 0, sizeof(data));
...@@ -1621,7 +1619,7 @@ static int process_sample_event(event_t *event, struct perf_session *session) ...@@ -1621,7 +1619,7 @@ static int process_sample_event(event_t *event, struct perf_session *session)
data.cpu = -1; data.cpu = -1;
data.period = -1; data.period = -1;
event__parse_sample(event, sample_type, &data); event__parse_sample(event, session->sample_type, &data);
dump_printf("(IP, %d): %d/%d: %p period: %Ld\n", dump_printf("(IP, %d): %d/%d: %p period: %Ld\n",
event->header.misc, event->header.misc,
...@@ -1655,11 +1653,9 @@ static int process_lost_event(event_t *event __used, ...@@ -1655,11 +1653,9 @@ static int process_lost_event(event_t *event __used,
return 0; return 0;
} }
static int sample_type_check(u64 type, struct perf_session *session __used) static int sample_type_check(struct perf_session *session __used)
{ {
sample_type = type; if (!(session->sample_type & PERF_SAMPLE_RAW)) {
if (!(sample_type & PERF_SAMPLE_RAW)) {
fprintf(stderr, fprintf(stderr,
"No trace sample to read. Did you call perf record " "No trace sample to read. Did you call perf record "
"without -R?"); "without -R?");
......
...@@ -36,9 +36,6 @@ ...@@ -36,9 +36,6 @@
static char const *input_name = "perf.data"; static char const *input_name = "perf.data";
static char const *output_name = "output.svg"; static char const *output_name = "output.svg";
static u64 sample_type;
static unsigned int numcpus; static unsigned int numcpus;
static u64 min_freq; /* Lowest CPU frequency seen */ static u64 min_freq; /* Lowest CPU frequency seen */
static u64 max_freq; /* Highest CPU frequency seen */ static u64 max_freq; /* Highest CPU frequency seen */
...@@ -478,17 +475,16 @@ static void sched_switch(int cpu, u64 timestamp, struct trace_entry *te) ...@@ -478,17 +475,16 @@ static void sched_switch(int cpu, u64 timestamp, struct trace_entry *te)
} }
static int static int process_sample_event(event_t *event, struct perf_session *session)
process_sample_event(event_t *event)
{ {
struct sample_data data; struct sample_data data;
struct trace_entry *te; struct trace_entry *te;
memset(&data, 0, sizeof(data)); memset(&data, 0, sizeof(data));
event__parse_sample(event, sample_type, &data); event__parse_sample(event, session->sample_type, &data);
if (sample_type & PERF_SAMPLE_TIME) { if (session->sample_type & PERF_SAMPLE_TIME) {
if (!first_time || first_time > data.time) if (!first_time || first_time > data.time)
first_time = data.time; first_time = data.time;
if (last_time < data.time) if (last_time < data.time)
...@@ -496,7 +492,7 @@ process_sample_event(event_t *event) ...@@ -496,7 +492,7 @@ process_sample_event(event_t *event)
} }
te = (void *)data.raw_data; te = (void *)data.raw_data;
if (sample_type & PERF_SAMPLE_RAW && data.raw_size > 0) { if (session->sample_type & PERF_SAMPLE_RAW && data.raw_size > 0) {
char *event_str; char *event_str;
struct power_entry *pe; struct power_entry *pe;
...@@ -573,16 +569,16 @@ static void end_sample_processing(void) ...@@ -573,16 +569,16 @@ static void end_sample_processing(void)
} }
} }
static u64 sample_time(event_t *event) static u64 sample_time(event_t *event, const struct perf_session *session)
{ {
int cursor; int cursor;
cursor = 0; cursor = 0;
if (sample_type & PERF_SAMPLE_IP) if (session->sample_type & PERF_SAMPLE_IP)
cursor++; cursor++;
if (sample_type & PERF_SAMPLE_TID) if (session->sample_type & PERF_SAMPLE_TID)
cursor++; cursor++;
if (sample_type & PERF_SAMPLE_TIME) if (session->sample_type & PERF_SAMPLE_TIME)
return event->sample.array[cursor]; return event->sample.array[cursor];
return 0; return 0;
} }
...@@ -592,7 +588,7 @@ static u64 sample_time(event_t *event) ...@@ -592,7 +588,7 @@ static u64 sample_time(event_t *event)
* We first queue all events, sorted backwards by insertion. * We first queue all events, sorted backwards by insertion.
* The order will get flipped later. * The order will get flipped later.
*/ */
static int queue_sample_event(event_t *event, struct perf_session *session __used) static int queue_sample_event(event_t *event, struct perf_session *session)
{ {
struct sample_wrapper *copy, *prev; struct sample_wrapper *copy, *prev;
int size; int size;
...@@ -606,7 +602,7 @@ static int queue_sample_event(event_t *event, struct perf_session *session __use ...@@ -606,7 +602,7 @@ static int queue_sample_event(event_t *event, struct perf_session *session __use
memset(copy, 0, size); memset(copy, 0, size);
copy->next = NULL; copy->next = NULL;
copy->timestamp = sample_time(event); copy->timestamp = sample_time(event, session);
memcpy(&copy->data, event, event->sample.header.size); memcpy(&copy->data, event, event->sample.header.size);
...@@ -1018,7 +1014,7 @@ static void write_svg_file(const char *filename) ...@@ -1018,7 +1014,7 @@ static void write_svg_file(const char *filename)
svg_close(); svg_close();
} }
static void process_samples(void) static void process_samples(struct perf_session *session)
{ {
struct sample_wrapper *cursor; struct sample_wrapper *cursor;
event_t *event; event_t *event;
...@@ -1029,15 +1025,13 @@ static void process_samples(void) ...@@ -1029,15 +1025,13 @@ static void process_samples(void)
while (cursor) { while (cursor) {
event = (void *)&cursor->data; event = (void *)&cursor->data;
cursor = cursor->next; cursor = cursor->next;
process_sample_event(event); process_sample_event(event, session);
} }
} }
static int sample_type_check(u64 type, struct perf_session *session __used) static int sample_type_check(struct perf_session *session)
{ {
sample_type = type; if (!(session->sample_type & PERF_SAMPLE_RAW)) {
if (!(sample_type & PERF_SAMPLE_RAW)) {
fprintf(stderr, "No trace samples found in the file.\n" fprintf(stderr, "No trace samples found in the file.\n"
"Have you used 'perf timechart record' to record it?\n"); "Have you used 'perf timechart record' to record it?\n");
return -1; return -1;
...@@ -1067,7 +1061,7 @@ static int __cmd_timechart(void) ...@@ -1067,7 +1061,7 @@ static int __cmd_timechart(void)
if (ret) if (ret)
goto out_delete; goto out_delete;
process_samples(); process_samples(session);
end_sample_processing(); end_sample_processing();
......
...@@ -61,8 +61,6 @@ static int cleanup_scripting(void) ...@@ -61,8 +61,6 @@ static int cleanup_scripting(void)
static char const *input_name = "perf.data"; static char const *input_name = "perf.data";
static u64 sample_type;
static int process_sample_event(event_t *event, struct perf_session *session) static int process_sample_event(event_t *event, struct perf_session *session)
{ {
struct sample_data data; struct sample_data data;
...@@ -73,7 +71,7 @@ static int process_sample_event(event_t *event, struct perf_session *session) ...@@ -73,7 +71,7 @@ static int process_sample_event(event_t *event, struct perf_session *session)
data.cpu = -1; data.cpu = -1;
data.period = 1; data.period = 1;
event__parse_sample(event, sample_type, &data); event__parse_sample(event, session->sample_type, &data);
dump_printf("(IP, %d): %d/%d: %p period: %Ld\n", dump_printf("(IP, %d): %d/%d: %p period: %Ld\n",
event->header.misc, event->header.misc,
...@@ -88,7 +86,7 @@ static int process_sample_event(event_t *event, struct perf_session *session) ...@@ -88,7 +86,7 @@ static int process_sample_event(event_t *event, struct perf_session *session)
return -1; return -1;
} }
if (sample_type & PERF_SAMPLE_RAW) { if (session->sample_type & PERF_SAMPLE_RAW) {
/* /*
* FIXME: better resolve from pid from the struct trace_entry * FIXME: better resolve from pid from the struct trace_entry
* field, although it should be the same than this perf * field, although it should be the same than this perf
...@@ -103,11 +101,9 @@ static int process_sample_event(event_t *event, struct perf_session *session) ...@@ -103,11 +101,9 @@ static int process_sample_event(event_t *event, struct perf_session *session)
return 0; return 0;
} }
static int sample_type_check(u64 type, struct perf_session *session __used) static int sample_type_check(struct perf_session *session)
{ {
sample_type = type; if (!(session->sample_type & PERF_SAMPLE_RAW)) {
if (!(sample_type & PERF_SAMPLE_RAW)) {
fprintf(stderr, fprintf(stderr,
"No trace sample to read. Did you call perf record " "No trace sample to read. Did you call perf record "
"without -R?"); "without -R?");
......
...@@ -144,7 +144,6 @@ int perf_session__process_events(struct perf_session *self, ...@@ -144,7 +144,6 @@ int perf_session__process_events(struct perf_session *self,
unsigned long head, shift; unsigned long head, shift;
unsigned long offset = 0; unsigned long offset = 0;
size_t page_size; size_t page_size;
u64 sample_type;
event_t *event; event_t *event;
uint32_t size; uint32_t size;
char *buf; char *buf;
...@@ -157,11 +156,10 @@ int perf_session__process_events(struct perf_session *self, ...@@ -157,11 +156,10 @@ int perf_session__process_events(struct perf_session *self,
page_size = getpagesize(); page_size = getpagesize();
head = self->header.data_offset; head = self->header.data_offset;
sample_type = perf_header__sample_type(&self->header); self->sample_type = perf_header__sample_type(&self->header);
err = -EINVAL; err = -EINVAL;
if (ops->sample_type_check && if (ops->sample_type_check && ops->sample_type_check(self) < 0)
ops->sample_type_check(sample_type, self) < 0)
goto out_err; goto out_err;
if (!ops->full_paths) { if (!ops->full_paths) {
......
...@@ -19,6 +19,7 @@ struct perf_session { ...@@ -19,6 +19,7 @@ struct perf_session {
struct rb_root threads; struct rb_root threads;
struct thread *last_match; struct thread *last_match;
struct rb_root hists; struct rb_root hists;
u64 sample_type;
int fd; int fd;
int cwdlen; int cwdlen;
char *cwd; char *cwd;
...@@ -39,8 +40,7 @@ struct perf_event_ops { ...@@ -39,8 +40,7 @@ struct perf_event_ops {
event_op process_read_event; event_op process_read_event;
event_op process_throttle_event; event_op process_throttle_event;
event_op process_unthrottle_event; event_op process_unthrottle_event;
int (*sample_type_check)(u64 sample_type, int (*sample_type_check)(struct perf_session *session);
struct perf_session *session);
unsigned long total_unknown; unsigned long total_unknown;
bool full_paths; bool full_paths;
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment