Re: [PATCH v2] perf: Fix display of kernel symbols

From: Arnaldo Carvalho de Melo
Date: Wed Jan 08 2025 - 14:56:02 EST


On Wed, Jan 08, 2025 at 06:06:03PM +0100, Christophe Leroy wrote:
>
>
> Le 08/01/2025 à 15:53, Arnaldo Carvalho de Melo a écrit :
> > On Wed, Jan 08, 2025 at 10:54:20AM +0100, Christophe Leroy wrote:
> > > Since commit 659ad3492b91 ("perf maps: Switch from rbtree to lazily
> > > sorted array for addresses"), perf doesn't display anymore kernel
> > > symbols on powerpc, allthough it still detects them as kernel addresses.
> > >
> > > # Overhead Command Shared Object Symbol
> > > # ........ .......... ............. ......................................
> > > #
> > > 80.49% Coeur main [unknown] [k] 0xc005f0f8
> > > 3.91% Coeur main gau [.] engine_loop.constprop.0.isra.0
> > > 1.72% Coeur main [unknown] [k] 0xc005f11c
> > > 1.09% Coeur main [unknown] [k] 0xc01f82c8
> > > 0.44% Coeur main libc.so.6 [.] epoll_wait
> > > 0.38% Coeur main [unknown] [k] 0xc0011718
> > > 0.36% Coeur main [unknown] [k] 0xc01f45c0
> > >
> > > This is because function maps__find_next_entry() now returns current
> > > entry instead of next entry, leading to kernel map end address
> > > getting mis-configured with its own start address instead of the
> > > start address of the following map.
> > >
> > > Fix it by really taking the next entry, also make sure that entry
> > > follows current one by making sure entries are sorted.
> > >
> > > Fixes: 659ad3492b91 ("perf maps: Switch from rbtree to lazily sorted array for addresses")
> > > Signed-off-by: Christophe Leroy <christophe.leroy@xxxxxxxxxx>
> > > Reviewed-by: Arnaldo Carvalho de Melo <acme@xxxxxxxxxx>
> > > ---
> > > v2: Make sure the entries are sorted, if not sort them.
> >
> > Since you have changed what I reviewed I'll have to re-review :-) Will
> > try to do it after some calls.
>
> Ah yes sorry, should have removed your Reviewed-by.
>
> Based on Ian's feedback "Using the next entry in this way won't work if the
> entries aren't sorted", I added the following block in front of the initial
> change:
>
> + while (!maps__maps_by_address_sorted(maps)) {
> + up_read(maps__lock(maps));
> + maps__sort_by_address(maps);
> + down_read(maps__lock(maps));
> + }

Its ok, I'll keep it now that I looked at it.

Thanks!

- Arnaldo