On Wed, 14 Mar 2018 14:51:48 +0300 Kirill Tkhai <ktkhai@xxxxxxxxxxxxx> wrote: > 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. > > ... > > --- a/mm/percpu.c > +++ b/mm/percpu.c > @@ -1369,8 +1369,12 @@ 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) { > + if (gfp & __GFP_NOFAIL) > + mutex_lock(&pcpu_alloc_mutex); > + else if (mutex_lock_killable(&pcpu_alloc_mutex)) > + return NULL; > + } It would benefit from a comment explaining why we're doing this (it's for the oom-killer). My memory is weak and our documentation is awful. What does mutex_lock_killable() actually do and how does it differ from mutex_lock_interruptible()? Userspace tasks can run pcpu_alloc() and I wonder if there's any way in which a userspace-delivered signal can disrupt another userspace task's memory allocation attempt?