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=-15.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS 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 95460C4708F for ; Tue, 1 Jun 2021 08:19:29 +0000 (UTC) Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.kernel.org (Postfix) with ESMTP id 2D0F26136E for ; Tue, 1 Jun 2021 08:19:29 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 2D0F26136E Authentication-Results: mail.kernel.org; dmarc=fail (p=quarantine dis=none) header.from=suse.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=owner-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix) id 9ABDF6B0074; Tue, 1 Jun 2021 04:19:28 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 9347E6B0075; Tue, 1 Jun 2021 04:19:28 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 787ED6B0078; Tue, 1 Jun 2021 04:19:28 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from forelay.hostedemail.com (smtprelay0194.hostedemail.com [216.40.44.194]) by kanga.kvack.org (Postfix) with ESMTP id 4099E6B0074 for ; Tue, 1 Jun 2021 04:19:28 -0400 (EDT) Received: from smtpin28.hostedemail.com (10.5.19.251.rfc1918.com [10.5.19.251]) by forelay04.hostedemail.com (Postfix) with ESMTP id C096183F4 for ; Tue, 1 Jun 2021 08:19:27 +0000 (UTC) X-FDA: 78204455574.28.91288B7 Received: from mx2.suse.de (mx2.suse.de [195.135.220.15]) by imf10.hostedemail.com (Postfix) with ESMTP id BF8884202A1B for ; Tue, 1 Jun 2021 08:19:15 +0000 (UTC) X-Virus-Scanned: by amavisd-new at test-mx.suse.de DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.com; s=susede1; t=1622535566; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc: mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to:references:references; bh=l0j051AAXi+uzGkChemQvG7BEpNZnRrIFj2OzSLlI3Y=; b=cmrRZE9cjm8oKpwXCtF/3k4iwcLAKZFAziGXWMUjBo6zBfNDeVb3Gnub6dVHzBJ4s76mfo Z1JebDGI1ePsKrGx9/JwmJHszkB131LelEGxekAXJtIRMHpZkZcPdw5h4EbtFnzmDIenaM 28DwnIwvUZqcm64/8Cxs1fgzHrSgJcU= Received: from relay2.suse.de (unknown [195.135.221.27]) by mx2.suse.de (Postfix) with ESMTP id ED39EACB1; Tue, 1 Jun 2021 08:19:25 +0000 (UTC) Date: Tue, 1 Jun 2021 10:19:25 +0200 From: Michal Hocko To: Feng Tang Cc: linux-mm@kvack.org, Andrew Morton , David Rientjes , Dave Hansen , Ben Widawsky , linux-kernel@vger.kernel.org, Andrea Arcangeli , Mel Gorman , Mike Kravetz , Randy Dunlap , Vlastimil Babka , Andi Kleen , Dan Williams , ying.huang@intel.com Subject: Re: [v3 PATCH 1/3] mm/mempolicy: cleanup nodemask intersection check for oom Message-ID: References: <1622469956-82897-1-git-send-email-feng.tang@intel.com> <1622469956-82897-2-git-send-email-feng.tang@intel.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1622469956-82897-2-git-send-email-feng.tang@intel.com> X-Rspamd-Queue-Id: BF8884202A1B Authentication-Results: imf10.hostedemail.com; dkim=pass header.d=suse.com header.s=susede1 header.b=cmrRZE9c; spf=pass (imf10.hostedemail.com: domain of mhocko@suse.com designates 195.135.220.15 as permitted sender) smtp.mailfrom=mhocko@suse.com; dmarc=pass (policy=quarantine) header.from=suse.com X-Rspamd-Server: rspam04 X-Stat-Signature: i4a9qteyfrnu9up99nniabszq4rqsem9 X-HE-Tag: 1622535555-35836 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 Mon 31-05-21 22:05:54, Feng Tang wrote: > mempolicy_nodemask_intersects() is used in oom case to check if a > task may have memory allocated on some memory nodes. > > As it's only used by OOM check, rename it to mempolicy_in_oom_domain() > to reduce confusion. > > As only for 'bind' policy, the nodemask is a force requirement for > from where to allocate memory, only do the intesection check for it, > and return true for all other policies. I would slightly rephrase the above to " mempolicy_nodemask_intersects seem to be a general purpose mempolicy function. In fact it is partially tailored for the OOM purpose instead. The oom proper is the only existing user so rename the function to make that purpose explicit. While at it drop the MPOL_INTERLEAVE as those allocations never has a nodemask defined (see alloc_page_interleave) so this is a dead code and a confusing one because MPOL_INTERLEAVE is a hint rather than a hard requirement so it shouldn't be considered during the OOM. The final code can be reduced to a check for MPOL_BIND which is the only memory policy that is a hard requirement and thus relevant to a constrained OOM logic. " > Suggested-by: Michal Hocko > Signed-off-by: Feng Tang To the change itself Acked-by: Michal Hocko > --- > include/linux/mempolicy.h | 2 +- > mm/mempolicy.c | 34 +++++++++------------------------- > mm/oom_kill.c | 2 +- > 3 files changed, 11 insertions(+), 27 deletions(-) > > diff --git a/include/linux/mempolicy.h b/include/linux/mempolicy.h > index 5f1c74d..8773c55 100644 > --- a/include/linux/mempolicy.h > +++ b/include/linux/mempolicy.h > @@ -150,7 +150,7 @@ extern int huge_node(struct vm_area_struct *vma, > unsigned long addr, gfp_t gfp_flags, > struct mempolicy **mpol, nodemask_t **nodemask); > extern bool init_nodemask_of_mempolicy(nodemask_t *mask); > -extern bool mempolicy_nodemask_intersects(struct task_struct *tsk, > +extern bool mempolicy_in_oom_domain(struct task_struct *tsk, > const nodemask_t *mask); > extern nodemask_t *policy_nodemask(gfp_t gfp, struct mempolicy *policy); > > diff --git a/mm/mempolicy.c b/mm/mempolicy.c > index d79fa29..6795a6a 100644 > --- a/mm/mempolicy.c > +++ b/mm/mempolicy.c > @@ -2094,16 +2094,16 @@ bool init_nodemask_of_mempolicy(nodemask_t *mask) > #endif > > /* > - * mempolicy_nodemask_intersects > + * mempolicy_in_oom_domain > * > - * If tsk's mempolicy is "default" [NULL], return 'true' to indicate default > - * policy. Otherwise, check for intersection between mask and the policy > - * nodemask for 'bind' or 'interleave' policy. For 'preferred' or 'local' > - * policy, always return true since it may allocate elsewhere on fallback. > + * If tsk's mempolicy is "bind", check for intersection between mask and > + * the policy nodemask. Otherwise, return true for all other policies > + * including "interleave", as a tsk with "interleave" policy may have > + * memory allocated from all nodes in system. > * > * Takes task_lock(tsk) to prevent freeing of its mempolicy. > */ > -bool mempolicy_nodemask_intersects(struct task_struct *tsk, > +bool mempolicy_in_oom_domain(struct task_struct *tsk, > const nodemask_t *mask) > { > struct mempolicy *mempolicy; > @@ -2111,29 +2111,13 @@ bool mempolicy_nodemask_intersects(struct task_struct *tsk, > > if (!mask) > return ret; > + > task_lock(tsk); > mempolicy = tsk->mempolicy; > - if (!mempolicy) > - goto out; > - > - switch (mempolicy->mode) { > - case MPOL_PREFERRED: > - /* > - * MPOL_PREFERRED and MPOL_F_LOCAL are only preferred nodes to > - * allocate from, they may fallback to other nodes when oom. > - * Thus, it's possible for tsk to have allocated memory from > - * nodes in mask. > - */ > - break; > - case MPOL_BIND: > - case MPOL_INTERLEAVE: > + if (mempolicy && mempolicy->mode == MPOL_BIND) > ret = nodes_intersects(mempolicy->v.nodes, *mask); > - break; > - default: > - BUG(); > - } > -out: > task_unlock(tsk); > + > return ret; > } > > diff --git a/mm/oom_kill.c b/mm/oom_kill.c > index eefd3f5..fcc29e9 100644 > --- a/mm/oom_kill.c > +++ b/mm/oom_kill.c > @@ -104,7 +104,7 @@ static bool oom_cpuset_eligible(struct task_struct *start, > * mempolicy intersects current, otherwise it may be > * needlessly killed. > */ > - ret = mempolicy_nodemask_intersects(tsk, mask); > + ret = mempolicy_in_oom_domain(tsk, mask); > } else { > /* > * This is not a mempolicy constrained oom, so only > -- > 2.7.4 -- Michal Hocko SUSE Labs