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.2 required=3.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_SANE_1 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 3DBC6C4320A for ; Wed, 28 Jul 2021 15:25:14 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 2810060BD3 for ; Wed, 28 Jul 2021 15:25:14 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S236946AbhG1PZO (ORCPT ); Wed, 28 Jul 2021 11:25:14 -0400 Received: from mga11.intel.com ([192.55.52.93]:33565 "EHLO mga11.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235457AbhG1PZN (ORCPT ); Wed, 28 Jul 2021 11:25:13 -0400 X-IronPort-AV: E=McAfee;i="6200,9189,10059"; a="209575485" X-IronPort-AV: E=Sophos;i="5.84,276,1620716400"; d="scan'208";a="209575485" Received: from fmsmga003.fm.intel.com ([10.253.24.29]) by fmsmga102.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Jul 2021 08:25:11 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.84,276,1620716400"; d="scan'208";a="506511592" Received: from shbuild999.sh.intel.com (HELO localhost) ([10.239.146.151]) by FMSMGA003.fm.intel.com with ESMTP; 28 Jul 2021 08:25:07 -0700 Date: Wed, 28 Jul 2021 23:25:07 +0800 From: Feng Tang To: Michal Hocko Cc: "linux-mm@kvack.org" , Andrew Morton , David Rientjes , "Hansen, Dave" , "Widawsky, Ben" , "linux-kernel@vger.kernel.org" , "linux-api@vger.kernel.org" , Andrea Arcangeli , Mel Gorman , Mike Kravetz , Randy Dunlap , Vlastimil Babka , Andi Kleen , "Williams, Dan J" , "Huang, Ying" Subject: Re: [PATCH v6 2/6] mm/memplicy: add page allocation function for MPOL_PREFERRED_MANY policy Message-ID: <20210728152507.GE43486@shbuild999.sh.intel.com> References: <1626077374-81682-1-git-send-email-feng.tang@intel.com> <1626077374-81682-3-git-send-email-feng.tang@intel.com> <20210728151810.GD43486@shbuild999.sh.intel.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20210728151810.GD43486@shbuild999.sh.intel.com> User-Agent: Mutt/1.5.24 (2015-08-30) Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Wed, Jul 28, 2021 at 11:18:10PM +0800, Tang, Feng wrote: > On Wed, Jul 28, 2021 at 02:42:26PM +0200, Michal Hocko wrote: > > On Mon 12-07-21 16:09:30, Feng Tang wrote: > > > The semantics of MPOL_PREFERRED_MANY is similar to MPOL_PREFERRED, > > > that it will first try to allocate memory from the preferred node(s), > > > and fallback to all nodes in system when first try fails. > > > > > > Add a dedicated function for it just like 'interleave' policy. > > > > > > Link: https://lore.kernel.org/r/20200630212517.308045-9-ben.widawsky@intel.com > > > Suggested-by: Michal Hocko > > > Co-developed-by: Ben Widawsky > > > Signed-off-by: Ben Widawsky > > > Signed-off-by: Feng Tang > > > > It would be better to squash this together with the actual user of the > > function added by the next patch. > > Ok, will do > > > > --- > > > mm/mempolicy.c | 19 +++++++++++++++++++ > > > 1 file changed, 19 insertions(+) > > > > > > diff --git a/mm/mempolicy.c b/mm/mempolicy.c > > > index 17b5800b7dcc..d17bf018efcc 100644 > > > --- a/mm/mempolicy.c > > > +++ b/mm/mempolicy.c > > > @@ -2153,6 +2153,25 @@ static struct page *alloc_page_interleave(gfp_t gfp, unsigned order, > > > return page; > > > } > > > > > > +static struct page *alloc_page_preferred_many(gfp_t gfp, unsigned int order, > > > + struct mempolicy *pol) > > > > We likely want a node parameter to know which one we want to start with > > for locality. Callers should use policy_node for that. > > Yes, locality should be considered, something like this? > > int pnid, lnid = numa_node_id(); > > if (is_nodeset(lnid, &pol->nodes)) > pnid = local_nid; > else > pnid = first_node(pol->nodes); One further thought is, if local node is not in the nodemask, should we compare the distance of all the nodes in nodemask to the local node and chose the shortest? Thanks, Feng > page = __alloc_pages(((gfp | __GFP_NOWARN) & ~__GFP_DIRECT_RECLAIM), > order, pnid, &pol->nodes); > if (!page) > page = __alloc_pages(gfp, order, lnid, NULL); > return page; >