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: Arnaldo 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: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
parent
a328626b61
commit
c019879bcc
@ -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)
|
|||||||
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)
|
|||||||
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;
|
|||||||
|
|
||||||
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)
|
|||||||
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)
|
|||||||
(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
|
|||||||
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 @@
|
|||||||
|
|
||||||
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)
|
|||||||
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)
|
|||||||
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,
|
|||||||
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 @@
|
|||||||
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)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
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)
|
|||||||
}
|
}
|
||||||
|
|
||||||
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)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
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)
|
|||||||
* 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
|
|||||||
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(©->data, event, event->sample.header.size);
|
memcpy(©->data, event, event->sample.header.size);
|
||||||
|
|
||||||
@ -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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
|
|
||||||
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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
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,
|
|||||||
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,
|
|||||||
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 {
|
|||||||
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 {
|
|||||||
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;
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user