[PATCH] tools/perf: Fix powerpc gap between kernel end and module start

Athira Rajeev atrajeev at linux.vnet.ibm.com
Thu Feb 11 23:19:07 AEDT 2021



> On 09-Feb-2021, at 6:17 PM, Arnaldo Carvalho de Melo <acme at kernel.org> wrote:
> 
> Em Wed, Feb 03, 2021 at 12:31:48PM -0300, Arnaldo Carvalho de Melo escreveu:
>> Em Tue, Feb 02, 2021 at 04:02:36PM +0530, Athira Rajeev escreveu:
>>> 
>>> 
>>>    On 18-Jan-2021, at 3:51 PM, kajoljain <kjain at 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<kjain at linux.ibm.com>
>>> 
>>>    Thanks,
>>>    Kajol Jain
>>> 
>>> 
>>>            Signed-off-by: Athira Rajeev<atrajeev at 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 <jolsa at redhat.com>
>>> 
>>>        thanks,
>>>        jirka
>>> 
>>> 
>>> Hi Arnaldo,
>>> 
>>> Can you please help review this patch and merge if this looks good..
>> 
>> Thanks, collected the Tested-by from Kajol and the Acked-by from Jiri
>> and applied to my local tree for testing, then up to my perf/core
>> branch.
> 
> Had to apply this on top.
> 
> - Arnaldo
> 
> commit 0f000f9c89182950cd3500226729977251529364
> Author: Arnaldo Carvalho de Melo <acme at redhat.com>
> Date:   Tue Feb 9 09:41:21 2021 -0300
> 
>    perf powerpc: Fix printf conversion specifier for IP addresses
> 
>    We need to use "%#" PRIx64 for u64 values, not "%lx", fixing this build
>    problem on powerpc 32-bit:
> 
>      72    13.69 ubuntu:18.04-x-powerpc        : FAIL powerpc-linux-gnu-gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0
>        arch/powerpc/util/machine.c: In function 'arch__symbols__fixup_end':
>        arch/powerpc/util/machine.c:23:12: error: format '%lx' expects argument of type 'long unsigned int', but argument 6 has type 'u64 {aka long long unsigned int}' [-Werror=format=]
>          pr_debug4("%s sym:%s end:%#lx\n", __func__, p->name, p->end);
>                    ^
>        /git/linux/tools/perf/util/debug.h:18:21: note: in definition of macro 'pr_fmt'
>         #define pr_fmt(fmt) fmt
>                             ^~~
>        /git/linux/tools/perf/util/debug.h:33:29: note: in expansion of macro 'pr_debugN'
>         #define pr_debug4(fmt, ...) pr_debugN(4, pr_fmt(fmt), ##__VA_ARGS__)
>                                     ^~~~~~~~~
>        /git/linux/tools/perf/util/debug.h:33:42: note: in expansion of macro 'pr_fmt'
>         #define pr_debug4(fmt, ...) pr_debugN(4, pr_fmt(fmt), ##__VA_ARGS__)
>                                                  ^~~~~~
>        arch/powerpc/util/machine.c:23:2: note: in expansion of macro 'pr_debug4'
>          pr_debug4("%s sym:%s end:%#lx\n", __func__, p->name, p->end);
>          ^~~~~~~~~
>        cc1: all warnings being treated as errors
>        /git/linux/tools/build/Makefile.build:139: recipe for target 'util' failed
>        make[5]: *** [util] Error 2
>        /git/linux/tools/build/Makefile.build:139: recipe for target 'powerpc' failed
>        make[4]: *** [powerpc] Error 2
>        /git/linux/tools/build/Makefile.build:139: recipe for target 'arch' failed
>        make[3]: *** [arch] Error 2
>      73    30.47 ubuntu:18.04-x-powerpc64      : Ok   powerpc64-linux-gnu-gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0
> 
>    Fixes: 557c3eadb7712741 ("perf powerpc: Fix gap between kernel end and module start")
>    Cc: Athira Rajeev <atrajeev at linux.vnet.ibm.com>
>    Cc: Jiri Olsa <jolsa at redhat.com>
>    Cc: Kajol Jain <kjain at linux.ibm.com>
>    Cc: Madhavan Srinivasan <maddy at linux.ibm.com>
>    Signed-off-by: Arnaldo Carvalho de Melo <acme at redhat.com>

Thanks Arnaldo for the fix.

Athira.
> 
> diff --git a/tools/perf/arch/powerpc/util/machine.c b/tools/perf/arch/powerpc/util/machine.c
> index c30e5cc88c1673d6..e652a1aa8132274f 100644
> --- a/tools/perf/arch/powerpc/util/machine.c
> +++ b/tools/perf/arch/powerpc/util/machine.c
> @@ -1,5 +1,6 @@
> // SPDX-License-Identifier: GPL-2.0
> 
> +#include <inttypes.h>
> #include <stdio.h>
> #include <string.h>
> #include <internal/lib.h> // page_size
> @@ -20,5 +21,5 @@ void arch__symbols__fixup_end(struct symbol *p, struct symbol *c)
> 		p->end += page_size;
> 	else
> 		p->end = c->start;
> -	pr_debug4("%s sym:%s end:%#lx\n", __func__, p->name, p->end);
> +	pr_debug4("%s sym:%s end:%#" PRIx64 "\n", __func__, p->name, p->end);
> }



More information about the Linuxppc-dev mailing list