[kernel] r16860 - in dists/sid/linux-2.6/debian: . patches/bugfix/all patches/series
Aurelien Jarno
aurel32 at alioth.debian.org
Tue Feb 1 22:23:36 UTC 2011
Author: aurel32
Date: Tue Feb 1 22:23:34 2011
New Revision: 16860
Log:
* init: fix race between init and kthreadd, fixes a kernel panic on
mips/5kc-malta.
Added:
dists/sid/linux-2.6/debian/patches/bugfix/all/init-sched-Fix-race-between-init-and-kthreadd.patch
Modified:
dists/sid/linux-2.6/debian/changelog
dists/sid/linux-2.6/debian/patches/series/31
Modified: dists/sid/linux-2.6/debian/changelog
==============================================================================
--- dists/sid/linux-2.6/debian/changelog Mon Jan 31 00:21:49 2011 (r16859)
+++ dists/sid/linux-2.6/debian/changelog Tue Feb 1 22:23:34 2011 (r16860)
@@ -21,6 +21,10 @@
* Update openvz patch to 07aaa2e9fb25 (ipv6, checkpointing, stability,
ipsec, ppp, tc). (closes: #607041)
+ [ Aurelien Jarno ]
+ * init: fix race between init and kthreadd, fixes a kernel panic on
+ mips/5kc-malta.
+
-- Ian Campbell <ijc at hellion.org.uk> Thu, 13 Jan 2011 07:07:54 +0000
linux-2.6 (2.6.32-30) unstable; urgency=high
Added: dists/sid/linux-2.6/debian/patches/bugfix/all/init-sched-Fix-race-between-init-and-kthreadd.patch
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ dists/sid/linux-2.6/debian/patches/bugfix/all/init-sched-Fix-race-between-init-and-kthreadd.patch Tue Feb 1 22:23:34 2011 (r16860)
@@ -0,0 +1,61 @@
+commit b433c3d4549ae74935b585115f076c6fb7bc48fe
+Author: Peter Zijlstra <peterz at infradead.org>
+Date: Mon Jun 28 16:51:01 2010 +0200
+
+ init, sched: Fix race between init and kthreadd
+
+ Ilya reported that on a very slow machine he could reliably
+ reproduce a race between forking init and kthreadd. We first
+ fork init so that it obtains pid-1, however since the scheduler
+ is already fully running at this point it can preempt and run
+ the init thread before we spawn and set kthreadd_task.
+
+ The init thread can then attempt spawning kthreads without
+ kthreadd being present which results in an OOPS.
+
+ Reported-by: Ilya Loginov <isloginov at gmail.com>
+ Signed-off-by: Peter Zijlstra <a.p.zijlstra at chello.nl>
+ Acked-by: Linus Torvalds <torvalds at linux-foundation.org>
+ LKML-Reference: <1277736661.3561.110.camel at laptop>
+ Signed-off-by: Ingo Molnar <mingo at elte.hu>
+
+diff --git a/init/main.c b/init/main.c
+index 4051d75..1566130 100644
+--- a/init/main.c
++++ b/init/main.c
+@@ -413,16 +413,24 @@ static void __init setup_command_line(char *command_line)
+ * gcc-3.4 accidentally inlines this function, so use noinline.
+ */
+
++static __initdata DECLARE_COMPLETION(kthreadd_done);
++
+ static noinline void __init_refok rest_init(void)
+ __releases(kernel_lock)
+ {
+ int pid;
+
+ rcu_scheduler_starting();
++ /*
++ * We need to spawn init first so that it obtains pid-1, however
++ * the init task will end up wanting to create kthreads, which, if
++ * we schedule it before we create kthreadd, will OOPS.
++ */
+ kernel_thread(kernel_init, NULL, CLONE_FS | CLONE_SIGHAND);
+ numa_default_policy();
+ pid = kernel_thread(kthreadd, NULL, CLONE_FS | CLONE_FILES);
+ kthreadd_task = find_task_by_pid_ns(pid, &init_pid_ns);
++ complete(&kthreadd_done);
+ unlock_kernel();
+
+ /*
+@@ -846,6 +854,10 @@ static noinline int init_post(void)
+
+ static int __init kernel_init(void * unused)
+ {
++ /*
++ * Wait until kthreadd is all set-up.
++ */
++ wait_for_completion(&kthreadd_done);
+ lock_kernel();
+
+ /*
Modified: dists/sid/linux-2.6/debian/patches/series/31
==============================================================================
--- dists/sid/linux-2.6/debian/patches/series/31 Mon Jan 31 00:21:49 2011 (r16859)
+++ dists/sid/linux-2.6/debian/patches/series/31 Tue Feb 1 22:23:34 2011 (r16860)
@@ -11,3 +11,4 @@
+ bugfix/all/xfs-fix-untrusted-inode-number-lookup.patch
+ bugfix/all/r8169-keep-firmware-in-memory.patch
+ bugfix/all/av7110-check-for-negative-array-offset.patch
++ bugfix/all/init-sched-Fix-race-between-init-and-kthreadd.patch
More information about the Kernel-svn-changes
mailing list