mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-11 04:18:39 +08:00
[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:
parent
c8af57eb76
commit
7ba3485947
@ -60,12 +60,6 @@ unsigned long badness(struct task_struct *p, unsigned long uptime)
|
||||
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.
|
||||
*/
|
||||
@ -76,6 +70,12 @@ unsigned long badness(struct task_struct *p, unsigned long uptime)
|
||||
*/
|
||||
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
|
||||
|
Loading…
Reference in New Issue
Block a user