From: Chris Wright Date: Sat, 6 Jan 2007 01:10:18 +0000 (-0800) Subject: add oom during swapoff fix from Hugh X-Git-Tag: v2.6.19.2~5 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=44e05e65414d17de8953c743635061dc725780d0;p=thirdparty%2Fkernel%2Fstable-queue.git add oom during swapoff fix from Hugh --- 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 index 00000000000..c711cda42f4 --- /dev/null +++ b/queue-2.6.19/fix-oom-killing-of-swapoff.patch @@ -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 + +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 +Cc: +Signed-off-by: Andrew Morton +Signed-off-by: Chris Wright +--- + + 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 diff --git a/queue-2.6.19/series b/queue-2.6.19/series index d7d3e8f83d2..10f29de5318 100644 --- a/queue-2.6.19/series +++ b/queue-2.6.19/series @@ -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