--- /dev/null
+From stable-bounces@linux.kernel.org Fri Jan 5 16:57:46 2007
+Message-Id: <200701060037.l060bUhd013413@shell0.pdx.osdl.net>
+To: torvalds@osdl.org
+From: akpm@osdl.org
+Date: Fri, 05 Jan 2007 16:37:03 -0800
+Cc: akpm@osdl.org, hugh@veritas.com, stable@kernel.org
+Subject: fix OOM killing of swapoff
+
+From: Hugh Dickins <hugh@veritas.com>
+
+These days, if you swapoff when there isn't enough memory, OOM killer gives
+"BUG: scheduling while atomic" and the machine hangs: badness() needs to do
+its PF_SWAPOFF return after the task_unlock (tasklist_lock is also held
+here, so p isn't going to be freed: PF_SWAPOFF might get turned off at any
+moment, but that doesn't really matter).
+
+Signed-off-by: Hugh Dickins <hugh@veritas.com>
+Cc: <stable@kernel.org>
+Signed-off-by: Andrew Morton <akpm@osdl.org>
+Signed-off-by: Chris Wright <chrisw@sous-sol.org>
+---
+
+ mm/oom_kill.c | 12 ++++++------
+ 1 file changed, 6 insertions(+), 6 deletions(-)
+
+--- linux-2.6.19.1.orig/mm/oom_kill.c
++++ linux-2.6.19.1/mm/oom_kill.c
+@@ -61,12 +61,6 @@ unsigned long badness(struct task_struct
+ }
+
+ /*
+- * swapoff can easily use up all memory, so kill those first.
+- */
+- if (p->flags & PF_SWAPOFF)
+- return ULONG_MAX;
+-
+- /*
+ * The memory size of the process is the basis for the badness.
+ */
+ points = mm->total_vm;
+@@ -77,6 +71,12 @@ unsigned long badness(struct task_struct
+ task_unlock(p);
+
+ /*
++ * swapoff can easily use up all memory, so kill those first.
++ */
++ if (p->flags & PF_SWAPOFF)
++ return ULONG_MAX;
++
++ /*
+ * Processes which fork a lot of child processes are likely
+ * a good choice. We add half the vmsize of the children if they
+ * have an own mm. This prevents forking servers to flood the