Messages in this thread | | | Subject | Re: linux-next: manual merge of the akpm-current tree with the powerpc tree | From | Christophe Leroy <> | Date | Thu, 15 Apr 2021 12:15:05 +0200 |
| |
Le 15/04/2021 à 12:08, Christophe Leroy a écrit : > > > Le 15/04/2021 à 12:07, Christophe Leroy a écrit : >> >> >> 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) > > Should also use start and end here instead of MODULES_VADDR and MODULES_END
The cleanest however should be to define MODULES_VADDR and MODULES_END all the time with a fallback to VMALLOC_START/VMALLOC_END, to avoid the #ifdef.
The #ifdef was OK when we wanted to define modules_alloc() only when module area was different from vmalloc area, but now that we want modules_alloc() at all time, MODULES_VADDR and MODULES_END should be defined all the time.
> >>>> - 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 >>>
| |