Thread (49 messages) 49 messages, 7 authors, 2023-11-07

Re: [PATCH v3 04/13] mm/execmem, arch: convert remaining overrides of module_alloc to execmem

From: "Edgecombe, Rick P" <rick.p.edgecombe@intel.com>
Date: 2023-10-04 00:29:45
Also in: bpf, linux-arm-kernel, linux-mips, linux-mm, linux-modules, linux-riscv, linux-s390, linux-trace-kernel, lkml, loongarch, netdev, sparclinux

On Mon, 2023-09-18 at 10:29 +0300, Mike Rapoport wrote:
quoted hunk ↗ jump to hunk
diff --git a/arch/x86/kernel/module.c b/arch/x86/kernel/module.c
index 5f71a0cf4399..9d37375e2f05 100644
--- a/arch/x86/kernel/module.c
+++ b/arch/x86/kernel/module.c
@@ -19,6 +19,7 @@
 #include <linux/jump_label.h>
 #include <linux/random.h>
 #include <linux/memory.h>
+#include <linux/execmem.h>
 
 #include <asm/text-patching.h>
 #include <asm/page.h>
@@ -36,55 +37,30 @@ do
{                                                        \
 } while (0)
 #endif
 
-#ifdef CONFIG_RANDOMIZE_BASE
-static unsigned long module_load_offset;
+static struct execmem_params execmem_params __ro_after_init = {
+       .ranges = {
+               [EXECMEM_DEFAULT] = {
+                       .flags = EXECMEM_KASAN_SHADOW,
+                       .alignment = MODULE_ALIGN,
+               },
+       },
+};
 
-/* Mutex protects the module_load_offset. */
-static DEFINE_MUTEX(module_kaslr_mutex);
-
-static unsigned long int get_module_load_offset(void)
-{
-       if (kaslr_enabled()) {
-               mutex_lock(&module_kaslr_mutex);
-               /*
-                * Calculate the module_load_offset the first time
this
-                * code is called. Once calculated it stays the same
until
-                * reboot.
-                */
-               if (module_load_offset == 0)
-                       module_load_offset =
-                               get_random_u32_inclusive(1, 1024) *
PAGE_SIZE;
-               mutex_unlock(&module_kaslr_mutex);
-       }
-       return module_load_offset;
-}
-#else
-static unsigned long int get_module_load_offset(void)
-{
-       return 0;
-}
-#endif
-
-void *module_alloc(unsigned long size)
+struct execmem_params __init *execmem_arch_params(void)
 {
-       gfp_t gfp_mask = GFP_KERNEL;
-       void *p;
-
-       if (PAGE_ALIGN(size) > MODULES_LEN)
-               return NULL;
+       unsigned long module_load_offset = 0;
+       unsigned long start;
 
-       p = __vmalloc_node_range(size, MODULE_ALIGN,
-                                MODULES_VADDR +
get_module_load_offset(),
-                                MODULES_END, gfp_mask, PAGE_KERNEL,
-                                VM_FLUSH_RESET_PERMS |
VM_DEFER_KMEMLEAK,
-                                NUMA_NO_NODE,
__builtin_return_address(0));
+       if (IS_ENABLED(CONFIG_RANDOMIZE_BASE) && kaslr_enabled())
+               module_load_offset =
+                       get_random_u32_inclusive(1, 1024) *
PAGE_SIZE;
Minor:
I think you can skip the IS_ENABLED(CONFIG_RANDOMIZE_BASE) part because
CONFIG_RANDOMIZE_MEMORY depends on CONFIG_RANDOMIZE_BASE (which is
checked in kaslr_enabled()).
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help