Revert "um: allocate a guard page to helper threads"
This reverts commitef4459a6da
("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:ef4459a6da
("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>
This commit is contained in:
parent
f4172b0843
commit
2fcb4090cd
|
@ -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){
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
Loading…
Reference in New Issue