Re: [patch] mm: memcg: do not declare OOM from __GFP_NOFAIL allocations

Johannes Weiner
2013-11-27T22:53:40Z

On Wed, Nov 27, 2013 at 01:38:59PM -0800, David Rientjes wrote:
> On Wed, 27 Nov 2013, Johannes Weiner wrote:
>
> > > Ah, this is because of 3168ecbe1c04 ("mm: memcg: use proper memcg in limit
> > > bypass") which just bypasses all of these allocations and charges the root
> > > memcg. So if allocations want to bypass memcg isolation they just have to
> > > be __GFP_NOFAIL?
> >
> > I don't think we have another option.
> >
>
> We don't give __GFP_NOFAIL allocations access to memory reserves in the
> page allocator and we do call the oom killer for them so that a process is
> killed so that memory is freed. Why do we have a different policy for
> memcg?

Oh boy, that's the epic story we dealt with all throughout the last
merge window... ;-)

__GFP_NOFAIL allocations might come in with various filesystem locks
held that could prevent an OOM victim from exiting, so a loop around
the OOM killer in an allocation context is prone to loop endlessly.

Because of this, I changed memcg to never invoke OOM kills from the
allocation context anymore but save it for the end of the page fault
handler. __GFP_NOFAIL allocations can not fail and thus do not reach
the end of the page fault, so no OOM kill invocation possible.

Arguably, the page allocator should also just return NULL and leave
OOM killing to pagefault_out_of_memory(), but it's much less likely to
get stuck since the overall system has more chances of producing free
memory even without an OOM kill than a memcg with a single process and
no swap for example.