[PATCH] fix OOM killing of swapoff
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: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
committed by
Linus Torvalds
parent
c8af57eb76
commit
7ba3485947
@@ -60,12 +60,6 @@ unsigned long badness(struct task_struct *p, unsigned long uptime)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* 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.
|
* The memory size of the process is the basis for the badness.
|
||||||
*/
|
*/
|
||||||
@@ -76,6 +70,12 @@ unsigned long badness(struct task_struct *p, unsigned long uptime)
|
|||||||
*/
|
*/
|
||||||
task_unlock(p);
|
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
|
* Processes which fork a lot of child processes are likely
|
||||||
* a good choice. We add half the vmsize of the children if they
|
* a good choice. We add half the vmsize of the children if they
|
||||||
|
Reference in New Issue
Block a user