]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
add oom during swapoff fix from Hugh
authorChris Wright <chrisw@sous-sol.org>
Sat, 6 Jan 2007 01:10:18 +0000 (17:10 -0800)
committerChris Wright <chrisw@sous-sol.org>
Sat, 6 Jan 2007 01:10:18 +0000 (17:10 -0800)
queue-2.6.19/fix-oom-killing-of-swapoff.patch [new file with mode: 0644]
queue-2.6.19/series

diff --git a/queue-2.6.19/fix-oom-killing-of-swapoff.patch b/queue-2.6.19/fix-oom-killing-of-swapoff.patch
new file mode 100644 (file)
index 0000000..c711cda
--- /dev/null
@@ -0,0 +1,53 @@
+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
index d7d3e8f83d2a68f6010ed799c044f9b560671136..10f29de5318e6363a43d115f038e30a6a05fceb3 100644 (file)
@@ -46,3 +46,4 @@ ipv4-ipv6-fix-inet-6-device-initialization-order.patch
 asix-fix-typo-for-ax88772-phy-selection.patch
 netlabel-correctly-fill-in-unused-cipsov4-level-and-category-mappings.patch
 connector-some-fixes-for-ia64-unaligned-access-errors.patch
+fix-oom-killing-of-swapoff.patch