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 >