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: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
parent
45d8e8025a
commit
41a37e2017
8 changed files with 41 additions and 44 deletions
|
@ -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)
|
||||
{
|
||||
struct addr_location al;
|
||||
struct sample_data data;
|
||||
|
||||
dump_printf("(IP, %d): %d: %#Lx\n", event->header.misc,
|
||||
event->ip.pid, event->ip.ip);
|
||||
|
||||
if (event__preprocess_sample(event, session, &al, NULL) < 0) {
|
||||
if (event__preprocess_sample(event, session, &al, &data, NULL) < 0) {
|
||||
pr_warning("problem processing %d event, skipping it.\n",
|
||||
event->header.type);
|
||||
return -1;
|
||||
|
|
|
@ -35,10 +35,7 @@ static int diff__process_sample_event(event_t *event, struct perf_session *sessi
|
|||
struct addr_location al;
|
||||
struct sample_data data = { .period = 1, };
|
||||
|
||||
dump_printf("(IP, %d): %d: %#Lx\n", event->header.misc,
|
||||
event->ip.pid, event->ip.ip);
|
||||
|
||||
if (event__preprocess_sample(event, session, &al, NULL) < 0) {
|
||||
if (event__preprocess_sample(event, session, &al, &data, NULL) < 0) {
|
||||
pr_warning("problem processing %d event, skipping it.\n",
|
||||
event->header.type);
|
||||
return -1;
|
||||
|
@ -47,8 +44,6 @@ static int diff__process_sample_event(event_t *event, struct perf_session *sessi
|
|||
if (al.filtered || al.sym == NULL)
|
||||
return 0;
|
||||
|
||||
event__parse_sample(event, session->sample_type, &data);
|
||||
|
||||
if (hists__add_entry(&session->hists, &al, data.period)) {
|
||||
pr_warning("problem incrementing symbol period, skipping event\n");
|
||||
return -1;
|
||||
|
|
|
@ -155,31 +155,7 @@ static int process_sample_event(event_t *event, struct perf_session *session)
|
|||
struct addr_location al;
|
||||
struct perf_event_attr *attr;
|
||||
|
||||
event__parse_sample(event, session->sample_type, &data);
|
||||
|
||||
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) {
|
||||
if (event__preprocess_sample(event, session, &al, &data, NULL) < 0) {
|
||||
fprintf(stderr, "problem processing %d event, skipping it.\n",
|
||||
event->header.type);
|
||||
return -1;
|
||||
|
|
|
@ -983,6 +983,7 @@ static void event__process_sample(const event_t *self,
|
|||
u64 ip = self->ip.ip;
|
||||
struct sym_entry *syme;
|
||||
struct addr_location al;
|
||||
struct sample_data data;
|
||||
struct machine *machine;
|
||||
u8 origin = self->header.misc & PERF_RECORD_MISC_CPUMODE_MASK;
|
||||
|
||||
|
@ -1025,7 +1026,8 @@ static void event__process_sample(const event_t *self,
|
|||
if (self->header.misc & PERF_RECORD_MISC_EXACT_IP)
|
||||
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)
|
||||
return;
|
||||
|
||||
|
|
|
@ -18,7 +18,7 @@
|
|||
#include "util.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;
|
||||
chain_size -= (unsigned long)&event->ip.__more_data - (unsigned long)event;
|
||||
|
|
|
@ -60,5 +60,5 @@ int register_callchain_param(struct callchain_param *param);
|
|||
int append_chain(struct callchain_node *root, struct ip_callchain *chain,
|
||||
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 */
|
||||
|
|
|
@ -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,
|
||||
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;
|
||||
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)
|
||||
return -1;
|
||||
|
||||
|
@ -724,9 +749,9 @@ int event__preprocess_sample(const event_t *self, struct perf_session *session,
|
|||
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) {
|
||||
data->ip = event->ip.ip;
|
||||
|
|
|
@ -157,8 +157,9 @@ int event__process_task(event_t *self, struct perf_session *session);
|
|||
|
||||
struct addr_location;
|
||||
int event__preprocess_sample(const event_t *self, struct perf_session *session,
|
||||
struct addr_location *al, symbol_filter_t filter);
|
||||
int event__parse_sample(event_t *event, u64 type, struct sample_data *data);
|
||||
struct addr_location *al, 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[];
|
||||
|
||||
|
|
Loading…
Reference in a new issue