On Wed, Dec 18, 2024 at 2:04 PM Namhyung Kim <namhy...@kernel.org> 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 <blakejo...@google.com>
> Cc: Luis Chamberlain <mcg...@kernel.org>
> Cc: Petr Pavlu <petr.pa...@suse.com>
> Cc: Sami Tolvanen <samitolva...@google.com>
> Cc: Daniel Gomez <da.go...@samsung.com>
> Cc: linux-modu...@vger.kernel.org
> Signed-off-by: Namhyung Kim <namhy...@kernel.org>

Acked-by: Ian Rogers <irog...@google.com>

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
>

Reply via email to