perf symbols: Add 'machine' member to struct addr_location

The addr_location struct should fully qualify an address, and to do that
it should have in it the machine where the thread was found.

Thus all functions that receive an addr_location now don't need to also
receive a 'machine', those functions just need to access al->machine
instead, just like it does with the other parts of an address location:
al->thread, al->map, etc.

Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-o51iiee7vyq4r3k362uvuylg@git.kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent 8b640cc4
...@@ -77,10 +77,10 @@ static int report__config(const char *var, const char *value, void *cb) ...@@ -77,10 +77,10 @@ static int report__config(const char *var, const char *value, void *cb)
static int report__resolve_callchain(struct report *rep, struct symbol **parent, static int report__resolve_callchain(struct report *rep, struct symbol **parent,
struct perf_evsel *evsel, struct addr_location *al, struct perf_evsel *evsel, struct addr_location *al,
struct perf_sample *sample, struct machine *machine) struct perf_sample *sample)
{ {
if ((sort__has_parent || symbol_conf.use_callchain) && sample->callchain) { if ((sort__has_parent || symbol_conf.use_callchain) && sample->callchain) {
return machine__resolve_callchain(machine, evsel, al->thread, sample, return machine__resolve_callchain(al->machine, evsel, al->thread, sample,
parent, al, rep->max_stack); parent, al, rep->max_stack);
} }
return 0; return 0;
...@@ -95,7 +95,7 @@ static int hist_entry__append_callchain(struct hist_entry *he, struct perf_sampl ...@@ -95,7 +95,7 @@ static int hist_entry__append_callchain(struct hist_entry *he, struct perf_sampl
static int report__add_mem_hist_entry(struct perf_tool *tool, struct addr_location *al, static int report__add_mem_hist_entry(struct perf_tool *tool, struct addr_location *al,
struct perf_sample *sample, struct perf_evsel *evsel, struct perf_sample *sample, struct perf_evsel *evsel,
struct machine *machine, union perf_event *event) union perf_event *event)
{ {
struct report *rep = container_of(tool, struct report, tool); struct report *rep = container_of(tool, struct report, tool);
struct symbol *parent = NULL; struct symbol *parent = NULL;
...@@ -103,12 +103,12 @@ static int report__add_mem_hist_entry(struct perf_tool *tool, struct addr_locati ...@@ -103,12 +103,12 @@ static int report__add_mem_hist_entry(struct perf_tool *tool, struct addr_locati
struct hist_entry *he; struct hist_entry *he;
struct mem_info *mi, *mx; struct mem_info *mi, *mx;
uint64_t cost; uint64_t cost;
int err = report__resolve_callchain(rep, &parent, evsel, al, sample, machine); int err = report__resolve_callchain(rep, &parent, evsel, al, sample);
if (err) if (err)
return err; return err;
mi = machine__resolve_mem(machine, al->thread, sample, cpumode); mi = machine__resolve_mem(al->machine, al->thread, sample, cpumode);
if (!mi) if (!mi)
return -ENOMEM; return -ENOMEM;
...@@ -148,20 +148,19 @@ static int report__add_mem_hist_entry(struct perf_tool *tool, struct addr_locati ...@@ -148,20 +148,19 @@ static int report__add_mem_hist_entry(struct perf_tool *tool, struct addr_locati
} }
static int report__add_branch_hist_entry(struct perf_tool *tool, struct addr_location *al, static int report__add_branch_hist_entry(struct perf_tool *tool, struct addr_location *al,
struct perf_sample *sample, struct perf_evsel *evsel, struct perf_sample *sample, struct perf_evsel *evsel)
struct machine *machine)
{ {
struct report *rep = container_of(tool, struct report, tool); struct report *rep = container_of(tool, struct report, tool);
struct symbol *parent = NULL; struct symbol *parent = NULL;
unsigned i; unsigned i;
struct hist_entry *he; struct hist_entry *he;
struct branch_info *bi, *bx; struct branch_info *bi, *bx;
int err = report__resolve_callchain(rep, &parent, evsel, al, sample, machine); int err = report__resolve_callchain(rep, &parent, evsel, al, sample);
if (err) if (err)
return err; return err;
bi = machine__resolve_bstack(machine, al->thread, bi = machine__resolve_bstack(al->machine, al->thread,
sample->branch_stack); sample->branch_stack);
if (!bi) if (!bi)
return -ENOMEM; return -ENOMEM;
...@@ -204,13 +203,12 @@ static int report__add_branch_hist_entry(struct perf_tool *tool, struct addr_loc ...@@ -204,13 +203,12 @@ static int report__add_branch_hist_entry(struct perf_tool *tool, struct addr_loc
} }
static int report__add_hist_entry(struct perf_tool *tool, struct perf_evsel *evsel, static int report__add_hist_entry(struct perf_tool *tool, struct perf_evsel *evsel,
struct addr_location *al, struct perf_sample *sample, struct addr_location *al, struct perf_sample *sample)
struct machine *machine)
{ {
struct report *rep = container_of(tool, struct report, tool); struct report *rep = container_of(tool, struct report, tool);
struct symbol *parent = NULL; struct symbol *parent = NULL;
struct hist_entry *he; struct hist_entry *he;
int err = report__resolve_callchain(rep, &parent, evsel, al, sample, machine); int err = report__resolve_callchain(rep, &parent, evsel, al, sample);
if (err) if (err)
return err; return err;
...@@ -256,18 +254,18 @@ static int process_sample_event(struct perf_tool *tool, ...@@ -256,18 +254,18 @@ static int process_sample_event(struct perf_tool *tool,
return 0; return 0;
if (sort__mode == SORT_MODE__BRANCH) { if (sort__mode == SORT_MODE__BRANCH) {
ret = report__add_branch_hist_entry(tool, &al, sample, evsel, machine); ret = report__add_branch_hist_entry(tool, &al, sample, evsel);
if (ret < 0) if (ret < 0)
pr_debug("problem adding lbr entry, skipping event\n"); pr_debug("problem adding lbr entry, skipping event\n");
} else if (rep->mem_mode == 1) { } else if (rep->mem_mode == 1) {
ret = report__add_mem_hist_entry(tool, &al, sample, evsel, machine, event); ret = report__add_mem_hist_entry(tool, &al, sample, evsel, event);
if (ret < 0) if (ret < 0)
pr_debug("problem adding mem entry, skipping event\n"); pr_debug("problem adding mem entry, skipping event\n");
} else { } else {
if (al.map != NULL) if (al.map != NULL)
al.map->dso->hit = 1; al.map->dso->hit = 1;
ret = report__add_hist_entry(tool, evsel, &al, sample, machine); ret = report__add_hist_entry(tool, evsel, &al, sample);
if (ret < 0) if (ret < 0)
pr_debug("problem incrementing symbol period, skipping event\n"); pr_debug("problem incrementing symbol period, skipping event\n");
} }
......
...@@ -423,7 +423,6 @@ static void print_sample_addr(union perf_event *event, ...@@ -423,7 +423,6 @@ static void print_sample_addr(union perf_event *event,
static void print_sample_bts(union perf_event *event, static void print_sample_bts(union perf_event *event,
struct perf_sample *sample, struct perf_sample *sample,
struct perf_evsel *evsel, struct perf_evsel *evsel,
struct machine *machine,
struct thread *thread, struct thread *thread,
struct addr_location *al) struct addr_location *al)
{ {
...@@ -435,7 +434,7 @@ static void print_sample_bts(union perf_event *event, ...@@ -435,7 +434,7 @@ static void print_sample_bts(union perf_event *event,
printf(" "); printf(" ");
else else
printf("\n"); printf("\n");
perf_evsel__print_ip(evsel, sample, machine, al, perf_evsel__print_ip(evsel, sample, al,
output[attr->type].print_ip_opts, output[attr->type].print_ip_opts,
PERF_MAX_STACK_DEPTH); PERF_MAX_STACK_DEPTH);
} }
...@@ -446,14 +445,13 @@ static void print_sample_bts(union perf_event *event, ...@@ -446,14 +445,13 @@ static void print_sample_bts(union perf_event *event,
if (PRINT_FIELD(ADDR) || if (PRINT_FIELD(ADDR) ||
((evsel->attr.sample_type & PERF_SAMPLE_ADDR) && ((evsel->attr.sample_type & PERF_SAMPLE_ADDR) &&
!output[attr->type].user_set)) !output[attr->type].user_set))
print_sample_addr(event, sample, machine, thread, attr); print_sample_addr(event, sample, al->machine, thread, attr);
printf("\n"); printf("\n");
} }
static void process_event(union perf_event *event, struct perf_sample *sample, static void process_event(union perf_event *event, struct perf_sample *sample,
struct perf_evsel *evsel, struct machine *machine, struct perf_evsel *evsel, struct thread *thread,
struct thread *thread,
struct addr_location *al) struct addr_location *al)
{ {
struct perf_event_attr *attr = &evsel->attr; struct perf_event_attr *attr = &evsel->attr;
...@@ -469,7 +467,7 @@ static void process_event(union perf_event *event, struct perf_sample *sample, ...@@ -469,7 +467,7 @@ static void process_event(union perf_event *event, struct perf_sample *sample,
} }
if (is_bts_event(attr)) { if (is_bts_event(attr)) {
print_sample_bts(event, sample, evsel, machine, thread, al); print_sample_bts(event, sample, evsel, thread, al);
return; return;
} }
...@@ -477,7 +475,7 @@ static void process_event(union perf_event *event, struct perf_sample *sample, ...@@ -477,7 +475,7 @@ static void process_event(union perf_event *event, struct perf_sample *sample,
event_format__print(evsel->tp_format, sample->cpu, event_format__print(evsel->tp_format, sample->cpu,
sample->raw_data, sample->raw_size); sample->raw_data, sample->raw_size);
if (PRINT_FIELD(ADDR)) if (PRINT_FIELD(ADDR))
print_sample_addr(event, sample, machine, thread, attr); print_sample_addr(event, sample, al->machine, thread, attr);
if (PRINT_FIELD(IP)) { if (PRINT_FIELD(IP)) {
if (!symbol_conf.use_callchain) if (!symbol_conf.use_callchain)
...@@ -485,7 +483,7 @@ static void process_event(union perf_event *event, struct perf_sample *sample, ...@@ -485,7 +483,7 @@ static void process_event(union perf_event *event, struct perf_sample *sample,
else else
printf("\n"); printf("\n");
perf_evsel__print_ip(evsel, sample, machine, al, perf_evsel__print_ip(evsel, sample, al,
output[attr->type].print_ip_opts, output[attr->type].print_ip_opts,
PERF_MAX_STACK_DEPTH); PERF_MAX_STACK_DEPTH);
} }
...@@ -574,7 +572,7 @@ static int process_sample_event(struct perf_tool *tool __maybe_unused, ...@@ -574,7 +572,7 @@ static int process_sample_event(struct perf_tool *tool __maybe_unused,
if (cpu_list && !test_bit(sample->cpu, cpu_bitmap)) if (cpu_list && !test_bit(sample->cpu, cpu_bitmap))
return 0; return 0;
scripting_ops->process_event(event, sample, evsel, machine, thread, &al); scripting_ops->process_event(event, sample, evsel, thread, &al);
evsel->hists.stats.total_period += sample->period; evsel->hists.stats.total_period += sample->period;
return 0; return 0;
......
...@@ -638,6 +638,7 @@ void thread__find_addr_map(struct thread *thread, ...@@ -638,6 +638,7 @@ void thread__find_addr_map(struct thread *thread,
struct map_groups *mg = &thread->mg; struct map_groups *mg = &thread->mg;
bool load_map = false; bool load_map = false;
al->machine = machine;
al->thread = thread; al->thread = thread;
al->addr = addr; al->addr = addr;
al->cpumode = cpumode; al->cpumode = cpumode;
......
...@@ -371,7 +371,6 @@ static void perl_process_event_generic(union perf_event *event, ...@@ -371,7 +371,6 @@ static void perl_process_event_generic(union perf_event *event,
static void perl_process_event(union perf_event *event, static void perl_process_event(union perf_event *event,
struct perf_sample *sample, struct perf_sample *sample,
struct perf_evsel *evsel, struct perf_evsel *evsel,
struct machine *machine __maybe_unused,
struct thread *thread, struct thread *thread,
struct addr_location *al __maybe_unused) struct addr_location *al __maybe_unused)
{ {
......
...@@ -408,7 +408,6 @@ static void python_process_general_event(struct perf_sample *sample, ...@@ -408,7 +408,6 @@ static void python_process_general_event(struct perf_sample *sample,
static void python_process_event(union perf_event *event __maybe_unused, static void python_process_event(union perf_event *event __maybe_unused,
struct perf_sample *sample, struct perf_sample *sample,
struct perf_evsel *evsel, struct perf_evsel *evsel,
struct machine *machine __maybe_unused,
struct thread *thread, struct thread *thread,
struct addr_location *al) struct addr_location *al)
{ {
......
...@@ -1467,7 +1467,7 @@ struct perf_evsel *perf_session__find_first_evtype(struct perf_session *session, ...@@ -1467,7 +1467,7 @@ struct perf_evsel *perf_session__find_first_evtype(struct perf_session *session,
} }
void perf_evsel__print_ip(struct perf_evsel *evsel, struct perf_sample *sample, void perf_evsel__print_ip(struct perf_evsel *evsel, struct perf_sample *sample,
struct machine *machine, struct addr_location *al, struct addr_location *al,
unsigned int print_opts, unsigned int stack_depth) unsigned int print_opts, unsigned int stack_depth)
{ {
struct callchain_cursor_node *node; struct callchain_cursor_node *node;
...@@ -1482,7 +1482,7 @@ void perf_evsel__print_ip(struct perf_evsel *evsel, struct perf_sample *sample, ...@@ -1482,7 +1482,7 @@ void perf_evsel__print_ip(struct perf_evsel *evsel, struct perf_sample *sample,
if (symbol_conf.use_callchain && sample->callchain) { if (symbol_conf.use_callchain && sample->callchain) {
struct addr_location node_al; struct addr_location node_al;
if (machine__resolve_callchain(machine, evsel, al->thread, if (machine__resolve_callchain(al->machine, evsel, al->thread,
sample, NULL, NULL, sample, NULL, NULL,
PERF_MAX_STACK_DEPTH) != 0) { PERF_MAX_STACK_DEPTH) != 0) {
if (verbose) if (verbose)
......
...@@ -106,7 +106,7 @@ struct perf_evsel *perf_session__find_first_evtype(struct perf_session *session, ...@@ -106,7 +106,7 @@ struct perf_evsel *perf_session__find_first_evtype(struct perf_session *session,
unsigned int type); unsigned int type);
void perf_evsel__print_ip(struct perf_evsel *evsel, struct perf_sample *sample, void perf_evsel__print_ip(struct perf_evsel *evsel, struct perf_sample *sample,
struct machine *machine, struct addr_location *al, struct addr_location *al,
unsigned int print_opts, unsigned int stack_depth); unsigned int print_opts, unsigned int stack_depth);
int perf_session__cpu_bitmap(struct perf_session *session, int perf_session__cpu_bitmap(struct perf_session *session,
......
...@@ -164,6 +164,7 @@ struct mem_info { ...@@ -164,6 +164,7 @@ struct mem_info {
}; };
struct addr_location { struct addr_location {
struct machine *machine;
struct thread *thread; struct thread *thread;
struct map *map; struct map *map;
struct symbol *sym; struct symbol *sym;
......
...@@ -38,7 +38,6 @@ static int stop_script_unsupported(void) ...@@ -38,7 +38,6 @@ static int stop_script_unsupported(void)
static void process_event_unsupported(union perf_event *event __maybe_unused, static void process_event_unsupported(union perf_event *event __maybe_unused,
struct perf_sample *sample __maybe_unused, struct perf_sample *sample __maybe_unused,
struct perf_evsel *evsel __maybe_unused, struct perf_evsel *evsel __maybe_unused,
struct machine *machine __maybe_unused,
struct thread *thread __maybe_unused, struct thread *thread __maybe_unused,
struct addr_location *al __maybe_unused) struct addr_location *al __maybe_unused)
{ {
......
...@@ -68,7 +68,6 @@ struct scripting_ops { ...@@ -68,7 +68,6 @@ struct scripting_ops {
void (*process_event) (union perf_event *event, void (*process_event) (union perf_event *event,
struct perf_sample *sample, struct perf_sample *sample,
struct perf_evsel *evsel, struct perf_evsel *evsel,
struct machine *machine,
struct thread *thread, struct thread *thread,
struct addr_location *al); struct addr_location *al);
int (*generate_script) (struct pevent *pevent, const char *outfile); int (*generate_script) (struct pevent *pevent, const char *outfile);
......
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