Message ID | 20230616085038.4121892-6-rppt@kernel.org |
---|---|
State | New |
Headers | show |
Series | mm: jit/text allocator | expand |
On Fri, Jun 16, 2023 at 1:51 AM Mike Rapoport <rppt@kernel.org> wrote: > > From: "Mike Rapoport (IBM)" <rppt@kernel.org> > > Define default parameters for address range for code allocations using > the current values in module_alloc() and make execmem_text_alloc() use > these defaults when an architecure does not supply its specific > parameters. > > With this, execmem_text_alloc() implements memory allocation in a way > compatible with module_alloc() and can be used as a replacement for > module_alloc(). > > Signed-off-by: Mike Rapoport (IBM) <rppt@kernel.org> Acked-by: Song Liu <song@kernel.org> > --- > include/linux/execmem.h | 8 ++++++++ > include/linux/moduleloader.h | 12 ------------ > kernel/module/main.c | 7 ------- > mm/execmem.c | 12 ++++++++---- > 4 files changed, 16 insertions(+), 23 deletions(-) > > diff --git a/include/linux/execmem.h b/include/linux/execmem.h > index 68b2bfc79993..b9a97fcdf3c5 100644 > --- a/include/linux/execmem.h > +++ b/include/linux/execmem.h > @@ -4,6 +4,14 @@ > > #include <linux/types.h> > > +#if (defined(CONFIG_KASAN_GENERIC) || defined(CONFIG_KASAN_SW_TAGS)) && \ > + !defined(CONFIG_KASAN_VMALLOC) > +#include <linux/kasan.h> > +#define MODULE_ALIGN (PAGE_SIZE << KASAN_SHADOW_SCALE_SHIFT) > +#else > +#define MODULE_ALIGN PAGE_SIZE > +#endif > + > /** > * struct execmem_range - definition of a memory range suitable for code and > * related data allocations > diff --git a/include/linux/moduleloader.h b/include/linux/moduleloader.h > index b3374342f7af..4321682fe849 100644 > --- a/include/linux/moduleloader.h > +++ b/include/linux/moduleloader.h > @@ -25,10 +25,6 @@ int module_frob_arch_sections(Elf_Ehdr *hdr, > /* Additional bytes needed by arch in front of individual sections */ > unsigned int arch_mod_section_prepend(struct module *mod, unsigned int section); > > -/* Allocator used for allocating struct module, core sections and init > - sections. Returns NULL on failure. */ > -void *module_alloc(unsigned long size); > - > /* Determines if the section name is an init section (that is only used during > * module loading). > */ > @@ -113,12 +109,4 @@ void module_arch_cleanup(struct module *mod); > /* Any cleanup before freeing mod->module_init */ > void module_arch_freeing_init(struct module *mod); > > -#if (defined(CONFIG_KASAN_GENERIC) || defined(CONFIG_KASAN_SW_TAGS)) && \ > - !defined(CONFIG_KASAN_VMALLOC) > -#include <linux/kasan.h> > -#define MODULE_ALIGN (PAGE_SIZE << KASAN_SHADOW_SCALE_SHIFT) > -#else > -#define MODULE_ALIGN PAGE_SIZE > -#endif > - > #endif > diff --git a/kernel/module/main.c b/kernel/module/main.c > index 43810a3bdb81..b445c5ad863a 100644 > --- a/kernel/module/main.c > +++ b/kernel/module/main.c > @@ -1600,13 +1600,6 @@ static void free_modinfo(struct module *mod) > } > } > > -void * __weak module_alloc(unsigned long size) > -{ > - return __vmalloc_node_range(size, 1, VMALLOC_START, VMALLOC_END, > - GFP_KERNEL, PAGE_KERNEL_EXEC, VM_FLUSH_RESET_PERMS, > - NUMA_NO_NODE, __builtin_return_address(0)); > -} > - > bool __weak module_init_section(const char *name) > { > return strstarts(name, ".init"); > diff --git a/mm/execmem.c b/mm/execmem.c > index 2fe36dcc7bdf..a67acd75ffef 100644 > --- a/mm/execmem.c > +++ b/mm/execmem.c > @@ -59,9 +59,6 @@ void *execmem_text_alloc(size_t size) > unsigned long fallback_end = execmem_params.modules.text.fallback_end; > bool kasan = execmem_params.modules.flags & EXECMEM_KASAN_SHADOW; > > - if (!execmem_params.modules.text.start) > - return module_alloc(size); > - > return execmem_alloc(size, start, end, align, pgprot, > fallback_start, fallback_end, kasan); > } > @@ -108,8 +105,15 @@ void __init execmem_init(void) > { > struct execmem_params *p = execmem_arch_params(); > > - if (!p) > + if (!p) { > + p = &execmem_params; > + p->modules.text.start = VMALLOC_START; > + p->modules.text.end = VMALLOC_END; > + p->modules.text.pgprot = PAGE_KERNEL_EXEC; > + p->modules.text.alignment = 1; > + > return; > + } > > if (!execmem_validate_params(p)) > return; > -- > 2.35.1 >
diff --git a/include/linux/execmem.h b/include/linux/execmem.h index 68b2bfc79993..b9a97fcdf3c5 100644 --- a/include/linux/execmem.h +++ b/include/linux/execmem.h @@ -4,6 +4,14 @@ #include <linux/types.h> +#if (defined(CONFIG_KASAN_GENERIC) || defined(CONFIG_KASAN_SW_TAGS)) && \ + !defined(CONFIG_KASAN_VMALLOC) +#include <linux/kasan.h> +#define MODULE_ALIGN (PAGE_SIZE << KASAN_SHADOW_SCALE_SHIFT) +#else +#define MODULE_ALIGN PAGE_SIZE +#endif + /** * struct execmem_range - definition of a memory range suitable for code and * related data allocations diff --git a/include/linux/moduleloader.h b/include/linux/moduleloader.h index b3374342f7af..4321682fe849 100644 --- a/include/linux/moduleloader.h +++ b/include/linux/moduleloader.h @@ -25,10 +25,6 @@ int module_frob_arch_sections(Elf_Ehdr *hdr, /* Additional bytes needed by arch in front of individual sections */ unsigned int arch_mod_section_prepend(struct module *mod, unsigned int section); -/* Allocator used for allocating struct module, core sections and init - sections. Returns NULL on failure. */ -void *module_alloc(unsigned long size); - /* Determines if the section name is an init section (that is only used during * module loading). */ @@ -113,12 +109,4 @@ void module_arch_cleanup(struct module *mod); /* Any cleanup before freeing mod->module_init */ void module_arch_freeing_init(struct module *mod); -#if (defined(CONFIG_KASAN_GENERIC) || defined(CONFIG_KASAN_SW_TAGS)) && \ - !defined(CONFIG_KASAN_VMALLOC) -#include <linux/kasan.h> -#define MODULE_ALIGN (PAGE_SIZE << KASAN_SHADOW_SCALE_SHIFT) -#else -#define MODULE_ALIGN PAGE_SIZE -#endif - #endif diff --git a/kernel/module/main.c b/kernel/module/main.c index 43810a3bdb81..b445c5ad863a 100644 --- a/kernel/module/main.c +++ b/kernel/module/main.c @@ -1600,13 +1600,6 @@ static void free_modinfo(struct module *mod) } } -void * __weak module_alloc(unsigned long size) -{ - return __vmalloc_node_range(size, 1, VMALLOC_START, VMALLOC_END, - GFP_KERNEL, PAGE_KERNEL_EXEC, VM_FLUSH_RESET_PERMS, - NUMA_NO_NODE, __builtin_return_address(0)); -} - bool __weak module_init_section(const char *name) { return strstarts(name, ".init"); diff --git a/mm/execmem.c b/mm/execmem.c index 2fe36dcc7bdf..a67acd75ffef 100644 --- a/mm/execmem.c +++ b/mm/execmem.c @@ -59,9 +59,6 @@ void *execmem_text_alloc(size_t size) unsigned long fallback_end = execmem_params.modules.text.fallback_end; bool kasan = execmem_params.modules.flags & EXECMEM_KASAN_SHADOW; - if (!execmem_params.modules.text.start) - return module_alloc(size); - return execmem_alloc(size, start, end, align, pgprot, fallback_start, fallback_end, kasan); } @@ -108,8 +105,15 @@ void __init execmem_init(void) { struct execmem_params *p = execmem_arch_params(); - if (!p) + if (!p) { + p = &execmem_params; + p->modules.text.start = VMALLOC_START; + p->modules.text.end = VMALLOC_END; + p->modules.text.pgprot = PAGE_KERNEL_EXEC; + p->modules.text.alignment = 1; + return; + } if (!execmem_validate_params(p)) return;