On Mon, Dec 28, 2020 at 09:14:14PM -0500, Athira Rajeev wrote: SNIP
> c000000002799370 b backtrace_flag > c000000002799378 B radix_tree_node_cachep > c000000002799380 B __bss_stop > c0000000027a0000 B _end > c008000003890000 t icmp_checkentry [ip_tables] > c008000003890038 t ipt_alloc_initial_table [ip_tables] > c008000003890468 T ipt_do_table [ip_tables] > c008000003890de8 T ipt_unregister_table_pre_exit [ip_tables] > ... > > Perf calls function symbols__fixup_end() which sets the end of symbol > to 0xc008000003890000, which is the next address and this is the start > address of first module (icmp_checkentry in above) which will make the > huge symbol size of 0x80000010f0000. > > After symbols__fixup_end: > symbols__fixup_end: sym->name: _end, sym->start: 0xc0000000027a0000, > sym->end: 0xc008000003890000 > > On powerpc, kernel text segment is located at 0xc000000000000000 > whereas the modules are located at very high memory addresses, > 0xc00800000xxxxxxx. Since the gap between end of kernel text segment > and beginning of first module's address is high, histogram allocation > using calloc fails. > > Fix this by detecting the kernel's last symbol and limiting > the range of last kernel symbol to pagesize. > > Signed-off-by: Athira Rajeev<[email protected]> I can't test, but since the same approach works for arm and s390, this also looks ok Acked-by: Jiri Olsa <[email protected]> thanks, jirka > --- > tools/perf/arch/powerpc/util/Build | 1 + > tools/perf/arch/powerpc/util/machine.c | 24 ++++++++++++++++++++++++ > 2 files changed, 25 insertions(+) > create mode 100644 tools/perf/arch/powerpc/util/machine.c > > diff --git a/tools/perf/arch/powerpc/util/Build > b/tools/perf/arch/powerpc/util/Build > index e86e210bf514..b7945e5a543b 100644 > --- a/tools/perf/arch/powerpc/util/Build > +++ b/tools/perf/arch/powerpc/util/Build > @@ -1,4 +1,5 @@ > perf-y += header.o > +perf-y += machine.o > perf-y += kvm-stat.o > perf-y += perf_regs.o > perf-y += mem-events.o > diff --git a/tools/perf/arch/powerpc/util/machine.c > b/tools/perf/arch/powerpc/util/machine.c > new file mode 100644 > index 000000000000..c30e5cc88c16 > --- /dev/null > +++ b/tools/perf/arch/powerpc/util/machine.c > @@ -0,0 +1,24 @@ > +// SPDX-License-Identifier: GPL-2.0 > + > +#include <stdio.h> > +#include <string.h> > +#include <internal/lib.h> // page_size > +#include "debug.h" > +#include "symbol.h" > + > +/* On powerpc kernel text segment start at memory addresses, > 0xc000000000000000 > + * whereas the modules are located at very high memory addresses, > + * for example 0xc00800000xxxxxxx. The gap between end of kernel text segment > + * and beginning of first module's text segment is very high. > + * Therefore do not fill this gap and do not assign it to the kernel dso map. > + */ > + > +void arch__symbols__fixup_end(struct symbol *p, struct symbol *c) > +{ > + if (strchr(p->name, '[') == NULL && strchr(c->name, '[')) > + /* Limit the range of last kernel symbol */ > + p->end += page_size; > + else > + p->end = c->start; > + pr_debug4("%s sym:%s end:%#lx\n", __func__, p->name, p->end); > +} > -- > 1.8.3.1 >
