lkml.org 
[lkml]   [2010]   [Jun]   [8]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    From
    SubjectRe: [PATCH 12/12] oom: give current access to memory reserves if it has been killed
    Date
    > From: David Rientjes <rientjes@google.com>
    >
    > It's possible to livelock the page allocator if a thread has
    > mm->mmap_sem and fails to make forward progress because the
    > oom killer selects another thread sharing the same ->mm to
    > kill that cannot exit until the semaphore is dropped.
    >
    > The oom killer will not kill multiple tasks at the same time; each oom
    > killed task must exit before another task may be killed. Thus, if one
    > thread is holding mm->mmap_sem and cannot allocate memory, all threads
    > sharing the same ->mm are blocked from exiting as well. In the oom kill
    > case, that means the thread holding mm->mmap_sem will never free
    > additional memory since it cannot get access to memory reserves and the
    > thread that depends on it with access to memory reserves cannot exit
    > because it cannot acquire the semaphore. Thus, the page allocators
    > livelocks.
    >
    > When the oom killer is called and current happens to have a pending
    > SIGKILL, this patch automatically gives it access to memory reserves and
    > returns. Upon returning to the page allocator, its allocation will
    > hopefully succeed so it can quickly exit and free its memory. If not,
    > the page allocator will fail the allocation if it is not __GFP_NOFAIL.
    >
    > Reviewed-by: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com>
    > Signed-off-by: David Rientjes <rientjes@google.com>
    > Signed-off-by: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>
    > ---
    > mm/oom_kill.c | 10 ++++++++++
    > 1 files changed, 10 insertions(+), 0 deletions(-)
    >
    > diff --git a/mm/oom_kill.c b/mm/oom_kill.c
    > index 67b5fa5..ad85e1b 100644
    > --- a/mm/oom_kill.c
    > +++ b/mm/oom_kill.c
    > @@ -638,6 +638,16 @@ void out_of_memory(struct zonelist *zonelist, gfp_t gfp_mask,
    > }
    >
    > /*
    > + * If current has a pending SIGKILL, then automatically select it. The
    > + * goal is to allow it to allocate so that it may quickly exit and free
    > + * its memory.
    > + */
    > + if (fatal_signal_pending(current)) {
    > + set_tsk_thread_flag(current, TIF_MEMDIE);
    > + return;
    > + }

    Self NAK this.
    We have no gurantee that current is oom killable. Oh, here is
    out_of_memory(), sigh.





    \
     
     \ /
      Last update: 2010-06-08 13:45    [W:2.938 / U:0.268 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site