Re: [PATCH] perf tools: Fixup end address of modules

From: Ian Rogers
Date: Wed Dec 18 2024 - 17:15:58 EST


On Wed, Dec 18, 2024 at 2:04 PM Namhyung Kim <namhyung@xxxxxxxxxx> wrote:
>
> In machine__create_module(), it reads /proc/modules to get a list of
> modules in the system. The file shows the start address (of text) and
> the size of the module so it uses the info to reconstruct system memory
> maps for symbol resolution.
>
> But module memory consists of multiple segments and they can be
> scaterred. Currently perf tools assume they are contiguous and see some

nit: s/scaterred/scattered/

> overlaps. This can confuse the tool when it finds a map containing a
> given address.
>
> As we mostly care about the function symbols in the text segment, it can
> fixup the size or end address of modules when there's an overlap. We
> can use maps__fixup_end() which updates the end address using the start
> address of the next map.
>
> Ideally it should be able to track other segments (like data/rodata),
> but that would require some changes in /proc/modules IMHO.
>
> Reported-by: Blake Jones <blakejones@xxxxxxxxxx>
> Cc: Luis Chamberlain <mcgrof@xxxxxxxxxx>
> Cc: Petr Pavlu <petr.pavlu@xxxxxxxx>
> Cc: Sami Tolvanen <samitolvanen@xxxxxxxxxx>
> Cc: Daniel Gomez <da.gomez@xxxxxxxxxxx>
> Cc: linux-modules@xxxxxxxxxxxxxxx
> Signed-off-by: Namhyung Kim <namhyung@xxxxxxxxxx>

Acked-by: Ian Rogers <irogers@xxxxxxxxxx>

Thanks,
Ian

> ---
> tools/perf/util/machine.c | 2 ++
> 1 file changed, 2 insertions(+)
>
> diff --git a/tools/perf/util/machine.c b/tools/perf/util/machine.c
> index 27d5345d2b307a97..8bb34689e3ceeec4 100644
> --- a/tools/perf/util/machine.c
> +++ b/tools/perf/util/machine.c
> @@ -1468,6 +1468,8 @@ static int machine__create_modules(struct machine *machine)
> if (modules__parse(modules, machine, machine__create_module))
> return -1;
>
> + maps__fixup_end(machine__kernel_maps(machine));
> +
> if (!machine__set_modules_path(machine))
> return 0;
>
> --
> 2.47.1.613.gc27f4b7a9f-goog
>