Received: by 2002:a05:6a10:9e8c:0:0:0:0 with SMTP id y12csp1527223pxx; Fri, 30 Oct 2020 12:06:00 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxVTwPMCI6iCKLZc8Smf+Yo2yvR3Rd/MvaMZKyl3jUJv8BG0I0Jz92co1lJMN+5Ua7srogE X-Received: by 2002:a17:906:7247:: with SMTP id n7mr3973817ejk.174.1604084760566; Fri, 30 Oct 2020 12:06:00 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1604084760; cv=none; d=google.com; s=arc-20160816; b=tGfyqy/aV7YEYlMipf18mjY5XqxqcR5T7ftjh89N71v1hEmkMQFjWL/d1xhD0Tc2T5 MBcsuMeHyjkfCqEeJ3/Ps52ECVO/9nljv8YGnQWsE9UibZNEoTJCIk/Hv9JLK3n8RNaG PwSyn0Ve+1lbt4ZJltbbCCJEqvFrQwHveMXLDm5Wnr6vHj9YIXVJg+hlxzuRBdOJAXGi 42XZU/dvB6tz48xdrRMavvlDCFZ7fsuKh2OoTudT41EmN2UIbNlylq28LHMjCrPDJkzr JDzmhtIlqUWmXZIcSAjYc0PCgq5peGCGH1KefsnmghEpTLwnJdxy+41n/f1KF89/BnLu /x5g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :ironport-sdr:ironport-sdr; bh=ZHHDm+wi+UUc2ugeh/0WgnQEpiPq+JF2NLAwKm6Rmug=; b=vvmcAQpWXHXNXlzqij9JJ0LaB9P+WL8QSU3nC2Ooy7Hio1XoGGv+r2wcs9IU1C4ZMH jb/W2Mdrah4lzAixumwtq6mKgrixYacQ9kUYSz4CLSLqZz0wFzFNGOrSl3NBsBpGbRXO OYpqhChtNIi70J0+JpSprROcKQn60/C97Rz56f59YymIotNdHETdJqAPGa0zqDaqNu9k vZ/CfTuH48zCh9m1fr3Z9Q2ERTZ2eO4LSh8+72oM8o13SWtorBbhBu9iT008V2cHDihx d8Wkniz/xbzVQygDTZqHDE/NuF2yobaRixMUVqFmqY33hnF+d6MiqU2XLYfKYfOQylct 7S7Q== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id u27si1362949edi.588.2020.10.30.12.05.37; Fri, 30 Oct 2020 12:06:00 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727472AbgJ3TC7 (ORCPT + 99 others); Fri, 30 Oct 2020 15:02:59 -0400 Received: from mga11.intel.com ([192.55.52.93]:30204 "EHLO mga11.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727430AbgJ3TCv (ORCPT ); Fri, 30 Oct 2020 15:02:51 -0400 IronPort-SDR: aZyS2rohDoAuMzVG6G9WhDJhb6cfxXS+UG8JWwtLChYwvvKh+PjMANm4JuR0LebmK9o6dHnR5B FyUO74DlMCHQ== X-IronPort-AV: E=McAfee;i="6000,8403,9790"; a="165154842" X-IronPort-AV: E=Sophos;i="5.77,434,1596524400"; d="scan'208";a="165154842" X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga005.jf.intel.com ([10.7.209.41]) by fmsmga102.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 30 Oct 2020 12:02:51 -0700 IronPort-SDR: SuIoIL/dDSU08OxuWu8YahYZfn8VQvQTKVMPi4c+6T8GsDkvv3KVoI87AZbhAFxrAVg2m9nEpy ZdMoZYP/dKfA== X-IronPort-AV: E=Sophos;i="5.77,434,1596524400"; d="scan'208";a="537167706" Received: from kingelix-mobl.amr.corp.intel.com (HELO bwidawsk-mobl5.local) ([10.252.139.120]) by orsmga005-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 30 Oct 2020 12:02:50 -0700 From: Ben Widawsky To: linux-mm , Andrew Morton Cc: Ben Widawsky , Dave Hansen , Michal Hocko , linux-kernel@vger.kernel.org Subject: [PATCH 10/12] mm/mempolicy: VMA allocation for many preferred Date: Fri, 30 Oct 2020 12:02:36 -0700 Message-Id: <20201030190238.306764-11-ben.widawsky@intel.com> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20201030190238.306764-1-ben.widawsky@intel.com> References: <20201030190238.306764-1-ben.widawsky@intel.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org This patch implements MPOL_PREFERRED_MANY for alloc_pages_vma(). Like alloc_pages_current(), alloc_pages_vma() needs to support policy based decisions if they've been configured via mbind(2). The temporary "hack" of treating MPOL_PREFERRED and MPOL_PREFERRED_MANY can now be removed with this, too. All the actual machinery to make this work was part of ("mm/mempolicy: Create a page allocator for policy") Link: https://lore.kernel.org/r/20200630212517.308045-11-ben.widawsky@intel.com Signed-off-by: Ben Widawsky --- mm/mempolicy.c | 29 +++++++++++++++++++++-------- 1 file changed, 21 insertions(+), 8 deletions(-) diff --git a/mm/mempolicy.c b/mm/mempolicy.c index 2d19235413db..343340c87f03 100644 --- a/mm/mempolicy.c +++ b/mm/mempolicy.c @@ -2259,8 +2259,6 @@ alloc_pages_vma(gfp_t gfp, int order, struct vm_area_struct *vma, { struct mempolicy *pol; struct page *page; - int preferred_nid; - nodemask_t *nmask; pol = get_vma_policy(vma, addr); @@ -2274,6 +2272,7 @@ alloc_pages_vma(gfp_t gfp, int order, struct vm_area_struct *vma, } if (unlikely(IS_ENABLED(CONFIG_TRANSPARENT_HUGEPAGE) && hugepage)) { + nodemask_t *nmask; int hpage_node = node; /* @@ -2287,10 +2286,26 @@ alloc_pages_vma(gfp_t gfp, int order, struct vm_area_struct *vma, * does not allow the current node in its nodemask, we allocate * the standard way. */ - if ((pol->mode == MPOL_PREFERRED || - pol->mode == MPOL_PREFERRED_MANY) && - !(pol->flags & MPOL_F_LOCAL)) + if (pol->mode == MPOL_PREFERRED || !(pol->flags & MPOL_F_LOCAL)) { hpage_node = first_node(pol->nodes); + } else if (pol->mode == MPOL_PREFERRED_MANY) { + struct zoneref *z; + + /* + * In this policy, with direct reclaim, the normal + * policy based allocation will do the right thing - try + * twice using the preferred nodes first, and all nodes + * second. + */ + if (gfp & __GFP_DIRECT_RECLAIM) { + page = alloc_pages_policy(pol, gfp, order, NUMA_NO_NODE); + goto out; + } + + z = first_zones_zonelist(node_zonelist(numa_node_id(), GFP_HIGHUSER), + gfp_zone(GFP_HIGHUSER), &pol->nodes); + hpage_node = zone_to_nid(z->zone); + } nmask = policy_nodemask(gfp, pol); if (!nmask || node_isset(hpage_node, *nmask)) { @@ -2316,9 +2331,7 @@ alloc_pages_vma(gfp_t gfp, int order, struct vm_area_struct *vma, } } - nmask = policy_nodemask(gfp, pol); - preferred_nid = policy_node(gfp, pol, node); - page = __alloc_pages_nodemask(gfp, order, preferred_nid, nmask); + page = alloc_pages_policy(pol, gfp, order, NUMA_NO_NODE); mpol_cond_put(pol); out: return page; -- 2.29.2