Re: [PATCH RFC] mm: don't raise MEMCG_OOM event due to failed high-order allocation

From: David Rientjes
Date: Mon Sep 10 2018 - 20:40:24 EST


On Mon, 10 Sep 2018, Roman Gushchin wrote:

> The memcg OOM killer is never invoked due to a failed high-order
> allocation, however the MEMCG_OOM event can be easily raised.
>
> Under some memory pressure it can happen easily because of a
> concurrent allocation. Let's look at try_charge(). Even if we were
> able to reclaim enough memory, this check can fail due to a race
> with another allocation:
>
> if (mem_cgroup_margin(mem_over_limit) >= nr_pages)
> goto retry;
>
> For regular pages the following condition will save us from triggering
> the OOM:
>
> if (nr_reclaimed && nr_pages <= (1 << PAGE_ALLOC_COSTLY_ORDER))
> goto retry;
>
> But for high-order allocation this condition will intentionally fail.
> The reason behind is that we'll likely fall to regular pages anyway,
> so it's ok and even preferred to return ENOMEM.
>
> In this case the idea of raising the MEMCG_OOM event looks dubious.
>
> Fix this by moving MEMCG_OOM raising to mem_cgroup_oom() after
> allocation order check, so that the event won't be raised for high
> order allocations.
>
> Signed-off-by: Roman Gushchin <guro@xxxxxx>
> Cc: Johannes Weiner <hannes@xxxxxxxxxxx>
> Cc: Michal Hocko <mhocko@xxxxxxxxxx>
> Cc: Vladimir Davydov <vdavydov.dev@xxxxxxxxx>

Acked-by: David Rientjes <rientjes@xxxxxxxxxx>