2023-06-22 05:39:08

by Ian Rogers

[permalink] [raw]
Subject: [PATCH v1 1/1] 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.

Signed-off-by: Ian Rogers <[email protected]>
---
tools/perf/util/unwind-libunwind-local.c | 11 ++++++-----
1 file changed, 6 insertions(+), 5 deletions(-)

diff --git a/tools/perf/util/unwind-libunwind-local.c b/tools/perf/util/unwind-libunwind-local.c
index 36bf5100bad2..9cb82d7c7dc7 100644
--- a/tools/perf/util/unwind-libunwind-local.c
+++ b/tools/perf/util/unwind-libunwind-local.c
@@ -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;
}
@@ -476,11 +477,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,
- need_unwind_info, arg);
+ ret = dwarf_search_unwind_table(as, ip, &di, pi,
+ need_unwind_info, arg);
}
#endif
-
+ map__put(map);
return ret;
}

@@ -539,7 +540,7 @@ static int access_dso_mem(struct unwind_info *ui, unw_word_t addr,

size = dso__data_read_addr(dso, map, ui->machine,
addr, (u8 *) data, sizeof(*data));
-
+ map__put(map);
return !(size == sizeof(*data));
}

--
2.41.0.162.gfafddb0af9-goog



2023-06-22 22:53:54

by Namhyung Kim

[permalink] [raw]
Subject: Re: [PATCH v1 1/1] perf unwind: Fix map reference counts

On Wed, Jun 21, 2023 at 10:10 PM Ian Rogers <[email protected]> wrote:
>
> 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.

It also needs map__put() when map__dso() returns NULL.

Thanks,
Namhyung


>
> Signed-off-by: Ian Rogers <[email protected]>
> ---
> tools/perf/util/unwind-libunwind-local.c | 11 ++++++-----
> 1 file changed, 6 insertions(+), 5 deletions(-)
>
> diff --git a/tools/perf/util/unwind-libunwind-local.c b/tools/perf/util/unwind-libunwind-local.c
> index 36bf5100bad2..9cb82d7c7dc7 100644
> --- a/tools/perf/util/unwind-libunwind-local.c
> +++ b/tools/perf/util/unwind-libunwind-local.c
> @@ -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;
> }
> @@ -476,11 +477,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,
> - need_unwind_info, arg);
> + ret = dwarf_search_unwind_table(as, ip, &di, pi,
> + need_unwind_info, arg);
> }
> #endif
> -
> + map__put(map);
> return ret;
> }
>
> @@ -539,7 +540,7 @@ static int access_dso_mem(struct unwind_info *ui, unw_word_t addr,
>
> size = dso__data_read_addr(dso, map, ui->machine,
> addr, (u8 *) data, sizeof(*data));
> -
> + map__put(map);
> return !(size == sizeof(*data));
> }
>
> --
> 2.41.0.162.gfafddb0af9-goog
>