Commit 322bb616 authored by Andrew Morton's avatar Andrew Morton Committed by Linus Torvalds

[PATCH] ipc_init() uses vmalloc too early

From: Andrea Arcangeli <andrea@suse.de>

aka: "vmalloc allocations in ipc needs smp initialized (and vm must be
allowed to schedule in 2.6)"

In short if you change SEMMNI to 8192 the kernel will crash at boot, beause
it tries to call vmalloc before the smp is initialized.  The reason is that
vmalloc calls into the pte alloc code, and the fast pte alloc is tried
first, but that reads into the pte_quicklist, that requires the cpu_data to
be initialized (and that happens in smp_init()).

the patch is obviously safe, since no piece of kernel (especially the code
in the check_bugs and smp_init paths ;) calls into the ipc subsystem.

The reason this started to trigger wasn't really that we increased SEMMNI,
but what happend is that some IPC data structure grown, and for some reason
the corruption due the uninitalized pte_quicklist triggers only for smp
boxes with less than 1G (not very common anymore ;).  So it wasn't
immediatly reproducible on all setups.

2.6 doesn't suffer from the same problem, simply because 2.6 isn't using
the quicklist anymore, but I think it would be much more correct to make
the same change in 2.6 too, since whatever cond_resched() in the vm paths
(and they're definitely allowed to call it), will lead to a crash since the
init task isn't initialized and the scheduler can't be invoked yet.  (and
2.6 already has the bigger data structures that should trigger the vmalloc
all the time on all setups)
parent ab05d4ab
......@@ -89,10 +89,6 @@ extern void driver_init(void);
extern void tc_init(void);
#endif
#if defined(CONFIG_SYSVIPC)
extern void ipc_init(void);
#endif
/*
* Are we up and running (ie do we have all the infrastructure
* set up)
......@@ -448,9 +444,6 @@ asmlinkage void __init start_kernel(void)
populate_rootfs();
#ifdef CONFIG_PROC_FS
proc_root_init();
#endif
#if defined(CONFIG_SYSVIPC)
ipc_init();
#endif
check_bugs();
printk("POSIX conformance testing by UNIFIX\n");
......
......@@ -36,13 +36,14 @@
* memory are initialised
*/
void __init ipc_init (void)
static int __init ipc_init(void)
{
sem_init();
msg_init();
shm_init();
return;
return 0;
}
__initcall(ipc_init);
/**
* ipc_init_ids - initialise IPC identifiers
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment