mirror of
https://github.com/torvalds/linux.git
synced 2025-12-07 20:06:24 +00:00
mm/execmem, arch: convert remaining overrides of module_alloc to execmem
Extend execmem parameters to accommodate more complex overrides of module_alloc() by architectures. This includes specification of a fallback range required by arm, arm64 and powerpc, EXECMEM_MODULE_DATA type required by powerpc, support for allocation of KASAN shadow required by s390 and x86 and support for late initialization of execmem required by arm64. The core implementation of execmem_alloc() takes care of suppressing warnings when the initial allocation fails but there is a fallback range defined. Signed-off-by: Mike Rapoport (IBM) <rppt@kernel.org> Acked-by: Will Deacon <will@kernel.org> Acked-by: Song Liu <song@kernel.org> Tested-by: Liviu Dudau <liviu@dudau.co.uk> Signed-off-by: Luis Chamberlain <mcgrof@kernel.org>
This commit is contained in:
committed by
Luis Chamberlain
parent
f6bec26c0a
commit
223b5e57d0
@@ -1188,24 +1188,20 @@ void __weak module_arch_freeing_init(struct module *mod)
|
||||
{
|
||||
}
|
||||
|
||||
static bool mod_mem_use_vmalloc(enum mod_mem_type type)
|
||||
{
|
||||
return IS_ENABLED(CONFIG_ARCH_WANTS_MODULES_DATA_IN_VMALLOC) &&
|
||||
mod_mem_type_is_core_data(type);
|
||||
}
|
||||
|
||||
static int module_memory_alloc(struct module *mod, enum mod_mem_type type)
|
||||
{
|
||||
unsigned int size = PAGE_ALIGN(mod->mem[type].size);
|
||||
enum execmem_type execmem_type;
|
||||
void *ptr;
|
||||
|
||||
mod->mem[type].size = size;
|
||||
|
||||
if (mod_mem_use_vmalloc(type))
|
||||
ptr = vmalloc(size);
|
||||
if (mod_mem_type_is_data(type))
|
||||
execmem_type = EXECMEM_MODULE_DATA;
|
||||
else
|
||||
ptr = execmem_alloc(EXECMEM_MODULE_TEXT, size);
|
||||
execmem_type = EXECMEM_MODULE_TEXT;
|
||||
|
||||
ptr = execmem_alloc(execmem_type, size);
|
||||
if (!ptr)
|
||||
return -ENOMEM;
|
||||
|
||||
@@ -1232,10 +1228,7 @@ static void module_memory_free(struct module *mod, enum mod_mem_type type)
|
||||
{
|
||||
void *ptr = mod->mem[type].base;
|
||||
|
||||
if (mod_mem_use_vmalloc(type))
|
||||
vfree(ptr);
|
||||
else
|
||||
execmem_free(ptr);
|
||||
execmem_free(ptr);
|
||||
}
|
||||
|
||||
static void free_mod_mem(struct module *mod)
|
||||
@@ -1630,13 +1623,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");
|
||||
|
||||
Reference in New Issue
Block a user