On Fri, Jun 16, 2023 at 1:51 AM Mike Rapoport <rppt@xxxxxxxxxx> wrote: > > From: "Mike Rapoport (IBM)" <rppt@xxxxxxxxxx> > > 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@xxxxxxxxxx> Acked-by: Song Liu <song@xxxxxxxxxx> > --- > 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 >