On 18-Jan-2021, at 3:51 PM, kajoljain <kj...@linux.ibm.com> wrote:
On 1/12/21 3:08 PM, Jiri Olsa wrote:
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.
Patch looks good to me.
Tested-By: Kajol Jain<kj...@linux.ibm.com>
Thanks, Kajol Jain
Signed-off-by: Athira Rajeev<atraj...@linux.vnet.ibm.com>
I can't test, but since the same approach works for arm and s390, this also looks ok
Acked-by: Jiri Olsa <jo...@redhat.com>
thanks, jirka
Hi Arnaldo, Can you please help review this patch and merge if this looks good.. Thanks Athira
--- 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
|