perf tools: Make event__preprocess_sample parse the sample

Simplifying the tools that were using both in sequence and allowing
upcoming simplifications, such as Arun's patch to sort by cpus.

Cc: David S. Miller <davem@davemloft.net>
Cc: Frédéric Weisbecker <fweisbec@gmail.com>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Cc: Tom Zanussi <tzanussi@gmail.com>
LKML-Reference: <new-submission>
Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent 45d8e802
...@@ -61,11 +61,9 @@ static int hists__add_entry(struct hists *self, struct addr_location *al) ...@@ -61,11 +61,9 @@ static int hists__add_entry(struct hists *self, struct addr_location *al)
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 addr_location al; struct addr_location al;
struct sample_data data;
dump_printf("(IP, %d): %d: %#Lx\n", event->header.misc, if (event__preprocess_sample(event, session, &al, &data, NULL) < 0) {
event->ip.pid, event->ip.ip);
if (event__preprocess_sample(event, session, &al, NULL) < 0) {
pr_warning("problem processing %d event, skipping it.\n", pr_warning("problem processing %d event, skipping it.\n",
event->header.type); event->header.type);
return -1; return -1;
......
...@@ -35,10 +35,7 @@ static int diff__process_sample_event(event_t *event, struct perf_session *sessi ...@@ -35,10 +35,7 @@ static int diff__process_sample_event(event_t *event, struct perf_session *sessi
struct addr_location al; struct addr_location al;
struct sample_data data = { .period = 1, }; struct sample_data data = { .period = 1, };
dump_printf("(IP, %d): %d: %#Lx\n", event->header.misc, if (event__preprocess_sample(event, session, &al, &data, NULL) < 0) {
event->ip.pid, event->ip.ip);
if (event__preprocess_sample(event, session, &al, NULL) < 0) {
pr_warning("problem processing %d event, skipping it.\n", pr_warning("problem processing %d event, skipping it.\n",
event->header.type); event->header.type);
return -1; return -1;
...@@ -47,8 +44,6 @@ static int diff__process_sample_event(event_t *event, struct perf_session *sessi ...@@ -47,8 +44,6 @@ static int diff__process_sample_event(event_t *event, struct perf_session *sessi
if (al.filtered || al.sym == NULL) if (al.filtered || al.sym == NULL)
return 0; return 0;
event__parse_sample(event, session->sample_type, &data);
if (hists__add_entry(&session->hists, &al, data.period)) { if (hists__add_entry(&session->hists, &al, data.period)) {
pr_warning("problem incrementing symbol period, skipping event\n"); pr_warning("problem incrementing symbol period, skipping event\n");
return -1; return -1;
......
...@@ -155,31 +155,7 @@ static int process_sample_event(event_t *event, struct perf_session *session) ...@@ -155,31 +155,7 @@ static int process_sample_event(event_t *event, struct perf_session *session)
struct addr_location al; struct addr_location al;
struct perf_event_attr *attr; struct perf_event_attr *attr;
event__parse_sample(event, session->sample_type, &data); if (event__preprocess_sample(event, session, &al, &data, NULL) < 0) {
dump_printf("(IP, %d): %d/%d: %#Lx period: %Ld cpu:%d\n",
event->header.misc, data.pid, data.tid, data.ip,
data.period, data.cpu);
if (session->sample_type & PERF_SAMPLE_CALLCHAIN) {
unsigned int i;
dump_printf("... chain: nr:%Lu\n", data.callchain->nr);
if (!ip_callchain__valid(data.callchain, event)) {
pr_debug("call-chain problem with event, "
"skipping it.\n");
return 0;
}
if (dump_trace) {
for (i = 0; i < data.callchain->nr; i++)
dump_printf("..... %2d: %016Lx\n",
i, data.callchain->ips[i]);
}
}
if (event__preprocess_sample(event, session, &al, NULL) < 0) {
fprintf(stderr, "problem processing %d event, skipping it.\n", fprintf(stderr, "problem processing %d event, skipping it.\n",
event->header.type); event->header.type);
return -1; return -1;
......
...@@ -983,6 +983,7 @@ static void event__process_sample(const event_t *self, ...@@ -983,6 +983,7 @@ static void event__process_sample(const event_t *self,
u64 ip = self->ip.ip; u64 ip = self->ip.ip;
struct sym_entry *syme; struct sym_entry *syme;
struct addr_location al; struct addr_location al;
struct sample_data data;
struct machine *machine; struct machine *machine;
u8 origin = self->header.misc & PERF_RECORD_MISC_CPUMODE_MASK; u8 origin = self->header.misc & PERF_RECORD_MISC_CPUMODE_MASK;
...@@ -1025,7 +1026,8 @@ static void event__process_sample(const event_t *self, ...@@ -1025,7 +1026,8 @@ static void event__process_sample(const event_t *self,
if (self->header.misc & PERF_RECORD_MISC_EXACT_IP) if (self->header.misc & PERF_RECORD_MISC_EXACT_IP)
exact_samples++; exact_samples++;
if (event__preprocess_sample(self, session, &al, symbol_filter) < 0 || if (event__preprocess_sample(self, session, &al, &data,
symbol_filter) < 0 ||
al.filtered) al.filtered)
return; return;
......
...@@ -18,7 +18,7 @@ ...@@ -18,7 +18,7 @@
#include "util.h" #include "util.h"
#include "callchain.h" #include "callchain.h"
bool ip_callchain__valid(struct ip_callchain *chain, event_t *event) bool ip_callchain__valid(struct ip_callchain *chain, const event_t *event)
{ {
unsigned int chain_size = event->header.size; unsigned int chain_size = event->header.size;
chain_size -= (unsigned long)&event->ip.__more_data - (unsigned long)event; chain_size -= (unsigned long)&event->ip.__more_data - (unsigned long)event;
......
...@@ -60,5 +60,5 @@ int register_callchain_param(struct callchain_param *param); ...@@ -60,5 +60,5 @@ int register_callchain_param(struct callchain_param *param);
int append_chain(struct callchain_node *root, struct ip_callchain *chain, int append_chain(struct callchain_node *root, struct ip_callchain *chain,
struct map_symbol *syms); struct map_symbol *syms);
bool ip_callchain__valid(struct ip_callchain *chain, event_t *event); bool ip_callchain__valid(struct ip_callchain *chain, const event_t *event);
#endif /* __PERF_CALLCHAIN_H */ #endif /* __PERF_CALLCHAIN_H */
...@@ -655,11 +655,36 @@ static void dso__calc_col_width(struct dso *self) ...@@ -655,11 +655,36 @@ static void dso__calc_col_width(struct dso *self)
} }
int event__preprocess_sample(const event_t *self, struct perf_session *session, int event__preprocess_sample(const event_t *self, struct perf_session *session,
struct addr_location *al, symbol_filter_t filter) struct addr_location *al, struct sample_data *data,
symbol_filter_t filter)
{ {
u8 cpumode = self->header.misc & PERF_RECORD_MISC_CPUMODE_MASK; u8 cpumode = self->header.misc & PERF_RECORD_MISC_CPUMODE_MASK;
struct thread *thread = perf_session__findnew(session, self->ip.pid); struct thread *thread;
event__parse_sample(self, session->sample_type, data);
dump_printf("(IP, %d): %d/%d: %#Lx period: %Ld cpu:%d\n",
self->header.misc, data->pid, data->tid, data->ip,
data->period, data->cpu);
if (session->sample_type & PERF_SAMPLE_CALLCHAIN) {
unsigned int i;
dump_printf("... chain: nr:%Lu\n", data->callchain->nr);
if (!ip_callchain__valid(data->callchain, self)) {
pr_debug("call-chain problem with event, "
"skipping it.\n");
goto out_filtered;
}
if (dump_trace) {
for (i = 0; i < data->callchain->nr; i++)
dump_printf("..... %2d: %016Lx\n",
i, data->callchain->ips[i]);
}
}
thread = perf_session__findnew(session, self->ip.pid);
if (thread == NULL) if (thread == NULL)
return -1; return -1;
...@@ -724,9 +749,9 @@ int event__preprocess_sample(const event_t *self, struct perf_session *session, ...@@ -724,9 +749,9 @@ int event__preprocess_sample(const event_t *self, struct perf_session *session,
return 0; return 0;
} }
int event__parse_sample(event_t *event, u64 type, struct sample_data *data) int event__parse_sample(const event_t *event, u64 type, struct sample_data *data)
{ {
u64 *array = event->sample.array; const u64 *array = event->sample.array;
if (type & PERF_SAMPLE_IP) { if (type & PERF_SAMPLE_IP) {
data->ip = event->ip.ip; data->ip = event->ip.ip;
......
...@@ -157,8 +157,9 @@ int event__process_task(event_t *self, struct perf_session *session); ...@@ -157,8 +157,9 @@ int event__process_task(event_t *self, struct perf_session *session);
struct addr_location; struct addr_location;
int event__preprocess_sample(const event_t *self, struct perf_session *session, int event__preprocess_sample(const event_t *self, struct perf_session *session,
struct addr_location *al, symbol_filter_t filter); struct addr_location *al, struct sample_data *data,
int event__parse_sample(event_t *event, u64 type, struct sample_data *data); symbol_filter_t filter);
int event__parse_sample(const event_t *event, u64 type, struct sample_data *data);
extern const char *event__name[]; extern const char *event__name[];
......
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