On Wed, Mar 27, 2013 at 06:22:10PM -0700, David Rientjes wrote: > A memcg may livelock when oom if the process that grabs the hierarchy's > oom lock is never the first process with PF_EXITING set in the memcg's > task iteration. > > The oom killer, both global and memcg, will defer if it finds an eligible > process that is in the process of exiting and it is not being ptraced. > The idea is to allow it to exit without using memory reserves before > needlessly killing another process. > > This normally works fine except in the memcg case with a large number of > threads attached to the oom memcg. In this case, the memcg oom killer > only gets called for the process that grabs the hierarchy's oom lock; all > others end up blocked on the memcg's oom waitqueue. Thus, if the process > that grabs the hierarchy's oom lock is never the first PF_EXITING process > in the memcg's task iteration, the oom killer is constantly deferred > without anything making progress. > > The fix is to give PF_EXITING processes access to memory reserves so that > we've marked them as oom killed without any iteration. This allows > __mem_cgroup_try_charge() to succeed so that the process may exit. This > makes the memcg oom killer exemption for TIF_MEMDIE tasks, now > immediately granted for processes with pending SIGKILLs and those in the > exit path, to be equivalent to what is done for the global oom killer. > > Signed-off-by: David Rientjes <rient...@google.com>
Acked-by: Johannes Weiner <han...@cmpxchg.org> -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/