x86/modules: Set VM_FLUSH_RESET_PERMS in module_alloc()
authorThomas Gleixner <tglx@linutronix.de>
Thu, 15 Sep 2022 11:10:44 +0000 (13:10 +0200)
committerPeter Zijlstra <peterz@infradead.org>
Mon, 17 Oct 2022 14:40:57 +0000 (16:40 +0200)
Instead of resetting permissions all over the place when freeing module
memory tell the vmalloc code to do so. Avoids the exercise for the next
upcoming user.

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Link: https://lore.kernel.org/r/20220915111143.406703869@infradead.org
arch/x86/kernel/ftrace.c
arch/x86/kernel/kprobes/core.c
arch/x86/kernel/module.c

index bd16500..00eac45 100644 (file)
@@ -413,8 +413,6 @@ create_trampoline(struct ftrace_ops *ops, unsigned int *tramp_size)
        /* ALLOC_TRAMP flags lets us know we created it */
        ops->flags |= FTRACE_OPS_FL_ALLOC_TRAMP;
 
-       set_vm_flush_reset_perms(trampoline);
-
        if (likely(system_state != SYSTEM_BOOTING))
                set_memory_ro((unsigned long)trampoline, npages);
        set_memory_x((unsigned long)trampoline, npages);
index eb8bc82..01b8d95 100644 (file)
@@ -414,7 +414,6 @@ void *alloc_insn_page(void)
        if (!page)
                return NULL;
 
-       set_vm_flush_reset_perms(page);
        /*
         * First make the page read-only, and only then make it executable to
         * prevent it from being W+X in between.
index c032edc..43f0112 100644 (file)
@@ -74,10 +74,11 @@ void *module_alloc(unsigned long size)
                return NULL;
 
        p = __vmalloc_node_range(size, MODULE_ALIGN,
-                                   MODULES_VADDR + get_module_load_offset(),
-                                   MODULES_END, gfp_mask,
-                                   PAGE_KERNEL, VM_DEFER_KMEMLEAK, NUMA_NO_NODE,
-                                   __builtin_return_address(0));
+                                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 (p && (kasan_alloc_module_shadow(p, size, gfp_mask) < 0)) {
                vfree(p);
                return NULL;