]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/commitdiff
Revert "um: allocate a guard page to helper threads"
authorJohannes Berg <johannes.berg@intel.com>
Sun, 10 Jan 2021 18:05:08 +0000 (19:05 +0100)
committerRichard Weinberger <richard@nod.at>
Tue, 26 Jan 2021 21:11:38 +0000 (22:11 +0100)
This reverts commit ef4459a6da09 ("um: allocate a guard page to
helper threads"), it's broken in multiple ways:

 1) the free no longer matches the alloc; and

 2) more importantly, the set_memory_ro() causes allocation of
    page tables for the normal memory that doesn't have any,
    and that later causes corruption and crashes (usually but
    not always in vfree()).

We could fix the first bug and use vmalloc() to work around the
second, but set_memory_ro() actually doesn't do anything either
so I'll just revert that as well.

Reported-by: Benjamin Berg <benjamin@sipsolutions.net>
Fixes: ef4459a6da09 ("um: allocate a guard page to helper threads")
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Signed-off-by: Richard Weinberger <richard@nod.at>
arch/um/drivers/ubd_kern.c
arch/um/include/shared/kern_util.h
arch/um/kernel/process.c
arch/um/os-Linux/helper.c

index bd16b17ba4d6347a17d15b6f58ad4c6adc4d173f..8e0b43cf089f4761b3defb1fb1721bd37d3c2464 100644 (file)
@@ -1241,7 +1241,7 @@ static int __init ubd_driver_init(void){
                /* Letting ubd=sync be like using ubd#s= instead of ubd#= is
                 * enough. So use anyway the io thread. */
        }
-       stack = alloc_stack(0);
+       stack = alloc_stack(0, 0);
        io_pid = start_io_thread(stack + PAGE_SIZE - sizeof(void *),
                                 &thread_fd);
        if(io_pid < 0){
index d8c279e3312fe69ab409b35331aa34632e0dd8a7..2888ec812f6ece8721f63fb5818b5f1bef19b501 100644 (file)
@@ -19,7 +19,7 @@ extern int kmalloc_ok;
 #define UML_ROUND_UP(addr) \
        ((((unsigned long) addr) + PAGE_SIZE - 1) & PAGE_MASK)
 
-extern unsigned long alloc_stack(int atomic);
+extern unsigned long alloc_stack(int order, int atomic);
 extern void free_stack(unsigned long stack, int order);
 
 struct pt_regs;
index 2a986ece54780ddb55e436e1097c93337d57a5b1..81d508daf67cbc4299e28899a8811dfb143180d5 100644 (file)
@@ -32,7 +32,6 @@
 #include <os.h>
 #include <skas.h>
 #include <linux/time-internal.h>
-#include <asm/set_memory.h>
 
 /*
  * This is a per-cpu array.  A processor only modifies its entry and it only
@@ -63,18 +62,16 @@ void free_stack(unsigned long stack, int order)
        free_pages(stack, order);
 }
 
-unsigned long alloc_stack(int atomic)
+unsigned long alloc_stack(int order, int atomic)
 {
-       unsigned long addr;
+       unsigned long page;
        gfp_t flags = GFP_KERNEL;
 
        if (atomic)
                flags = GFP_ATOMIC;
-       addr = __get_free_pages(flags, 1);
+       page = __get_free_pages(flags, order);
 
-       set_memory_ro(addr, 1);
-
-       return addr + PAGE_SIZE;
+       return page;
 }
 
 static inline void set_current(struct task_struct *task)
index feb48d796e0050e1803fe1b637b3334447fcb7e3..9fa6e4187d4fb4bcd0d116169a0527c73d020e92 100644 (file)
@@ -45,7 +45,7 @@ int run_helper(void (*pre_exec)(void *), void *pre_data, char **argv)
        unsigned long stack, sp;
        int pid, fds[2], ret, n;
 
-       stack = alloc_stack(__cant_sleep());
+       stack = alloc_stack(0, __cant_sleep());
        if (stack == 0)
                return -ENOMEM;
 
@@ -116,7 +116,7 @@ int run_helper_thread(int (*proc)(void *), void *arg, unsigned int flags,
        unsigned long stack, sp;
        int pid, status, err;
 
-       stack = alloc_stack(__cant_sleep());
+       stack = alloc_stack(0, __cant_sleep());
        if (stack == 0)
                return -ENOMEM;