Message ID | 20230616085038.4121892-2-rppt@kernel.org (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | mm: jit/text allocator | expand |
On Fri, 2023-06-16 at 11:50 +0300, Mike Rapoport wrote: > void *module_alloc(unsigned long size) > { > - if (size == 0) > - return NULL; > - return kmalloc(size, GFP_KERNEL); > -} > - > -/* Free memory returned from module_alloc */ > -void module_memfree(void *module_region) > -{ > - kfree(module_region); > + return __vmalloc_node_range(size, 1, MODULES_VADDR, > MODULES_END, > + GFP_KERNEL, PAGE_KERNEL_EXEC, > + VM_FLUSH_RESET_PERMS, > NUMA_NO_NODE, > + __builtin_return_address(0)); > } > > int apply_relocate_add(Elf32_Shdr *sechdrs, const char *s I wonder if the (size == 0) check is really needed, but __vmalloc_node_range() will WARN on this case where the old code won't.
On Fri, Jun 16, 2023 at 1:51 AM Mike Rapoport <rppt@kernel.org> wrote: > > From: "Mike Rapoport (IBM)" <rppt@kernel.org> > > nios2 uses kmalloc() to implement module_alloc() because CALL26/PCREL26 > cannot reach all of vmalloc address space. > > Define module space as 32MiB below the kernel base and switch nios2 to > use vmalloc for module allocations. > > Suggested-by: Thomas Gleixner <tglx@linutronix.de> > Signed-off-by: Mike Rapoport (IBM) <rppt@kernel.org> > Acked-by: Dinh Nguyen <dinguyen@kernel.org> Acked-by: Song Liu <song@kernel.org> > --- > arch/nios2/include/asm/pgtable.h | 5 ++++- > arch/nios2/kernel/module.c | 19 ++++--------------- > 2 files changed, 8 insertions(+), 16 deletions(-) > > diff --git a/arch/nios2/include/asm/pgtable.h b/arch/nios2/include/asm/pgtable.h > index 0f5c2564e9f5..0073b289c6a4 100644 > --- a/arch/nios2/include/asm/pgtable.h > +++ b/arch/nios2/include/asm/pgtable.h > @@ -25,7 +25,10 @@ > #include <asm-generic/pgtable-nopmd.h> > > #define VMALLOC_START CONFIG_NIOS2_KERNEL_MMU_REGION_BASE > -#define VMALLOC_END (CONFIG_NIOS2_KERNEL_REGION_BASE - 1) > +#define VMALLOC_END (CONFIG_NIOS2_KERNEL_REGION_BASE - SZ_32M - 1) > + > +#define MODULES_VADDR (CONFIG_NIOS2_KERNEL_REGION_BASE - SZ_32M) > +#define MODULES_END (CONFIG_NIOS2_KERNEL_REGION_BASE - 1) > > struct mm_struct; > > diff --git a/arch/nios2/kernel/module.c b/arch/nios2/kernel/module.c > index 76e0a42d6e36..9c97b7513853 100644 > --- a/arch/nios2/kernel/module.c > +++ b/arch/nios2/kernel/module.c > @@ -21,23 +21,12 @@ > > #include <asm/cacheflush.h> > > -/* > - * Modules should NOT be allocated with kmalloc for (obvious) reasons. > - * But we do it for now to avoid relocation issues. CALL26/PCREL26 cannot reach > - * from 0x80000000 (vmalloc area) to 0xc00000000 (kernel) (kmalloc returns > - * addresses in 0xc0000000) > - */ > void *module_alloc(unsigned long size) > { > - if (size == 0) > - return NULL; > - return kmalloc(size, GFP_KERNEL); > -} > - > -/* Free memory returned from module_alloc */ > -void module_memfree(void *module_region) > -{ > - kfree(module_region); > + return __vmalloc_node_range(size, 1, MODULES_VADDR, MODULES_END, > + GFP_KERNEL, PAGE_KERNEL_EXEC, > + VM_FLUSH_RESET_PERMS, NUMA_NO_NODE, > + __builtin_return_address(0)); > } > > int apply_relocate_add(Elf32_Shdr *sechdrs, const char *strtab, > -- > 2.35.1 >
On Fri, Jun 16, 2023 at 04:00:19PM +0000, Edgecombe, Rick P wrote: > On Fri, 2023-06-16 at 11:50 +0300, Mike Rapoport wrote: > > void *module_alloc(unsigned long size) > > { > > - if (size == 0) > > - return NULL; > > - return kmalloc(size, GFP_KERNEL); > > -} > > - > > -/* Free memory returned from module_alloc */ > > -void module_memfree(void *module_region) > > -{ > > - kfree(module_region); > > + return __vmalloc_node_range(size, 1, MODULES_VADDR, > > MODULES_END, > > + GFP_KERNEL, PAGE_KERNEL_EXEC, > > + VM_FLUSH_RESET_PERMS, > > NUMA_NO_NODE, > > + __builtin_return_address(0)); > > } > > > > int apply_relocate_add(Elf32_Shdr *sechdrs, const char *s > > I wonder if the (size == 0) check is really needed, but > __vmalloc_node_range() will WARN on this case where the old code won't. module_alloc() should not be called with zero size, so a warning there would be appropriate. Besides, no other module_alloc() had this check.
diff --git a/arch/nios2/include/asm/pgtable.h b/arch/nios2/include/asm/pgtable.h index 0f5c2564e9f5..0073b289c6a4 100644 --- a/arch/nios2/include/asm/pgtable.h +++ b/arch/nios2/include/asm/pgtable.h @@ -25,7 +25,10 @@ #include <asm-generic/pgtable-nopmd.h> #define VMALLOC_START CONFIG_NIOS2_KERNEL_MMU_REGION_BASE -#define VMALLOC_END (CONFIG_NIOS2_KERNEL_REGION_BASE - 1) +#define VMALLOC_END (CONFIG_NIOS2_KERNEL_REGION_BASE - SZ_32M - 1) + +#define MODULES_VADDR (CONFIG_NIOS2_KERNEL_REGION_BASE - SZ_32M) +#define MODULES_END (CONFIG_NIOS2_KERNEL_REGION_BASE - 1) struct mm_struct; diff --git a/arch/nios2/kernel/module.c b/arch/nios2/kernel/module.c index 76e0a42d6e36..9c97b7513853 100644 --- a/arch/nios2/kernel/module.c +++ b/arch/nios2/kernel/module.c @@ -21,23 +21,12 @@ #include <asm/cacheflush.h> -/* - * Modules should NOT be allocated with kmalloc for (obvious) reasons. - * But we do it for now to avoid relocation issues. CALL26/PCREL26 cannot reach - * from 0x80000000 (vmalloc area) to 0xc00000000 (kernel) (kmalloc returns - * addresses in 0xc0000000) - */ void *module_alloc(unsigned long size) { - if (size == 0) - return NULL; - return kmalloc(size, GFP_KERNEL); -} - -/* Free memory returned from module_alloc */ -void module_memfree(void *module_region) -{ - kfree(module_region); + return __vmalloc_node_range(size, 1, MODULES_VADDR, MODULES_END, + GFP_KERNEL, PAGE_KERNEL_EXEC, + VM_FLUSH_RESET_PERMS, NUMA_NO_NODE, + __builtin_return_address(0)); } int apply_relocate_add(Elf32_Shdr *sechdrs, const char *strtab,