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>, "Aneesh Kumar K . V" <aneesh.kumar@linux.ibm.com> Subject: [PATCH v6 04/10] mm/memory_hotplug: Don't access uninitialized memmaps in shrink_zone_span() Date: Sun, 6 Oct 2019 10:56:40 +0200 Message-ID: <20191006085646.5768-5-david@redhat.com> (raw) In-Reply-To: <20191006085646.5768-1-david@redhat.com> Let's limit shrinking to !ZONE_DEVICE so we can fix the current code. We should never try to touch the memmap of offline sections where we could have uninitialized memmaps and could trigger BUGs when calling page_to_nid() on poisoned pages. There is no reliable way to distinguish an uninitialized memmap from an initialized memmap that belongs to ZONE_DEVICE, as we don't have anything like SECTION_IS_ONLINE we can use similar to pfn_to_online_section() for !ZONE_DEVICE memory. E.g., set_zone_contiguous() similarly relies on pfn_to_online_section() and will therefore never set a ZONE_DEVICE zone consecutive. Stopping to shrink the ZONE_DEVICE therefore results in no observable changes, besides /proc/zoneinfo indicating different boundaries - something we can totally live with. Before commit d0dc12e86b31 ("mm/memory_hotplug: optimize memory hotplug"), the memmap was initialized with 0 and the node with the right value. So the zone might be wrong but not garbage. After that commit, both the zone and the node will be garbage when touching uninitialized memmaps. 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> 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 | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c index 86b4dc18e831..f96608d24f6a 100644 --- a/mm/memory_hotplug.c +++ b/mm/memory_hotplug.c @@ -331,7 +331,7 @@ static unsigned long find_smallest_section_pfn(int nid, struct zone *zone, unsigned long end_pfn) { for (; start_pfn < end_pfn; start_pfn += PAGES_PER_SUBSECTION) { - if (unlikely(!pfn_valid(start_pfn))) + if (unlikely(!pfn_to_online_page(start_pfn))) continue; if (unlikely(pfn_to_nid(start_pfn) != nid)) @@ -356,7 +356,7 @@ 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_SUBSECTION) { - if (unlikely(!pfn_valid(pfn))) + if (unlikely(!pfn_to_online_page(pfn))) continue; if (unlikely(pfn_to_nid(pfn) != nid)) @@ -415,7 +415,7 @@ static void shrink_zone_span(struct zone *zone, unsigned long start_pfn, */ pfn = zone_start_pfn; for (; pfn < zone_end_pfn; pfn += PAGES_PER_SUBSECTION) { - if (unlikely(!pfn_valid(pfn))) + if (unlikely(!pfn_to_online_page(pfn))) continue; if (page_zone(pfn_to_page(pfn)) != zone) @@ -463,6 +463,16 @@ static void __remove_zone(struct zone *zone, unsigned long start_pfn, struct pglist_data *pgdat = zone->zone_pgdat; unsigned long flags; +#ifdef CONFIG_ZONE_DEVICE + /* + * Zone shrinking code cannot properly deal with ZONE_DEVICE. So + * we will not try to shrink the zones - which is okay as + * set_zone_contiguous() cannot deal with ZONE_DEVICE either way. + */ + if (zone_idx(zone) == ZONE_DEVICE) + return; +#endif + pgdat_resize_lock(zone->zone_pgdat, &flags); shrink_zone_span(zone, start_pfn, start_pfn + nr_pages); update_pgdat_span(pgdat); -- 2.21.0
next prev parent reply index Thread overview: 75+ 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 ` [PATCH v6 01/10] mm/memunmap: Don't access uninitialized memmap in memunmap_pages() David Hildenbrand 2019-10-06 19:58 ` Damian Tometzki 2019-10-06 20:13 ` 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 ` [PATCH v6 03/10] mm/memory_hotplug: Don't access uninitialized memmaps in shrink_pgdat_span() David Hildenbrand 2019-10-14 9:31 ` David Hildenbrand 2019-10-06 8:56 ` David Hildenbrand [this message] 2019-10-14 9:32 ` [PATCH v6 04/10] mm/memory_hotplug: Don't access uninitialized memmaps in shrink_zone_span() David Hildenbrand 2019-10-14 19:17 ` Andrew Morton 2019-11-19 14:16 ` David Hildenbrand 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-14 9:39 ` David Hildenbrand 2019-10-14 19:16 ` Andrew Morton 2019-10-27 22:45 ` David Hildenbrand 2019-11-30 23:21 ` Andrew Morton 2019-11-30 23:43 ` David Hildenbrand 2019-12-18 17:08 ` David Hildenbrand 2019-12-18 20:16 ` Andrew Morton 2019-12-03 15:10 ` Oscar Salvador 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-16 14:01 ` David Hildenbrand 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 2020-02-04 9:06 ` Oscar Salvador 2020-02-05 8:57 ` Wei Yang 2020-02-05 8:59 ` David Hildenbrand 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 2020-02-04 9:13 ` Oscar Salvador 2020-02-04 9:20 ` David Hildenbrand 2020-02-04 14:25 ` Baoquan He 2020-02-04 14:42 ` David Hildenbrand 2020-02-05 12:43 ` Baoquan He 2020-02-05 13:20 ` David Hildenbrand 2020-02-05 13:34 ` Baoquan He 2020-02-05 13:38 ` David Hildenbrand 2020-02-05 14:12 ` Baoquan He 2020-02-05 14:16 ` David Hildenbrand 2020-02-05 14:26 ` Baoquan He 2020-02-05 9:59 ` Wei Yang 2020-02-05 14:48 ` Baoquan He 2020-02-05 22:56 ` Wei Yang 2020-02-05 23:08 ` Baoquan He 2020-02-05 23:26 ` Wei Yang 2020-02-05 23:30 ` Baoquan He 2020-02-05 23:34 ` Wei Yang 2020-02-05 14:54 ` David Laight 2020-02-05 14:55 ` David Hildenbrand 2019-10-06 8:56 ` [PATCH v6 09/10] mm/memory_hotplug: Drop local variables " David Hildenbrand 2020-02-04 9:26 ` Oscar Salvador 2020-02-04 9:29 ` David Hildenbrand 2020-02-05 10:07 ` Wei Yang 2019-10-06 8:56 ` [PATCH v6 10/10] mm/memory_hotplug: Cleanup __remove_pages() David Hildenbrand 2020-02-04 9:46 ` Oscar Salvador 2020-02-04 12:41 ` David Hildenbrand 2020-02-04 13:13 ` Segher Boessenkool 2020-02-04 13:38 ` David Hildenbrand 2020-02-05 12:51 ` Segher Boessenkool 2020-02-05 13:17 ` David Hildenbrand 2020-02-05 13:18 ` David Hildenbrand 2020-02-05 13:23 ` David Hildenbrand 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-03 13:36 ` Oscar Salvador 2020-01-31 4:40 ` Andrew Morton 2020-01-31 9:18 ` David Hildenbrand 2020-01-31 10:03 ` Michal Hocko 2020-01-31 10:36 ` David Hildenbrand 2020-02-04 1:46 ` Andrew Morton 2020-02-04 8:45 ` David Hildenbrand 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-5-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=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
Linux-mm Archive on lore.kernel.org Archives are clonable: git clone --mirror https://lore.kernel.org/linux-mm/0 linux-mm/git/0.git # If you have public-inbox 1.1+ installed, you may # initialize and index your mirror using the following commands: public-inbox-init -V2 linux-mm linux-mm/ https://lore.kernel.org/linux-mm \ linux-mm@kvack.org public-inbox-index linux-mm Example config snippet for mirrors Newsgroup available over NNTP: nntp://nntp.lore.kernel.org/org.kvack.linux-mm AGPL code for this site: git clone https://public-inbox.org/public-inbox.git