Commit 33941dbd authored by Ian Rogers's avatar Ian Rogers Committed by Namhyung Kim
Browse files

perf unwind: Fix map reference counts



The result of thread__find_map is the map in the passed in
addr_location. Calling addr_location__exit puts that map and so copies
need to do a map__get. Add in the corresponding map__puts.

v2. Add missing map__put when dso is missing.

Signed-off-by: default avatarIan Rogers <irogers@google.com>
Acked-by: default avatarNamhyung Kim <namhyung@kernel.org>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Ivan Babrou <ivan@cloudflare.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Arnaldo Carvalho de Melo <acme@kernel.org>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Ingo Molnar <mingo@redhat.com>
Link: https://lore.kernel.org/r/20230623043107.4077510-1-irogers@google.com


Signed-off-by: default avatarNamhyung Kim <namhyung@kernel.org>
parent e4ef3ef1
Loading
Loading
Loading
Loading
+12 −7
Original line number Diff line number Diff line
@@ -419,7 +419,8 @@ static struct map *find_map(unw_word_t ip, struct unwind_info *ui)
	struct map *ret;

	addr_location__init(&al);
	ret = thread__find_map(ui->thread, PERF_RECORD_MISC_USER, ip, &al);
	thread__find_map(ui->thread, PERF_RECORD_MISC_USER, ip, &al);
	ret = map__get(al.map);
	addr_location__exit(&al);
	return ret;
}
@@ -440,8 +441,10 @@ find_proc_info(unw_addr_space_t as, unw_word_t ip, unw_proc_info_t *pi,
		return -EINVAL;

	dso = map__dso(map);
	if (!dso)
	if (!dso) {
		map__put(map);
		return -EINVAL;
	}

	pr_debug("unwind: find_proc_info dso %s\n", dso->name);

@@ -476,11 +479,11 @@ find_proc_info(unw_addr_space_t as, unw_word_t ip, unw_proc_info_t *pi,

		memset(&di, 0, sizeof(di));
		if (dwarf_find_debug_frame(0, &di, ip, base, symfile, start, map__end(map)))
			return dwarf_search_unwind_table(as, ip, &di, pi,
			ret = dwarf_search_unwind_table(as, ip, &di, pi,
							need_unwind_info, arg);
	}
#endif

	map__put(map);
	return ret;
}

@@ -534,12 +537,14 @@ static int access_dso_mem(struct unwind_info *ui, unw_word_t addr,

	dso = map__dso(map);

	if (!dso)
	if (!dso) {
		map__put(map);
		return -1;
	}

	size = dso__data_read_addr(dso, map, ui->machine,
				   addr, (u8 *) data, sizeof(*data));

	map__put(map);
	return !(size == sizeof(*data));
}