[PATCH v5 5/5] powerpc/perf: split callchain.c by bitness
Christophe Leroy
christophe.leroy at c-s.fr
Fri Aug 30 17:15:36 AEST 2019
Le 30/08/2019 à 09:12, Michal Suchánek a écrit :
> On Fri, 30 Aug 2019 08:42:25 +0200
> Michal Suchánek <msuchanek at suse.de> wrote:
>
>> On Fri, 30 Aug 2019 06:35:11 +0000 (UTC)
>> Christophe Leroy <christophe.leroy at c-s.fr> wrote:
>>
>>> On 08/29/2019 10:28 PM, Michal Suchanek wrote:
>
>>> obj-$(CONFIG_PPC_PERF_CTRS) += core-book3s.o bhrb.o
>>> diff --git a/arch/powerpc/perf/callchain_32.c b/arch/powerpc/perf/callchain_32.c
>>> index 0bd4484eddaa..17c43ae03084 100644
>>> --- a/arch/powerpc/perf/callchain_32.c
>>> +++ b/arch/powerpc/perf/callchain_32.c
>>> @@ -15,50 +15,13 @@
>>> #include <asm/sigcontext.h>
>>> #include <asm/ucontext.h>
>>> #include <asm/vdso.h>
>>> -#ifdef CONFIG_PPC64
>>> -#include "../kernel/ppc32.h"
>>> -#endif
>>> #include <asm/pte-walk.h>
>>>
>>> #include "callchain.h"
>>>
>>> #ifdef CONFIG_PPC64
>>> -static int read_user_stack_32(unsigned int __user *ptr, unsigned int *ret)
>>> -{
>>> - if ((unsigned long)ptr > TASK_SIZE - sizeof(unsigned int) ||
>>> - ((unsigned long)ptr & 3))
>>> - return -EFAULT;
>>> -
>>> - pagefault_disable();
>>> - if (!__get_user_inatomic(*ret, ptr)) {
>>> - pagefault_enable();
>>> - return 0;
>>> - }
>>> - pagefault_enable();
>>> -
>>> - return read_user_stack_slow(ptr, ret, 4);
>>> -}
>>> -#else /* CONFIG_PPC64 */
>>> -/*
>>> - * On 32-bit we just access the address and let hash_page create a
>>> - * HPTE if necessary, so there is no need to fall back to reading
>>> - * the page tables. Since this is called at interrupt level,
>>> - * do_page_fault() won't treat a DSI as a page fault.
>>> - */
>>> -static int read_user_stack_32(unsigned int __user *ptr, unsigned int *ret)
>>> -{
>>> - int rc;
>>> -
>>> - if ((unsigned long)ptr > TASK_SIZE - sizeof(unsigned int) ||
>>> - ((unsigned long)ptr & 3))
>>> - return -EFAULT;
>>> -
>>> - pagefault_disable();
>>> - rc = __get_user_inatomic(*ret, ptr);
>>> - pagefault_enable();
>>> -
>>> - return rc;
>>> -}
>>> +#include "../kernel/ppc32.h"
>>> +#else
>>>
>>> #define __SIGNAL_FRAMESIZE32 __SIGNAL_FRAMESIZE
>>> #define sigcontext32 sigcontext
>>> @@ -95,6 +58,30 @@ struct rt_signal_frame_32 {
>>> int abigap[56];
>>> };
>>>
>>> +/*
>>> + * On 32-bit we just access the address and let hash_page create a
>>> + * HPTE if necessary, so there is no need to fall back to reading
>>> + * the page tables. Since this is called at interrupt level,
>>> + * do_page_fault() won't treat a DSI as a page fault.
>>> + */
>>> +static int read_user_stack_32(unsigned int __user *ptr, unsigned int *ret)
>>> +{
>>> + int rc;
>>> +
>>> + if ((unsigned long)ptr > TASK_SIZE - sizeof(unsigned int) ||
>>> + ((unsigned long)ptr & 3))
>>> + return -EFAULT;
>>> +
>>> + pagefault_disable();
>>> + rc = __get_user_inatomic(*ret, ptr);
>>> + pagefault_enable();
>>> +
>>> + if (IS_ENABLED(CONFIG_PPC32) || !rc)
>>> + return rc;
>>> +
>>> + return read_user_stack_slow(ptr, ret, 4);
>>> +}
>>> +
>>> static int is_sigreturn_32_address(unsigned int nip, unsigned int fp)
>>> {
>>> if (nip == fp + offsetof(struct signal_frame_32, mctx.mc_pad))
>>
>> I will leave consolidating this function to somebody who knows what the
>> desired semantic is. With a short ifdef section at the top of the file
>> it is a low-hanging fruit.
>
> It looks ok if done as a separate patch.
Yes, doing it as a separate patch is good.
And if you do it before patch 3, then you don't need anymore this ugly
hack to hide read_user_stack_32()
Christphe
>
> Thanks
>
> Michal
>
More information about the Linuxppc-dev
mailing list