Re: linux-next: manual merge of the akpm-current tree with the powerpc tree

Christophe Leroy
2021-04-15T10:07:11Z

Le 15/04/2021 à 11:58, Stephen Rothwell a écrit :
> Hi all,
>
> On Thu, 15 Apr 2021 19:44:17 +1000 Stephen Rothwell <sfr@canb.auug.org.au> wrote:
>>
>> Today's linux-next merge of the akpm-current tree got a conflict in:
>>
>> arch/powerpc/kernel/module.c
>>
>> between commit:
>>
>> 2ec13df16704 ("powerpc/modules: Load modules closer to kernel text")
>>
>> from the powerpc tree and commit:
>>
>> 4930ba789f8d ("powerpc/64s/radix: enable huge vmalloc mappings")
>>
>> from the akpm-current tree.
>>
>> I fixed it up (I think - see below) and can carry the fix as
>> necessary. This is now fixed as far as linux-next is concerned, but any
>> non trivial conflicts should be mentioned to your upstream maintainer
>> when your tree is submitted for merging. You may also want to consider
>> cooperating with the maintainer of the conflicting tree to minimise any
>> particularly complex conflicts.
>>
>> --
>> Cheers,
>> Stephen Rothwell
>>
>> diff --cc arch/powerpc/kernel/module.c
>> index fab84024650c,cdb2d88c54e7..000000000000
>> --- a/arch/powerpc/kernel/module.c
>> +++ b/arch/powerpc/kernel/module.c
>> @@@ -88,29 -88,26 +89,42 @@@ int module_finalize(const Elf_Ehdr *hdr
>> return 0;
>> }
>>
>> - #ifdef MODULES_VADDR
>> -void *module_alloc(unsigned long size)
>> +static __always_inline void *
>> +__module_alloc(unsigned long size, unsigned long start, unsigned long end)
>> {
>> - unsigned long start = VMALLOC_START;
>> - unsigned long end = VMALLOC_END;
>> -
>> -#ifdef MODULES_VADDR
>> - BUILD_BUG_ON(TASK_SIZE > MODULES_VADDR);
>> - start = MODULES_VADDR;
>> - end = MODULES_END;
>> -#endif
>> -
>> + /*
>> + * Don't do huge page allocations for modules yet until more testing
>> + * is done. STRICT_MODULE_RWX may require extra work to support this
>> + * too.
>> + */
>> +
>> return __vmalloc_node_range(size, 1, start, end, GFP_KERNEL,
>> - PAGE_KERNEL_EXEC, VM_FLUSH_RESET_PERMS, NUMA_NO_NODE,
>> + PAGE_KERNEL_EXEC,
>> + VM_NO_HUGE_VMAP | VM_FLUSH_RESET_PERMS,
>> + NUMA_NO_NODE,
>> __builtin_return_address(0));
>> }
>> +
>> ++
>> +void *module_alloc(unsigned long size)
>> +{
>> ++ unsigned long start = VMALLOC_START;
>> ++ unsigned long end = VMALLOC_END;
>> + unsigned long limit = (unsigned long)_etext - SZ_32M;
>> + void *ptr = NULL;
>> +
>> ++#ifdef MODULES_VADDR
>> + BUILD_BUG_ON(TASK_SIZE > MODULES_VADDR);
>> ++ start = MODULES_VADDR;
>> ++ end = MODULES_END;

The #endif should be here.

>> +
>> + /* First try within 32M limit from _etext to avoid branch trampolines */
>> + if (MODULES_VADDR < PAGE_OFFSET && MODULES_END > limit)
>> - ptr = __module_alloc(size, limit, MODULES_END);
>> ++ ptr = __module_alloc(size, limit, end);
>> +
>> + if (!ptr)
>> - ptr = __module_alloc(size, MODULES_VADDR, MODULES_END);
>> ++#endif
>> ++ ptr = __module_alloc(size, start, end);
>> +
>> + return ptr;
>> +}
>> - #endif
>
> Unfortunately, it also needs this:

Before the #endif is too far.

>
> From: Stephen Rothwell <sfr@canb.auug.org.au>
> Date: Thu, 15 Apr 2021 19:53:58 +1000
> Subject: [PATCH] merge fix up for powerpc merge fix
>
> Signed-off-by: Stephen Rothwell <sfr@canb.auug.org.au>
> ---
> arch/powerpc/kernel/module.c | 2 ++
> 1 file changed, 2 insertions(+)
>
> diff --git a/arch/powerpc/kernel/module.c b/arch/powerpc/kernel/module.c
> index d8ab1ad2eb05..c060f99afd4d 100644
> --- a/arch/powerpc/kernel/module.c
> +++ b/arch/powerpc/kernel/module.c
> @@ -110,7 +110,9 @@ void *module_alloc(unsigned long size)
> {
> unsigned long start = VMALLOC_START;
> unsigned long end = VMALLOC_END;
> +#ifdef MODULES_VADDR
> unsigned long limit = (unsigned long)_etext - SZ_32M;
> +#endif
> void *ptr = NULL;
>
> #ifdef MODULES_VADDR
>