Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit cc22e575 authored by Arnaldo Carvalho de Melo's avatar Arnaldo Carvalho de Melo
Browse files

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.org


Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent 8b640cc4
Loading
Loading
Loading
Loading
+13 −15
Original line number Original line Diff line number Diff line
@@ -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


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
	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 @@ out:
}
}


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 @@ out:
}
}


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,
		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");
	}
	}
+7 −9
Original line number Original line Diff line number Diff line
@@ -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,
			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,
	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,
	}
	}


	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,
		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,
		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,
	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;
+1 −0
Original line number Original line Diff line number Diff line
@@ -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;
+0 −1
Original line number Original line Diff line number Diff line
@@ -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)
{
{
+0 −1
Original line number Original line Diff line number Diff line
@@ -408,7 +408,6 @@ exit:
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)
{
{
Loading