Received: by 2002:ac0:bc90:0:0:0:0:0 with SMTP id a16csp866335img; Fri, 22 Mar 2019 10:12:14 -0700 (PDT) X-Google-Smtp-Source: APXvYqzJud/67AIZ/sOKiJFT/YMRe60K0eOZGg5VtNurAlhu4dUNzWrF45i4fq51K17BJH1QmWCL X-Received: by 2002:a63:e554:: with SMTP id z20mr9309084pgj.234.1553274734128; Fri, 22 Mar 2019 10:12:14 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1553274734; cv=none; d=google.com; s=arc-20160816; b=CHvjhRSHQgi76y8l7zOPIKJ6ph9ZBW3/v0L1Byu6QbjtZnJQ9ZUNf4eiSBw0YiY0Fo Ivm2fo6epsaqkygdlL27DY1Hc7k36Yw3oQLN1Re5Ad0kPwzfTv7VqU5JhO5OoEsPU7hf fr/eRGInUSHREKxoTYOgHW7zXNruoxJauNWoJJ5v8iDM8Wzl2j5mXlfG0Slv74dTpZ5v gJ23mWB8VgS/WIBNTzwwI5eHHsLoUGUKo7C/hrGPNi1H1J+DJlmNhjLzLeWFHp2WZIUA zNSc/lOunGxx31ySIHPas2JIEkqc9Exr+ZEv3Ht58MqqyGa+ZdK/2Yf3wfjWCCnEBKmk BBYg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:cc:to:from :subject; bh=4laCd5MFQsasg3wAcoeizAGd9ZCiY08UnTwXQ4jobr8=; b=F5jDWqocP71LSzWVLRmhx5H9apeJn/yZ1mq/c/UNnY6kUDtkz6+wgHhPNe1QiRXrPl baIeLMspnqFcqiiMEKD32m9m4hVU6NQxOdRy1QzsNMKmiEri2Ucyiv8KlBMQHt1ZptV9 7T3hj/QXF/cgpDwfgBAcl5cXF2q+zRC3EZHRNRcaTWeG3p7bmd9bkvQprFxaJEeozYxQ BxVtL93V4QsxIFxvzDFE1uiNX+rpFIL1mohkG54PSyogzx4DQqyCVmHN5xiQRJQ6ydpt 8YiuBE27zTR6d/2uYTMrzQmRrhh5s8J9qw3L7itqO0HxOTjx21UaZ24tP65StjJAxwWs bQ9Q== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 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. [209.132.180.67]) by mx.google.com with ESMTP id s61si7786999plb.305.2019.03.22.10.11.56; Fri, 22 Mar 2019 10:12:14 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 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 S1728964AbfCVRKz (ORCPT + 99 others); Fri, 22 Mar 2019 13:10:55 -0400 Received: from mga04.intel.com ([192.55.52.120]:19212 "EHLO mga04.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728599AbfCVRKz (ORCPT ); Fri, 22 Mar 2019 13:10:55 -0400 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga003.jf.intel.com ([10.7.209.27]) by fmsmga104.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 22 Mar 2019 10:10:54 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.60,256,1549958400"; d="scan'208";a="136390571" Received: from dwillia2-desk3.jf.intel.com (HELO dwillia2-desk3.amr.corp.intel.com) ([10.54.39.16]) by orsmga003.jf.intel.com with ESMTP; 22 Mar 2019 10:10:54 -0700 Subject: [PATCH v5 04/10] mm/hotplug: Prepare shrink_{zone, pgdat}_span for sub-section removal From: Dan Williams To: akpm@linux-foundation.org Cc: Michal Hocko , Vlastimil Babka , Logan Gunthorpe , linux-mm@kvack.org, linux-nvdimm@lists.01.org, linux-kernel@vger.kernel.org Date: Fri, 22 Mar 2019 09:58:15 -0700 Message-ID: <155327389539.225273.8758677172387750805.stgit@dwillia2-desk3.amr.corp.intel.com> In-Reply-To: <155327387405.225273.9325594075351253804.stgit@dwillia2-desk3.amr.corp.intel.com> References: <155327387405.225273.9325594075351253804.stgit@dwillia2-desk3.amr.corp.intel.com> User-Agent: StGit/0.18-2-gc94f MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Sub-section hotplug support reduces the unit of operation of hotplug from section-sized-units (PAGES_PER_SECTION) to sub-section-sized units (PAGES_PER_SUBSECTION). Teach shrink_{zone,pgdat}_span() to consider PAGES_PER_SUBSECTION boundaries as the points where pfn_valid(), not valid_section(), can toggle. Cc: Michal Hocko Cc: Vlastimil Babka Cc: Logan Gunthorpe Signed-off-by: Dan Williams --- include/linux/mmzone.h | 2 ++ mm/memory_hotplug.c | 16 ++++++++-------- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/include/linux/mmzone.h b/include/linux/mmzone.h index ae4aa7f63d2e..067ee217c692 100644 --- a/include/linux/mmzone.h +++ b/include/linux/mmzone.h @@ -1111,6 +1111,8 @@ static inline unsigned long section_nr_to_pfn(unsigned long sec) #define SECTION_ACTIVE_SIZE ((1UL << SECTION_SIZE_BITS) / BITS_PER_LONG) #define SECTION_ACTIVE_MASK (~(SECTION_ACTIVE_SIZE - 1)) +#define PAGES_PER_SUB_SECTION (SECTION_ACTIVE_SIZE / PAGE_SIZE) +#define PAGE_SUB_SECTION_MASK (~(PAGES_PER_SUB_SECTION-1)) struct mem_section_usage { /* diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c index 2541a3a15854..0ea3bb58d223 100644 --- a/mm/memory_hotplug.c +++ b/mm/memory_hotplug.c @@ -326,10 +326,10 @@ static unsigned long find_smallest_section_pfn(int nid, struct zone *zone, { struct mem_section *ms; - for (; start_pfn < end_pfn; start_pfn += PAGES_PER_SECTION) { + for (; start_pfn < end_pfn; start_pfn += PAGES_PER_SUB_SECTION) { ms = __pfn_to_section(start_pfn); - if (unlikely(!valid_section(ms))) + if (unlikely(!pfn_valid(start_pfn))) continue; if (unlikely(pfn_to_nid(start_pfn) != nid)) @@ -354,10 +354,10 @@ static unsigned long find_biggest_section_pfn(int nid, struct zone *zone, /* pfn is the end pfn of a memory section. */ pfn = end_pfn - 1; - for (; pfn >= start_pfn; pfn -= PAGES_PER_SECTION) { + for (; pfn >= start_pfn; pfn -= PAGES_PER_SUB_SECTION) { ms = __pfn_to_section(pfn); - if (unlikely(!valid_section(ms))) + if (unlikely(!pfn_valid(pfn))) continue; if (unlikely(pfn_to_nid(pfn) != nid)) @@ -416,10 +416,10 @@ static void shrink_zone_span(struct zone *zone, unsigned long start_pfn, * it check the zone has only hole or not. */ pfn = zone_start_pfn; - for (; pfn < zone_end_pfn; pfn += PAGES_PER_SECTION) { + for (; pfn < zone_end_pfn; pfn += PAGES_PER_SUB_SECTION) { ms = __pfn_to_section(pfn); - if (unlikely(!valid_section(ms))) + if (unlikely(!pfn_valid(pfn))) continue; if (page_zone(pfn_to_page(pfn)) != zone) @@ -484,10 +484,10 @@ static void shrink_pgdat_span(struct pglist_data *pgdat, * has only hole or not. */ pfn = pgdat_start_pfn; - for (; pfn < pgdat_end_pfn; pfn += PAGES_PER_SECTION) { + for (; pfn < pgdat_end_pfn; pfn += PAGES_PER_SUB_SECTION) { ms = __pfn_to_section(pfn); - if (unlikely(!valid_section(ms))) + if (unlikely(!pfn_valid(pfn))) continue; if (pfn_to_nid(pfn) != nid)