All of lore.kernel.org
 help / color / mirror / Atom feed
From: David Hildenbrand <david@redhat.com>
To: linux-kernel@vger.kernel.org
Cc: linux-s390@vger.kernel.org, Michal Hocko <mhocko@suse.com>,
	linux-ia64@vger.kernel.org,
	Pavel Tatashin <pasha.tatashin@soleen.com>,
	linux-sh@vger.kernel.org,
	"Aneesh Kumar K . V" <aneesh.kumar@linux.ibm.com>,
	x86@kernel.org, David Hildenbrand <david@redhat.com>,
	linux-mm@kvack.org, Wei Yang <richardw.yang@linux.intel.com>,
	Andrew Morton <akpm@linux-foundation.org>,
	linuxppc-dev@lists.ozlabs.org,
	Dan Williams <dan.j.williams@intel.com>,
	linux-arm-kernel@lists.infradead.org,
	Oscar Salvador <osalvador@suse.de>
Subject: [PATCH v6 03/10] mm/memory_hotplug: Don't access uninitialized memmaps in shrink_pgdat_span()
Date: Sun, 06 Oct 2019 08:56:39 +0000	[thread overview]
Message-ID: <20191006085646.5768-4-david@redhat.com> (raw)
In-Reply-To: <20191006085646.5768-1-david@redhat.com>

We might use the nid of memmaps that were never initialized. For
example, if the memmap was poisoned, we will crash the kernel in
pfn_to_nid() right now. Let's use the calculated boundaries of the separate
zones instead. This now also avoids having to iterate over a whole bunch of
subsections again, after shrinking one zone.

Before commit d0dc12e86b31 ("mm/memory_hotplug: optimize memory
hotplug"), the memmap was initialized to 0 and the node was set to the
right value. After that commit, the node might be garbage.

We'll have to fix shrink_zone_span() next.

Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Oscar Salvador <osalvador@suse.de>
Cc: David Hildenbrand <david@redhat.com>
Cc: Michal Hocko <mhocko@suse.com>
Cc: Pavel Tatashin <pasha.tatashin@soleen.com>
Cc: Dan Williams <dan.j.williams@intel.com>
Cc: Wei Yang <richardw.yang@linux.intel.com>
Fixes: d0dc12e86b31 ("mm/memory_hotplug: optimize memory hotplug")
Reported-by: Aneesh Kumar K.V <aneesh.kumar@linux.ibm.com>
Signed-off-by: David Hildenbrand <david@redhat.com>
---
 mm/memory_hotplug.c | 72 ++++++++++-----------------------------------
 1 file changed, 15 insertions(+), 57 deletions(-)

diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c
index 680b4b3e57d9..86b4dc18e831 100644
--- a/mm/memory_hotplug.c
+++ b/mm/memory_hotplug.c
@@ -436,67 +436,25 @@ static void shrink_zone_span(struct zone *zone, unsigned long start_pfn,
 	zone_span_writeunlock(zone);
 }
 
-static void shrink_pgdat_span(struct pglist_data *pgdat,
-			      unsigned long start_pfn, unsigned long end_pfn)
+static void update_pgdat_span(struct pglist_data *pgdat)
 {
-	unsigned long pgdat_start_pfn = pgdat->node_start_pfn;
-	unsigned long p = pgdat_end_pfn(pgdat); /* pgdat_end_pfn namespace clash */
-	unsigned long pgdat_end_pfn = p;
-	unsigned long pfn;
-	int nid = pgdat->node_id;
-
-	if (pgdat_start_pfn = start_pfn) {
-		/*
-		 * If the section is smallest section in the pgdat, it need
-		 * shrink pgdat->node_start_pfn and pgdat->node_spanned_pages.
-		 * In this case, we find second smallest valid mem_section
-		 * for shrinking zone.
-		 */
-		pfn = find_smallest_section_pfn(nid, NULL, end_pfn,
-						pgdat_end_pfn);
-		if (pfn) {
-			pgdat->node_start_pfn = pfn;
-			pgdat->node_spanned_pages = pgdat_end_pfn - pfn;
-		}
-	} else if (pgdat_end_pfn = end_pfn) {
-		/*
-		 * If the section is biggest section in the pgdat, it need
-		 * shrink pgdat->node_spanned_pages.
-		 * In this case, we find second biggest valid mem_section for
-		 * shrinking zone.
-		 */
-		pfn = find_biggest_section_pfn(nid, NULL, pgdat_start_pfn,
-					       start_pfn);
-		if (pfn)
-			pgdat->node_spanned_pages = pfn - pgdat_start_pfn + 1;
-	}
-
-	/*
-	 * If the section is not biggest or smallest mem_section in the pgdat,
-	 * it only creates a hole in the pgdat. So in this case, we need not
-	 * change the pgdat.
-	 * But perhaps, the pgdat has only hole data. Thus it check the pgdat
-	 * has only hole or not.
-	 */
-	pfn = pgdat_start_pfn;
-	for (; pfn < pgdat_end_pfn; pfn += PAGES_PER_SUBSECTION) {
-		if (unlikely(!pfn_valid(pfn)))
-			continue;
-
-		if (pfn_to_nid(pfn) != nid)
-			continue;
+	unsigned long node_start_pfn = 0, node_end_pfn = 0;
+	struct zone *zone;
 
-		/* Skip range to be removed */
-		if (pfn >= start_pfn && pfn < end_pfn)
-			continue;
+	for (zone = pgdat->node_zones;
+	     zone < pgdat->node_zones + MAX_NR_ZONES; zone++) {
+		unsigned long zone_end_pfn = zone->zone_start_pfn +
+					     zone->spanned_pages;
 
-		/* If we find valid section, we have nothing to do */
-		return;
+		/* No need to lock the zones, they can't change. */
+		if (zone_end_pfn > node_end_pfn)
+			node_end_pfn = zone_end_pfn;
+		if (zone->zone_start_pfn < node_start_pfn)
+			node_start_pfn = zone->zone_start_pfn;
 	}
 
-	/* The pgdat has no valid section */
-	pgdat->node_start_pfn = 0;
-	pgdat->node_spanned_pages = 0;
+	pgdat->node_start_pfn = node_start_pfn;
+	pgdat->node_spanned_pages = node_end_pfn - node_start_pfn;
 }
 
 static void __remove_zone(struct zone *zone, unsigned long start_pfn,
@@ -507,7 +465,7 @@ static void __remove_zone(struct zone *zone, unsigned long start_pfn,
 
 	pgdat_resize_lock(zone->zone_pgdat, &flags);
 	shrink_zone_span(zone, start_pfn, start_pfn + nr_pages);
-	shrink_pgdat_span(pgdat, start_pfn, start_pfn + nr_pages);
+	update_pgdat_span(pgdat);
 	pgdat_resize_unlock(zone->zone_pgdat, &flags);
 }
 
-- 
2.21.0

WARNING: multiple messages have this Message-ID (diff)
From: David Hildenbrand <david@redhat.com>
To: linux-kernel@vger.kernel.org
Cc: linux-mm@kvack.org, linux-arm-kernel@lists.infradead.org,
	linux-ia64@vger.kernel.org, linuxppc-dev@lists.ozlabs.org,
	linux-s390@vger.kernel.org, linux-sh@vger.kernel.org,
	x86@kernel.org, David Hildenbrand <david@redhat.com>,
	Andrew Morton <akpm@linux-foundation.org>,
	Oscar Salvador <osalvador@suse.de>,
	Michal Hocko <mhocko@suse.com>,
	Pavel Tatashin <pasha.tatashin@soleen.com>,
	Dan Williams <dan.j.williams@intel.com>,
	Wei Yang <richardw.yang@linux.intel.com>,
	"Aneesh Kumar K . V" <aneesh.kumar@linux.ibm.com>
Subject: [PATCH v6 03/10] mm/memory_hotplug: Don't access uninitialized memmaps in shrink_pgdat_span()
Date: Sun,  6 Oct 2019 10:56:39 +0200	[thread overview]
Message-ID: <20191006085646.5768-4-david@redhat.com> (raw)
In-Reply-To: <20191006085646.5768-1-david@redhat.com>

We might use the nid of memmaps that were never initialized. For
example, if the memmap was poisoned, we will crash the kernel in
pfn_to_nid() right now. Let's use the calculated boundaries of the separate
zones instead. This now also avoids having to iterate over a whole bunch of
subsections again, after shrinking one zone.

Before commit d0dc12e86b31 ("mm/memory_hotplug: optimize memory
hotplug"), the memmap was initialized to 0 and the node was set to the
right value. After that commit, the node might be garbage.

We'll have to fix shrink_zone_span() next.

Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Oscar Salvador <osalvador@suse.de>
Cc: David Hildenbrand <david@redhat.com>
Cc: Michal Hocko <mhocko@suse.com>
Cc: Pavel Tatashin <pasha.tatashin@soleen.com>
Cc: Dan Williams <dan.j.williams@intel.com>
Cc: Wei Yang <richardw.yang@linux.intel.com>
Fixes: d0dc12e86b31 ("mm/memory_hotplug: optimize memory hotplug")
Reported-by: Aneesh Kumar K.V <aneesh.kumar@linux.ibm.com>
Signed-off-by: David Hildenbrand <david@redhat.com>
---
 mm/memory_hotplug.c | 72 ++++++++++-----------------------------------
 1 file changed, 15 insertions(+), 57 deletions(-)

diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c
index 680b4b3e57d9..86b4dc18e831 100644
--- a/mm/memory_hotplug.c
+++ b/mm/memory_hotplug.c
@@ -436,67 +436,25 @@ static void shrink_zone_span(struct zone *zone, unsigned long start_pfn,
 	zone_span_writeunlock(zone);
 }
 
-static void shrink_pgdat_span(struct pglist_data *pgdat,
-			      unsigned long start_pfn, unsigned long end_pfn)
+static void update_pgdat_span(struct pglist_data *pgdat)
 {
-	unsigned long pgdat_start_pfn = pgdat->node_start_pfn;
-	unsigned long p = pgdat_end_pfn(pgdat); /* pgdat_end_pfn namespace clash */
-	unsigned long pgdat_end_pfn = p;
-	unsigned long pfn;
-	int nid = pgdat->node_id;
-
-	if (pgdat_start_pfn == start_pfn) {
-		/*
-		 * If the section is smallest section in the pgdat, it need
-		 * shrink pgdat->node_start_pfn and pgdat->node_spanned_pages.
-		 * In this case, we find second smallest valid mem_section
-		 * for shrinking zone.
-		 */
-		pfn = find_smallest_section_pfn(nid, NULL, end_pfn,
-						pgdat_end_pfn);
-		if (pfn) {
-			pgdat->node_start_pfn = pfn;
-			pgdat->node_spanned_pages = pgdat_end_pfn - pfn;
-		}
-	} else if (pgdat_end_pfn == end_pfn) {
-		/*
-		 * If the section is biggest section in the pgdat, it need
-		 * shrink pgdat->node_spanned_pages.
-		 * In this case, we find second biggest valid mem_section for
-		 * shrinking zone.
-		 */
-		pfn = find_biggest_section_pfn(nid, NULL, pgdat_start_pfn,
-					       start_pfn);
-		if (pfn)
-			pgdat->node_spanned_pages = pfn - pgdat_start_pfn + 1;
-	}
-
-	/*
-	 * If the section is not biggest or smallest mem_section in the pgdat,
-	 * it only creates a hole in the pgdat. So in this case, we need not
-	 * change the pgdat.
-	 * But perhaps, the pgdat has only hole data. Thus it check the pgdat
-	 * has only hole or not.
-	 */
-	pfn = pgdat_start_pfn;
-	for (; pfn < pgdat_end_pfn; pfn += PAGES_PER_SUBSECTION) {
-		if (unlikely(!pfn_valid(pfn)))
-			continue;
-
-		if (pfn_to_nid(pfn) != nid)
-			continue;
+	unsigned long node_start_pfn = 0, node_end_pfn = 0;
+	struct zone *zone;
 
-		/* Skip range to be removed */
-		if (pfn >= start_pfn && pfn < end_pfn)
-			continue;
+	for (zone = pgdat->node_zones;
+	     zone < pgdat->node_zones + MAX_NR_ZONES; zone++) {
+		unsigned long zone_end_pfn = zone->zone_start_pfn +
+					     zone->spanned_pages;
 
-		/* If we find valid section, we have nothing to do */
-		return;
+		/* No need to lock the zones, they can't change. */
+		if (zone_end_pfn > node_end_pfn)
+			node_end_pfn = zone_end_pfn;
+		if (zone->zone_start_pfn < node_start_pfn)
+			node_start_pfn = zone->zone_start_pfn;
 	}
 
-	/* The pgdat has no valid section */
-	pgdat->node_start_pfn = 0;
-	pgdat->node_spanned_pages = 0;
+	pgdat->node_start_pfn = node_start_pfn;
+	pgdat->node_spanned_pages = node_end_pfn - node_start_pfn;
 }
 
 static void __remove_zone(struct zone *zone, unsigned long start_pfn,
@@ -507,7 +465,7 @@ static void __remove_zone(struct zone *zone, unsigned long start_pfn,
 
 	pgdat_resize_lock(zone->zone_pgdat, &flags);
 	shrink_zone_span(zone, start_pfn, start_pfn + nr_pages);
-	shrink_pgdat_span(pgdat, start_pfn, start_pfn + nr_pages);
+	update_pgdat_span(pgdat);
 	pgdat_resize_unlock(zone->zone_pgdat, &flags);
 }
 
-- 
2.21.0


WARNING: multiple messages have this Message-ID (diff)
From: David Hildenbrand <david@redhat.com>
To: linux-kernel@vger.kernel.org
Cc: linux-s390@vger.kernel.org, Michal Hocko <mhocko@suse.com>,
	linux-ia64@vger.kernel.org,
	Pavel Tatashin <pasha.tatashin@soleen.com>,
	linux-sh@vger.kernel.org,
	"Aneesh Kumar K . V" <aneesh.kumar@linux.ibm.com>,
	x86@kernel.org, David Hildenbrand <david@redhat.com>,
	linux-mm@kvack.org, Wei Yang <richardw.yang@linux.intel.com>,
	Andrew Morton <akpm@linux-foundation.org>,
	linuxppc-dev@lists.ozlabs.org,
	Dan Williams <dan.j.williams@intel.com>,
	linux-arm-kernel@lists.infradead.org,
	Oscar Salvador <osalvador@suse.de>
Subject: [PATCH v6 03/10] mm/memory_hotplug: Don't access uninitialized memmaps in shrink_pgdat_span()
Date: Sun,  6 Oct 2019 10:56:39 +0200	[thread overview]
Message-ID: <20191006085646.5768-4-david@redhat.com> (raw)
In-Reply-To: <20191006085646.5768-1-david@redhat.com>

We might use the nid of memmaps that were never initialized. For
example, if the memmap was poisoned, we will crash the kernel in
pfn_to_nid() right now. Let's use the calculated boundaries of the separate
zones instead. This now also avoids having to iterate over a whole bunch of
subsections again, after shrinking one zone.

Before commit d0dc12e86b31 ("mm/memory_hotplug: optimize memory
hotplug"), the memmap was initialized to 0 and the node was set to the
right value. After that commit, the node might be garbage.

We'll have to fix shrink_zone_span() next.

Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Oscar Salvador <osalvador@suse.de>
Cc: David Hildenbrand <david@redhat.com>
Cc: Michal Hocko <mhocko@suse.com>
Cc: Pavel Tatashin <pasha.tatashin@soleen.com>
Cc: Dan Williams <dan.j.williams@intel.com>
Cc: Wei Yang <richardw.yang@linux.intel.com>
Fixes: d0dc12e86b31 ("mm/memory_hotplug: optimize memory hotplug")
Reported-by: Aneesh Kumar K.V <aneesh.kumar@linux.ibm.com>
Signed-off-by: David Hildenbrand <david@redhat.com>
---
 mm/memory_hotplug.c | 72 ++++++++++-----------------------------------
 1 file changed, 15 insertions(+), 57 deletions(-)

diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c
index 680b4b3e57d9..86b4dc18e831 100644
--- a/mm/memory_hotplug.c
+++ b/mm/memory_hotplug.c
@@ -436,67 +436,25 @@ static void shrink_zone_span(struct zone *zone, unsigned long start_pfn,
 	zone_span_writeunlock(zone);
 }
 
-static void shrink_pgdat_span(struct pglist_data *pgdat,
-			      unsigned long start_pfn, unsigned long end_pfn)
+static void update_pgdat_span(struct pglist_data *pgdat)
 {
-	unsigned long pgdat_start_pfn = pgdat->node_start_pfn;
-	unsigned long p = pgdat_end_pfn(pgdat); /* pgdat_end_pfn namespace clash */
-	unsigned long pgdat_end_pfn = p;
-	unsigned long pfn;
-	int nid = pgdat->node_id;
-
-	if (pgdat_start_pfn == start_pfn) {
-		/*
-		 * If the section is smallest section in the pgdat, it need
-		 * shrink pgdat->node_start_pfn and pgdat->node_spanned_pages.
-		 * In this case, we find second smallest valid mem_section
-		 * for shrinking zone.
-		 */
-		pfn = find_smallest_section_pfn(nid, NULL, end_pfn,
-						pgdat_end_pfn);
-		if (pfn) {
-			pgdat->node_start_pfn = pfn;
-			pgdat->node_spanned_pages = pgdat_end_pfn - pfn;
-		}
-	} else if (pgdat_end_pfn == end_pfn) {
-		/*
-		 * If the section is biggest section in the pgdat, it need
-		 * shrink pgdat->node_spanned_pages.
-		 * In this case, we find second biggest valid mem_section for
-		 * shrinking zone.
-		 */
-		pfn = find_biggest_section_pfn(nid, NULL, pgdat_start_pfn,
-					       start_pfn);
-		if (pfn)
-			pgdat->node_spanned_pages = pfn - pgdat_start_pfn + 1;
-	}
-
-	/*
-	 * If the section is not biggest or smallest mem_section in the pgdat,
-	 * it only creates a hole in the pgdat. So in this case, we need not
-	 * change the pgdat.
-	 * But perhaps, the pgdat has only hole data. Thus it check the pgdat
-	 * has only hole or not.
-	 */
-	pfn = pgdat_start_pfn;
-	for (; pfn < pgdat_end_pfn; pfn += PAGES_PER_SUBSECTION) {
-		if (unlikely(!pfn_valid(pfn)))
-			continue;
-
-		if (pfn_to_nid(pfn) != nid)
-			continue;
+	unsigned long node_start_pfn = 0, node_end_pfn = 0;
+	struct zone *zone;
 
-		/* Skip range to be removed */
-		if (pfn >= start_pfn && pfn < end_pfn)
-			continue;
+	for (zone = pgdat->node_zones;
+	     zone < pgdat->node_zones + MAX_NR_ZONES; zone++) {
+		unsigned long zone_end_pfn = zone->zone_start_pfn +
+					     zone->spanned_pages;
 
-		/* If we find valid section, we have nothing to do */
-		return;
+		/* No need to lock the zones, they can't change. */
+		if (zone_end_pfn > node_end_pfn)
+			node_end_pfn = zone_end_pfn;
+		if (zone->zone_start_pfn < node_start_pfn)
+			node_start_pfn = zone->zone_start_pfn;
 	}
 
-	/* The pgdat has no valid section */
-	pgdat->node_start_pfn = 0;
-	pgdat->node_spanned_pages = 0;
+	pgdat->node_start_pfn = node_start_pfn;
+	pgdat->node_spanned_pages = node_end_pfn - node_start_pfn;
 }
 
 static void __remove_zone(struct zone *zone, unsigned long start_pfn,
@@ -507,7 +465,7 @@ static void __remove_zone(struct zone *zone, unsigned long start_pfn,
 
 	pgdat_resize_lock(zone->zone_pgdat, &flags);
 	shrink_zone_span(zone, start_pfn, start_pfn + nr_pages);
-	shrink_pgdat_span(pgdat, start_pfn, start_pfn + nr_pages);
+	update_pgdat_span(pgdat);
 	pgdat_resize_unlock(zone->zone_pgdat, &flags);
 }
 
-- 
2.21.0


WARNING: multiple messages have this Message-ID (diff)
From: David Hildenbrand <david@redhat.com>
To: linux-kernel@vger.kernel.org
Cc: linux-s390@vger.kernel.org, Michal Hocko <mhocko@suse.com>,
	linux-ia64@vger.kernel.org,
	Pavel Tatashin <pasha.tatashin@soleen.com>,
	linux-sh@vger.kernel.org,
	"Aneesh Kumar K . V" <aneesh.kumar@linux.ibm.com>,
	x86@kernel.org, David Hildenbrand <david@redhat.com>,
	linux-mm@kvack.org, Wei Yang <richardw.yang@linux.intel.com>,
	Andrew Morton <akpm@linux-foundation.org>,
	linuxppc-dev@lists.ozlabs.org,
	Dan Williams <dan.j.williams@intel.com>,
	linux-arm-kernel@lists.infradead.org,
	Oscar Salvador <osalvador@suse.de>
Subject: [PATCH v6 03/10] mm/memory_hotplug: Don't access uninitialized memmaps in shrink_pgdat_span()
Date: Sun,  6 Oct 2019 10:56:39 +0200	[thread overview]
Message-ID: <20191006085646.5768-4-david@redhat.com> (raw)
In-Reply-To: <20191006085646.5768-1-david@redhat.com>

We might use the nid of memmaps that were never initialized. For
example, if the memmap was poisoned, we will crash the kernel in
pfn_to_nid() right now. Let's use the calculated boundaries of the separate
zones instead. This now also avoids having to iterate over a whole bunch of
subsections again, after shrinking one zone.

Before commit d0dc12e86b31 ("mm/memory_hotplug: optimize memory
hotplug"), the memmap was initialized to 0 and the node was set to the
right value. After that commit, the node might be garbage.

We'll have to fix shrink_zone_span() next.

Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Oscar Salvador <osalvador@suse.de>
Cc: David Hildenbrand <david@redhat.com>
Cc: Michal Hocko <mhocko@suse.com>
Cc: Pavel Tatashin <pasha.tatashin@soleen.com>
Cc: Dan Williams <dan.j.williams@intel.com>
Cc: Wei Yang <richardw.yang@linux.intel.com>
Fixes: d0dc12e86b31 ("mm/memory_hotplug: optimize memory hotplug")
Reported-by: Aneesh Kumar K.V <aneesh.kumar@linux.ibm.com>
Signed-off-by: David Hildenbrand <david@redhat.com>
---
 mm/memory_hotplug.c | 72 ++++++++++-----------------------------------
 1 file changed, 15 insertions(+), 57 deletions(-)

diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c
index 680b4b3e57d9..86b4dc18e831 100644
--- a/mm/memory_hotplug.c
+++ b/mm/memory_hotplug.c
@@ -436,67 +436,25 @@ static void shrink_zone_span(struct zone *zone, unsigned long start_pfn,
 	zone_span_writeunlock(zone);
 }
 
-static void shrink_pgdat_span(struct pglist_data *pgdat,
-			      unsigned long start_pfn, unsigned long end_pfn)
+static void update_pgdat_span(struct pglist_data *pgdat)
 {
-	unsigned long pgdat_start_pfn = pgdat->node_start_pfn;
-	unsigned long p = pgdat_end_pfn(pgdat); /* pgdat_end_pfn namespace clash */
-	unsigned long pgdat_end_pfn = p;
-	unsigned long pfn;
-	int nid = pgdat->node_id;
-
-	if (pgdat_start_pfn == start_pfn) {
-		/*
-		 * If the section is smallest section in the pgdat, it need
-		 * shrink pgdat->node_start_pfn and pgdat->node_spanned_pages.
-		 * In this case, we find second smallest valid mem_section
-		 * for shrinking zone.
-		 */
-		pfn = find_smallest_section_pfn(nid, NULL, end_pfn,
-						pgdat_end_pfn);
-		if (pfn) {
-			pgdat->node_start_pfn = pfn;
-			pgdat->node_spanned_pages = pgdat_end_pfn - pfn;
-		}
-	} else if (pgdat_end_pfn == end_pfn) {
-		/*
-		 * If the section is biggest section in the pgdat, it need
-		 * shrink pgdat->node_spanned_pages.
-		 * In this case, we find second biggest valid mem_section for
-		 * shrinking zone.
-		 */
-		pfn = find_biggest_section_pfn(nid, NULL, pgdat_start_pfn,
-					       start_pfn);
-		if (pfn)
-			pgdat->node_spanned_pages = pfn - pgdat_start_pfn + 1;
-	}
-
-	/*
-	 * If the section is not biggest or smallest mem_section in the pgdat,
-	 * it only creates a hole in the pgdat. So in this case, we need not
-	 * change the pgdat.
-	 * But perhaps, the pgdat has only hole data. Thus it check the pgdat
-	 * has only hole or not.
-	 */
-	pfn = pgdat_start_pfn;
-	for (; pfn < pgdat_end_pfn; pfn += PAGES_PER_SUBSECTION) {
-		if (unlikely(!pfn_valid(pfn)))
-			continue;
-
-		if (pfn_to_nid(pfn) != nid)
-			continue;
+	unsigned long node_start_pfn = 0, node_end_pfn = 0;
+	struct zone *zone;
 
-		/* Skip range to be removed */
-		if (pfn >= start_pfn && pfn < end_pfn)
-			continue;
+	for (zone = pgdat->node_zones;
+	     zone < pgdat->node_zones + MAX_NR_ZONES; zone++) {
+		unsigned long zone_end_pfn = zone->zone_start_pfn +
+					     zone->spanned_pages;
 
-		/* If we find valid section, we have nothing to do */
-		return;
+		/* No need to lock the zones, they can't change. */
+		if (zone_end_pfn > node_end_pfn)
+			node_end_pfn = zone_end_pfn;
+		if (zone->zone_start_pfn < node_start_pfn)
+			node_start_pfn = zone->zone_start_pfn;
 	}
 
-	/* The pgdat has no valid section */
-	pgdat->node_start_pfn = 0;
-	pgdat->node_spanned_pages = 0;
+	pgdat->node_start_pfn = node_start_pfn;
+	pgdat->node_spanned_pages = node_end_pfn - node_start_pfn;
 }
 
 static void __remove_zone(struct zone *zone, unsigned long start_pfn,
@@ -507,7 +465,7 @@ static void __remove_zone(struct zone *zone, unsigned long start_pfn,
 
 	pgdat_resize_lock(zone->zone_pgdat, &flags);
 	shrink_zone_span(zone, start_pfn, start_pfn + nr_pages);
-	shrink_pgdat_span(pgdat, start_pfn, start_pfn + nr_pages);
+	update_pgdat_span(pgdat);
 	pgdat_resize_unlock(zone->zone_pgdat, &flags);
 }
 
-- 
2.21.0


_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

  parent reply	other threads:[~2019-10-06  8:56 UTC|newest]

Thread overview: 263+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-10-06  8:56 [PATCH v6 00/10] mm/memory_hotplug: Shrink zones before removing memory David Hildenbrand
2019-10-06  8:56 ` David Hildenbrand
2019-10-06  8:56 ` [PATCH v6 01/10] mm/memunmap: Don't access uninitialized memmap in memunmap_pages() David Hildenbrand
2019-10-06  8:56   ` David Hildenbrand
2019-10-06  8:56   ` David Hildenbrand
2019-10-06  8:56   ` David Hildenbrand
2019-10-06 19:58   ` Damian Tometzki
2019-10-06 19:58     ` Damian Tometzki
2019-10-06 19:58     ` Damian Tometzki
2019-10-06 19:58     ` Damian Tometzki
2019-10-06 20:13     ` David Hildenbrand
2019-10-06 20:13       ` David Hildenbrand
2019-10-06 20:13       ` David Hildenbrand
2019-10-14  9:05   ` David Hildenbrand
2019-10-14  9:05     ` David Hildenbrand
2019-10-14  9:05     ` David Hildenbrand
2019-10-14  9:05     ` David Hildenbrand
2019-10-06  8:56 ` [PATCH v6 02/10] mm/memmap_init: Update variable name in memmap_init_zone David Hildenbrand
2019-10-06  8:56   ` David Hildenbrand
2019-10-06  8:56   ` David Hildenbrand
2019-10-06  8:56   ` David Hildenbrand
2019-10-06  8:56 ` David Hildenbrand [this message]
2019-10-06  8:56   ` [PATCH v6 03/10] mm/memory_hotplug: Don't access uninitialized memmaps in shrink_pgdat_span() David Hildenbrand
2019-10-06  8:56   ` David Hildenbrand
2019-10-06  8:56   ` David Hildenbrand
2019-10-14  9:31   ` David Hildenbrand
2019-10-14  9:31     ` David Hildenbrand
2019-10-14  9:31     ` David Hildenbrand
2019-10-14  9:31     ` David Hildenbrand
2019-10-06  8:56 ` [PATCH v6 04/10] mm/memory_hotplug: Don't access uninitialized memmaps in shrink_zone_span() David Hildenbrand
2019-10-06  8:56   ` David Hildenbrand
2019-10-06  8:56   ` David Hildenbrand
2019-10-06  8:56   ` David Hildenbrand
2019-10-14  9:32   ` David Hildenbrand
2019-10-14  9:32     ` David Hildenbrand
2019-10-14  9:32     ` David Hildenbrand
2019-10-14  9:32     ` David Hildenbrand
2019-10-14 19:17     ` Andrew Morton
2019-10-14 19:17       ` Andrew Morton
2019-10-14 19:17       ` Andrew Morton
2019-10-14 19:17       ` Andrew Morton
2019-11-19 14:16       ` David Hildenbrand
2019-11-19 14:16         ` David Hildenbrand
2019-11-19 14:16         ` David Hildenbrand
2019-11-19 14:16         ` David Hildenbrand
2019-11-19 20:44         ` Andrew Morton
2019-11-19 20:44           ` Andrew Morton
2019-11-19 20:44           ` Andrew Morton
2019-11-19 20:44           ` Andrew Morton
2019-10-06  8:56 ` [PATCH v6 05/10] mm/memory_hotplug: Shrink zones when offlining memory David Hildenbrand
2019-10-06  8:56   ` David Hildenbrand
2019-10-14  9:39   ` David Hildenbrand
2019-10-14  9:39     ` David Hildenbrand
2019-10-14 19:16     ` Andrew Morton
2019-10-14 19:16       ` Andrew Morton
2019-10-27 22:45   ` David Hildenbrand
2019-10-27 22:45     ` David Hildenbrand
2019-11-30 23:21     ` Andrew Morton
2019-11-30 23:21       ` Andrew Morton
2019-11-30 23:43       ` David Hildenbrand
2019-11-30 23:43         ` David Hildenbrand
2019-12-18 17:08       ` David Hildenbrand
2019-12-18 17:08         ` David Hildenbrand
2019-12-18 20:16         ` Andrew Morton
2019-12-18 20:16           ` Andrew Morton
2019-12-03 15:10   ` Oscar Salvador
2019-12-03 15:10     ` Oscar Salvador
2019-12-03 15:27     ` David Hildenbrand
2019-12-03 15:27       ` David Hildenbrand
2019-12-03 15:27       ` David Hildenbrand
2019-12-03 15:27       ` David Hildenbrand
2019-10-06  8:56 ` [PATCH v6 06/10] mm/memory_hotplug: Poison memmap in remove_pfn_range_from_zone() David Hildenbrand
2019-10-06  8:56   ` David Hildenbrand
2019-10-06  8:56   ` David Hildenbrand
2019-10-06  8:56   ` David Hildenbrand
2019-10-16 14:01   ` David Hildenbrand
2019-10-16 14:01     ` David Hildenbrand
2019-10-16 14:01     ` David Hildenbrand
2019-10-16 14:01     ` David Hildenbrand
2020-02-04  8:59   ` Oscar Salvador
2020-02-04  8:59     ` Oscar Salvador
2020-02-04  8:59     ` Oscar Salvador
2020-02-04  8:59     ` Oscar Salvador
2019-10-06  8:56 ` [PATCH v6 07/10] mm/memory_hotplug: We always have a zone in find_(smallest|biggest)_section_pfn David Hildenbrand
2019-10-06  8:56   ` David Hildenbrand
2019-10-06  8:56   ` David Hildenbrand
2019-10-06  8:56   ` David Hildenbrand
2020-02-04  9:06   ` Oscar Salvador
2020-02-04  9:06     ` Oscar Salvador
2020-02-04  9:06     ` Oscar Salvador
2020-02-04  9:06     ` Oscar Salvador
2020-02-05  8:57   ` Wei Yang
2020-02-05  8:57     ` Wei Yang
2020-02-05  8:57     ` Wei Yang
2020-02-05  8:57     ` Wei Yang
2020-02-05  8:59     ` David Hildenbrand
2020-02-05  8:59       ` David Hildenbrand
2020-02-05  8:59       ` David Hildenbrand
2020-02-05  8:59       ` David Hildenbrand
2020-02-05  9:26       ` Wei Yang
2020-02-05  9:26         ` Wei Yang
2020-02-05  9:26         ` Wei Yang
2020-02-05  9:26         ` Wei Yang
2019-10-06  8:56 ` [PATCH v6 08/10] mm/memory_hotplug: Don't check for "all holes" in shrink_zone_span() David Hildenbrand
2019-10-06  8:56   ` David Hildenbrand
2019-10-06  8:56   ` David Hildenbrand
2019-10-06  8:56   ` David Hildenbrand
2020-02-04  9:13   ` Oscar Salvador
2020-02-04  9:13     ` Oscar Salvador
2020-02-04  9:13     ` Oscar Salvador
2020-02-04  9:13     ` Oscar Salvador
2020-02-04  9:20     ` David Hildenbrand
2020-02-04  9:20       ` David Hildenbrand
2020-02-04  9:20       ` David Hildenbrand
2020-02-04  9:20       ` David Hildenbrand
2020-02-04 14:25   ` Baoquan He
2020-02-04 14:25     ` Baoquan He
2020-02-04 14:25     ` Baoquan He
2020-02-04 14:25     ` Baoquan He
2020-02-04 14:42     ` David Hildenbrand
2020-02-04 14:42       ` David Hildenbrand
2020-02-04 14:42       ` David Hildenbrand
2020-02-04 14:42       ` David Hildenbrand
2020-02-05 12:43       ` Baoquan He
2020-02-05 12:43         ` Baoquan He
2020-02-05 12:43         ` Baoquan He
2020-02-05 12:43         ` Baoquan He
2020-02-05 13:20         ` David Hildenbrand
2020-02-05 13:20           ` David Hildenbrand
2020-02-05 13:20           ` David Hildenbrand
2020-02-05 13:20           ` David Hildenbrand
2020-02-05 13:34           ` Baoquan He
2020-02-05 13:34             ` Baoquan He
2020-02-05 13:34             ` Baoquan He
2020-02-05 13:34             ` Baoquan He
2020-02-05 13:38             ` David Hildenbrand
2020-02-05 13:38               ` David Hildenbrand
2020-02-05 13:38               ` David Hildenbrand
2020-02-05 13:38               ` David Hildenbrand
2020-02-05 14:12               ` Baoquan He
2020-02-05 14:12                 ` Baoquan He
2020-02-05 14:12                 ` Baoquan He
2020-02-05 14:12                 ` Baoquan He
2020-02-05 14:16                 ` David Hildenbrand
2020-02-05 14:16                   ` David Hildenbrand
2020-02-05 14:16                   ` David Hildenbrand
2020-02-05 14:16                   ` David Hildenbrand
2020-02-05 14:26                   ` Baoquan He
2020-02-05 14:26                     ` Baoquan He
2020-02-05 14:26                     ` Baoquan He
2020-02-05 14:26                     ` Baoquan He
2020-02-05  9:59   ` Wei Yang
2020-02-05  9:59     ` Wei Yang
2020-02-05  9:59     ` Wei Yang
2020-02-05  9:59     ` Wei Yang
2020-02-05 14:48     ` Baoquan He
2020-02-05 14:48       ` Baoquan He
2020-02-05 14:48       ` Baoquan He
2020-02-05 14:48       ` Baoquan He
2020-02-05 22:56       ` Wei Yang
2020-02-05 22:56         ` Wei Yang
2020-02-05 22:56         ` Wei Yang
2020-02-05 22:56         ` Wei Yang
2020-02-05 23:08         ` Baoquan He
2020-02-05 23:08           ` Baoquan He
2020-02-05 23:08           ` Baoquan He
2020-02-05 23:08           ` Baoquan He
2020-02-05 23:26           ` Wei Yang
2020-02-05 23:26             ` Wei Yang
2020-02-05 23:26             ` Wei Yang
2020-02-05 23:26             ` Wei Yang
2020-02-05 23:30             ` Baoquan He
2020-02-05 23:30               ` Baoquan He
2020-02-05 23:30               ` Baoquan He
2020-02-05 23:30               ` Baoquan He
2020-02-05 23:34               ` Wei Yang
2020-02-05 23:34                 ` Wei Yang
2020-02-05 23:34                 ` Wei Yang
2020-02-05 23:34                 ` Wei Yang
2020-02-05 14:54     ` David Laight
2020-02-05 14:54       ` David Laight
2020-02-05 14:54       ` David Laight
2020-02-05 14:54       ` David Laight
2020-02-05 14:54       ` David Laight
2020-02-05 14:55       ` David Hildenbrand
2020-02-05 14:55         ` David Hildenbrand
2020-02-05 14:55         ` David Hildenbrand
2020-02-05 14:55         ` David Hildenbrand
2020-02-05 14:55         ` David Hildenbrand
2019-10-06  8:56 ` [PATCH v6 09/10] mm/memory_hotplug: Drop local variables " David Hildenbrand
2019-10-06  8:56   ` David Hildenbrand
2019-10-06  8:56   ` David Hildenbrand
2019-10-06  8:56   ` David Hildenbrand
2020-02-04  9:26   ` Oscar Salvador
2020-02-04  9:26     ` Oscar Salvador
2020-02-04  9:26     ` Oscar Salvador
2020-02-04  9:26     ` Oscar Salvador
2020-02-04  9:29     ` David Hildenbrand
2020-02-04  9:29       ` David Hildenbrand
2020-02-04  9:29       ` David Hildenbrand
2020-02-04  9:29       ` David Hildenbrand
2020-02-05 10:07   ` Wei Yang
2020-02-05 10:07     ` Wei Yang
2020-02-05 10:07     ` Wei Yang
2020-02-05 10:07     ` Wei Yang
2019-10-06  8:56 ` [PATCH v6 10/10] mm/memory_hotplug: Cleanup __remove_pages() David Hildenbrand
2019-10-06  8:56   ` David Hildenbrand
2019-10-06  8:56   ` David Hildenbrand
2019-10-06  8:56   ` David Hildenbrand
2020-02-04  9:46   ` Oscar Salvador
2020-02-04  9:46     ` Oscar Salvador
2020-02-04  9:46     ` Oscar Salvador
2020-02-04  9:46     ` Oscar Salvador
2020-02-04 12:41     ` David Hildenbrand
2020-02-04 12:41       ` David Hildenbrand
2020-02-04 12:41       ` David Hildenbrand
2020-02-04 12:41       ` David Hildenbrand
2020-02-04 13:13       ` Segher Boessenkool
2020-02-04 13:13         ` Segher Boessenkool
2020-02-04 13:13         ` Segher Boessenkool
2020-02-04 13:13         ` Segher Boessenkool
2020-02-04 13:38         ` David Hildenbrand
2020-02-04 13:38           ` David Hildenbrand
2020-02-04 13:38           ` David Hildenbrand
2020-02-04 13:38           ` David Hildenbrand
2020-02-05 12:51           ` Segher Boessenkool
2020-02-05 12:51             ` Segher Boessenkool
2020-02-05 12:51             ` Segher Boessenkool
2020-02-05 12:51             ` Segher Boessenkool
2020-02-05 13:17             ` David Hildenbrand
2020-02-05 13:17               ` David Hildenbrand
2020-02-05 13:17               ` David Hildenbrand
2020-02-05 13:17               ` David Hildenbrand
2020-02-05 13:18               ` David Hildenbrand
2020-02-05 13:18                 ` David Hildenbrand
2020-02-05 13:18                 ` David Hildenbrand
2020-02-05 13:18                 ` David Hildenbrand
2020-02-05 13:23                 ` David Hildenbrand
2020-02-05 13:23                   ` David Hildenbrand
2020-02-05 13:23                   ` David Hildenbrand
2020-02-05 13:23                   ` David Hildenbrand
2020-02-05 11:48   ` Wei Yang
2020-02-05 11:48     ` Wei Yang
2020-02-05 11:48     ` Wei Yang
2020-02-05 11:48     ` Wei Yang
2019-12-02  9:09 ` [PATCH v6 00/10] mm/memory_hotplug: Shrink zones before removing memory David Hildenbrand
2019-12-02  9:09   ` David Hildenbrand
2019-12-03 13:36   ` Oscar Salvador
2019-12-03 13:36     ` Oscar Salvador
2020-01-31  4:40     ` Andrew Morton
2020-01-31  4:40       ` Andrew Morton
2020-01-31  9:18       ` David Hildenbrand
2020-01-31  9:18         ` David Hildenbrand
2020-01-31 10:03         ` Michal Hocko
2020-01-31 10:03           ` Michal Hocko
2020-01-31 10:36           ` David Hildenbrand
2020-01-31 10:36             ` David Hildenbrand
2020-02-04  1:46         ` Andrew Morton
2020-02-04  1:46           ` Andrew Morton
2020-02-04  8:45           ` David Hildenbrand
2020-02-04  8:45             ` David Hildenbrand
2020-02-04  9:51             ` Oscar Salvador
2020-02-04  9:51               ` Oscar Salvador

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20191006085646.5768-4-david@redhat.com \
    --to=david@redhat.com \
    --cc=akpm@linux-foundation.org \
    --cc=aneesh.kumar@linux.ibm.com \
    --cc=dan.j.williams@intel.com \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-ia64@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=linux-s390@vger.kernel.org \
    --cc=linux-sh@vger.kernel.org \
    --cc=linuxppc-dev@lists.ozlabs.org \
    --cc=mhocko@suse.com \
    --cc=osalvador@suse.de \
    --cc=pasha.tatashin@soleen.com \
    --cc=richardw.yang@linux.intel.com \
    --cc=x86@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.