[Adding Eric to CC]

On Thu 14-11-13 15:26:51, David Rientjes wrote:
> When current has a pending SIGKILL or is already in the exit path, it
> only needs access to memory reserves to fully exit.  In that sense, the
> memcg is not actually oom for current, it simply needs to bypass memory
> charges to exit and free its memory, which is guarantee itself that
> memory will be freed.
> 
> We only want to notify userspace for actionable oom conditions where
> something needs to be done (and all oom handling can already be deferred
> to userspace through this method by disabling the memcg oom killer with
> memory.oom_control), not simply when a memcg has reached its limit, which
> would actually have to happen before memcg reclaim actually frees memory
> for charges.

I believe this also fixes the issue reported by Eric
(https://lkml.org/lkml/2013/7/28/74). I had a patch for this
https://lkml.org/lkml/2013/7/31/94 but the code changed since then and
this should be equivalent.
 
> Reported-by: Johannes Weiner <han...@cmpxchg.org>
> Signed-off-by: David Rientjes <rient...@google.com>
> ---
>  mm/memcontrol.c | 20 ++++++++++----------
>  1 file changed, 10 insertions(+), 10 deletions(-)
> 
> diff --git a/mm/memcontrol.c b/mm/memcontrol.c
> --- a/mm/memcontrol.c
> +++ b/mm/memcontrol.c
> @@ -1783,16 +1783,6 @@ static void mem_cgroup_out_of_memory(struct mem_cgroup 
> *memcg, gfp_t gfp_mask,
>       unsigned int points = 0;
>       struct task_struct *chosen = NULL;
>  
> -     /*
> -      * If current has a pending SIGKILL or is exiting, 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) || current->flags & PF_EXITING) {
> -             set_thread_flag(TIF_MEMDIE);
> -             return;
> -     }
> -
>       check_panic_on_oom(CONSTRAINT_MEMCG, gfp_mask, order, NULL);
>       totalpages = mem_cgroup_get_limit(memcg) >> PAGE_SHIFT ? : 1;
>       for_each_mem_cgroup_tree(iter, memcg) {
> @@ -2243,6 +2233,16 @@ bool mem_cgroup_oom_synchronize(bool handle)
>       if (!handle)
>               goto cleanup;
>  
> +     /*
> +      * If current has a pending SIGKILL or is exiting, 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) || current->flags & PF_EXITING) {
> +             set_thread_flag(TIF_MEMDIE);
> +             goto cleanup;
> +     }
> +
>       owait.memcg = memcg;
>       owait.wait.flags = 0;
>       owait.wait.func = memcg_oom_wake_function;

-- 
Michal Hocko
SUSE Labs
--
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/

Reply via email to