Commit 5ab6d715 authored by Ian Rogers's avatar Ian Rogers Committed by Arnaldo Carvalho de Melo
Browse files

perf maps: Add functions to access maps



Introduce functions to access struct maps. These functions reduce the
number of places reference counting is necessary. While tidying APIs do
some small const-ification, in particlar to unwind_libunwind_ops.

Committer notes:

Fixed up tools/perf/util/unwind-libunwind.c:

-               return ops->get_entries(cb, arg, thread, data, max_stack);
+               return ops->get_entries(cb, arg, thread, data, max_stack, best_effort);

Signed-off-by: default avatarIan Rogers <irogers@google.com>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Alexey Bayduraev <alexey.v.bayduraev@linux.intel.com>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Cc: Darren Hart <dvhart@infradead.org>
Cc: Davidlohr Bueso <dave@stgolabs.net>
Cc: Dmitriy Vyukov <dvyukov@google.com>
Cc: Eric Dumazet <edumazet@google.com>
Cc: German Gomez <german.gomez@arm.com>
Cc: Hao Luo <haoluo@google.com>
Cc: Ingo Molnar <mingo@redhat.com>
Cc: James Clark <james.clark@arm.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: John Garry <john.g.garry@oracle.com>
Cc: Kajol Jain <kjain@linux.ibm.com>
Cc: Kan Liang <kan.liang@linux.intel.com>
Cc: Leo Yan <leo.yan@linaro.org>
Cc: Madhavan Srinivasan <maddy@linux.ibm.com>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Masami Hiramatsu <mhiramat@kernel.org>
Cc: Miaoqian Lin <linmq006@gmail.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Riccardo Mancini <rickyman7@gmail.com>
Cc: Shunsuke Nakamura <nakamura.shun@fujitsu.com>
Cc: Song Liu <song@kernel.org>
Cc: Stephane Eranian <eranian@google.com>
Cc: Stephen Brennan <stephen.s.brennan@oracle.com>
Cc: Steven Rostedt (VMware) <rostedt@goodmis.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Thomas Richter <tmricht@linux.ibm.com>
Cc: Yury Norov <yury.norov@gmail.com>
Link: https://lore.kernel.org/r/20230320212248.1175731-2-irogers@google.com


Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent ff583dc4
Loading
Loading
Loading
Loading
+4 −3
Original line number Diff line number Diff line
@@ -100,10 +100,11 @@ static PyObject *perf_sample_insn(PyObject *obj, PyObject *args)
	if (!c)
		return NULL;

	if (c->sample->ip && !c->sample->insn_len &&
	    c->al->thread->maps && c->al->thread->maps->machine)
		script_fetch_insn(c->sample, c->al->thread, c->al->thread->maps->machine);
	if (c->sample->ip && !c->sample->insn_len && c->al->thread->maps) {
		struct machine *machine =  maps__machine(c->al->thread->maps);

		script_fetch_insn(c->sample, c->al->thread, machine);
	}
	if (!c->sample->insn_len)
		Py_RETURN_NONE; /* N.B. This is a return statement */

+1 −1
Original line number Diff line number Diff line
@@ -269,7 +269,7 @@ static int read_object_code(u64 addr, size_t len, u8 cpumode,
		len = al.map->end - addr;

	/* Read the object code using perf */
	ret_len = dso__data_read_offset(al.map->dso, thread->maps->machine,
	ret_len = dso__data_read_offset(al.map->dso, maps__machine(thread->maps),
					al.addr, buf1, len);
	if (ret_len != len) {
		pr_debug("dso__data_read_offset failed\n");
+2 −1
Original line number Diff line number Diff line
@@ -3139,7 +3139,8 @@ static int evsel__hists_browse(struct evsel *evsel, int nr_events, const char *h
			continue;
		case 'k':
			if (browser->selection != NULL)
				hists_browser__zoom_map(browser, browser->selection->maps->machine->vmlinux_map);
				hists_browser__zoom_map(browser,
					      maps__machine(browser->selection->maps)->vmlinux_map);
			continue;
		case 'V':
			verbose = (verbose + 1) % 4;
+5 −4
Original line number Diff line number Diff line
@@ -1112,6 +1112,8 @@ int hist_entry__append_callchain(struct hist_entry *he, struct perf_sample *samp
int fill_callchain_info(struct addr_location *al, struct callchain_cursor_node *node,
			bool hide_unresolved)
{
	struct machine *machine = maps__machine(node->ms.maps);

	al->maps = node->ms.maps;
	al->map = node->ms.map;
	al->sym = node->ms.sym;
@@ -1124,9 +1126,8 @@ int fill_callchain_info(struct addr_location *al, struct callchain_cursor_node *
		if (al->map == NULL)
			goto out;
	}

	if (al->maps == machine__kernel_maps(al->maps->machine)) {
		if (machine__is_host(al->maps->machine)) {
	if (al->maps == machine__kernel_maps(machine)) {
		if (machine__is_host(machine)) {
			al->cpumode = PERF_RECORD_MISC_KERNEL;
			al->level = 'k';
		} else {
@@ -1134,7 +1135,7 @@ int fill_callchain_info(struct addr_location *al, struct callchain_cursor_node *
			al->level = 'g';
		}
	} else {
		if (machine__is_host(al->maps->machine)) {
		if (machine__is_host(machine)) {
			al->cpumode = PERF_RECORD_MISC_USER;
			al->level = '.';
		} else if (perf_guest) {
+7 −5
Original line number Diff line number Diff line
@@ -181,7 +181,7 @@ static int db_ids_from_al(struct db_export *dbe, struct addr_location *al,
	if (al->map) {
		struct dso *dso = al->map->dso;

		err = db_export__dso(dbe, dso, al->maps->machine);
		err = db_export__dso(dbe, dso, maps__machine(al->maps));
		if (err)
			return err;
		*dso_db_id = dso->db_id;
@@ -354,19 +354,21 @@ int db_export__sample(struct db_export *dbe, union perf_event *event,
	};
	struct thread *main_thread;
	struct comm *comm = NULL;
	struct machine *machine;
	int err;

	err = db_export__evsel(dbe, evsel);
	if (err)
		return err;

	err = db_export__machine(dbe, al->maps->machine);
	machine = maps__machine(al->maps);
	err = db_export__machine(dbe, machine);
	if (err)
		return err;

	main_thread = thread__main_thread(al->maps->machine, thread);
	main_thread = thread__main_thread(machine, thread);

	err = db_export__threads(dbe, thread, main_thread, al->maps->machine, &comm);
	err = db_export__threads(dbe, thread, main_thread, machine, &comm);
	if (err)
		goto out_put;

@@ -380,7 +382,7 @@ int db_export__sample(struct db_export *dbe, union perf_event *event,
		goto out_put;

	if (dbe->cpr) {
		struct call_path *cp = call_path_from_sample(dbe, al->maps->machine,
		struct call_path *cp = call_path_from_sample(dbe, machine,
							     thread, sample,
							     evsel);
		if (cp) {
Loading