forked from luck/tmp_suning_uos_patched
mm: Allow to kill tasks doing pcpu_alloc() and waiting for pcpu_balance_workfn()
In case of memory deficit and low percpu memory pages, pcpu_balance_workfn() takes pcpu_alloc_mutex for a long time (as it makes memory allocations itself and waits for memory reclaim). If tasks doing pcpu_alloc() are choosen by OOM killer, they can't exit, because they are waiting for the mutex. The patch makes pcpu_alloc() to care about killing signal and use mutex_lock_killable(), when it's allowed by GFP flags. This guarantees, a task does not miss SIGKILL from OOM killer. Signed-off-by: Kirill Tkhai <ktkhai@virtuozzo.com> Signed-off-by: Tejun Heo <tj@kernel.org>
This commit is contained in:
parent
71546d1004
commit
f52ba1fef7
13
mm/percpu.c
13
mm/percpu.c
|
@ -1373,8 +1373,17 @@ static void __percpu *pcpu_alloc(size_t size, size_t align, bool reserved,
|
|||
return NULL;
|
||||
}
|
||||
|
||||
if (!is_atomic)
|
||||
mutex_lock(&pcpu_alloc_mutex);
|
||||
if (!is_atomic) {
|
||||
/*
|
||||
* pcpu_balance_workfn() allocates memory under this mutex,
|
||||
* and it may wait for memory reclaim. Allow current task
|
||||
* to become OOM victim, in case of memory pressure.
|
||||
*/
|
||||
if (gfp & __GFP_NOFAIL)
|
||||
mutex_lock(&pcpu_alloc_mutex);
|
||||
else if (mutex_lock_killable(&pcpu_alloc_mutex))
|
||||
return NULL;
|
||||
}
|
||||
|
||||
spin_lock_irqsave(&pcpu_lock, flags);
|
||||
|
||||
|
|
Loading…
Reference in New Issue
Block a user