From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-10.0 required=3.0 tests=BAYES_00,INCLUDES_PATCH, MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 328C7C433E2 for ; Tue, 14 Jul 2020 14:06:45 +0000 (UTC) Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.kernel.org (Postfix) with ESMTP id F161B22510 for ; Tue, 14 Jul 2020 14:06:44 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org F161B22510 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=kernel.org Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=owner-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix) id 7AE536B0006; Tue, 14 Jul 2020 10:06:44 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 784DD6B000A; Tue, 14 Jul 2020 10:06:44 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 69C666B000C; Tue, 14 Jul 2020 10:06:44 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from forelay.hostedemail.com (smtprelay0198.hostedemail.com [216.40.44.198]) by kanga.kvack.org (Postfix) with ESMTP id 55B0D6B0006 for ; Tue, 14 Jul 2020 10:06:44 -0400 (EDT) Received: from smtpin10.hostedemail.com (10.5.19.251.rfc1918.com [10.5.19.251]) by forelay02.hostedemail.com (Postfix) with ESMTP id 0755340C7 for ; Tue, 14 Jul 2020 14:06:44 +0000 (UTC) X-FDA: 77036857128.10.coach09_0416f5426ef1 Received: from filter.hostedemail.com (10.5.16.251.rfc1918.com [10.5.16.251]) by smtpin10.hostedemail.com (Postfix) with ESMTP id F40D516A4AB for ; Tue, 14 Jul 2020 14:05:45 +0000 (UTC) X-HE-Tag: coach09_0416f5426ef1 X-Filterd-Recvd-Size: 5047 Received: from mail-wr1-f68.google.com (mail-wr1-f68.google.com [209.85.221.68]) by imf25.hostedemail.com (Postfix) with ESMTP for ; Tue, 14 Jul 2020 14:05:45 +0000 (UTC) Received: by mail-wr1-f68.google.com with SMTP id f18so21855260wrs.0 for ; Tue, 14 Jul 2020 07:05:45 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:in-reply-to; bh=ykRN2b2FGJCpoW0Za00FCplLqoYpc51vIm2SiIRKbd8=; b=OYPVKXgakdWHj9D5CpsIbaJT6W7cGdkaEt1vvtrRuSf1ACIt3wdQfzvyITsbtol8al 8ZnwAhMsHGJEa77A6gH4cGLx7cddON/cZpIFfpOC1r3BL7Y1y3SweOEUKb8p8mS319Uz OOo9TKK+ZI/XTILfCGmwFLwSZUzx2fOMb5JV+CRMVptzQdMmS3RkSf4BDrNaUUBtZgra yzFZ6qiQOwHeQ7XDJKO+L/LGEv5UpFO1t2NVmryCIjAanRCkEixCVQUfKxprBN4sYe9T JI9toxPE9fD6GbVG9fTm+NvH+UTBG/B4D5V6EdI73Xzu+55o5go1LRsWlCgqPK9kwAlu IzQQ== X-Gm-Message-State: AOAM531y00ucjqRBBNnD6BwRbScFZ47tUPcY4/NeqdBBKwWrOnFsMEjZ zkz3V5jZ6jJdGTqbn7ksSXw= X-Google-Smtp-Source: ABdhPJzfHlWMMZiavqBisjGb5L9N3flBFJWL7kvvnkRn6uOJ0Ilf7f/b0aLGZTyUMQZP0hWpkpm1Hw== X-Received: by 2002:adf:edc8:: with SMTP id v8mr5629352wro.125.1594735544244; Tue, 14 Jul 2020 07:05:44 -0700 (PDT) Received: from localhost (ip-37-188-148-171.eurotel.cz. [37.188.148.171]) by smtp.gmail.com with ESMTPSA id z8sm4743589wmg.39.2020.07.14.07.05.42 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 14 Jul 2020 07:05:43 -0700 (PDT) Date: Tue, 14 Jul 2020 16:05:41 +0200 From: Michal Hocko To: Yafang Shao Cc: penguin-kernel@i-love.sakura.ne.jp, rientjes@google.com, akpm@linux-foundation.org, hannes@cmpxchg.org, linux-mm@kvack.org Subject: Re: [PATCH v2] memcg, oom: check memcg margin for parallel oom Message-ID: <20200714140541.GO24642@dhcp22.suse.cz> References: <1594735034-19190-1-git-send-email-laoar.shao@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1594735034-19190-1-git-send-email-laoar.shao@gmail.com> X-Rspamd-Queue-Id: F40D516A4AB X-Spamd-Result: default: False [0.00 / 100.00] X-Rspamd-Server: rspam03 X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: On Tue 14-07-20 09:57:14, Yafang Shao wrote: > Memcg oom killer invocation is synchronized by the global oom_lock and > tasks are sleeping on the lock while somebody is selecting the victim or > potentially race with the oom_reaper is releasing the victim's memory. > This can result in a pointless oom killer invocation because a waiter > might be racing with the oom_reaper > > P1 oom_reaper P2 > oom_reap_task mutex_lock(oom_lock) > out_of_memory # no victim because we have one already > __oom_reap_task_mm mute_unlock(oom_lock) > mutex_lock(oom_lock) > set MMF_OOM_SKIP > select_bad_process > # finds a new victim > > The page allocator prevents from this race by trying to allocate after > the lock can be acquired (in __alloc_pages_may_oom) which acts as a last > minute check. Moreover page allocator simply doesn't block on the > oom_lock and simply retries the whole reclaim process. > > Memcg oom killer should do the last minute check as well. Call > mem_cgroup_margin to do that. Trylock on the oom_lock could be done as > well but this doesn't seem to be necessary at this stage. > > [mhocko@kernel.org: commit log] > Suggested-by: Michal Hocko > Signed-off-by: Yafang Shao > Cc: Michal Hocko > Cc: Tetsuo Handa > Cc: David Rientjes > Cc: Johannes Weiner Acked-by: Michal Hocko Thanks! > --- > v1 -> v2: > - commit log improved by Michal > - retitle the subject from "mm, oom: check memcg margin for parallel oom" > - code simplicity, per Michal > --- > mm/memcontrol.c | 8 +++++++- > 1 file changed, 7 insertions(+), 1 deletion(-) > > diff --git a/mm/memcontrol.c b/mm/memcontrol.c > index 1962232..15e0e18 100644 > --- a/mm/memcontrol.c > +++ b/mm/memcontrol.c > @@ -1560,15 +1560,21 @@ static bool mem_cgroup_out_of_memory(struct mem_cgroup *memcg, gfp_t gfp_mask, > .gfp_mask = gfp_mask, > .order = order, > }; > - bool ret; > + bool ret = true; > > if (mutex_lock_killable(&oom_lock)) > return true; > + > + if (mem_cgroup_margin(memcg) >= (1 << order)) > + goto unlock; > + > /* > * A few threads which were not waiting at mutex_lock_killable() can > * fail to bail out. Therefore, check again after holding oom_lock. > */ > ret = should_force_charge() || out_of_memory(&oc); > + > +unlock: > mutex_unlock(&oom_lock); > return ret; > } > -- > 1.8.3.1 -- Michal Hocko SUSE Labs