linux-mm.kvack.org archive mirror
 help / color / mirror / Atom feed
* [PATCH RFC] mm: skip gigantic pages in isolate_single_pageblock() when mem offline
@ 2024-08-13 12:52 Kefeng Wang
  2024-08-13 14:03 ` Matthew Wilcox
  0 siblings, 1 reply; 9+ messages in thread
From: Kefeng Wang @ 2024-08-13 12:52 UTC (permalink / raw)
  To: Andrew Morton, David Hildenbrand, Oscar Salvador, Zi Yan
  Cc: linux-mm, Kefeng Wang

The gigantic page size may larger than memory block size, so memory
offline always fails in this case after commit b2c9e2fbba32 ("mm: make
alloc_contig_range work at pageblock granularity"),

offline_pages
  start_isolate_page_range
    start_isolate_page_range(isolate_before=true)
      isolate [isolate_start, isolate_start + pageblock_nr_pages)
    start_isolate_page_range(isolate_before=false)
      isolate [isolate_end - pageblock_nr_pages, isolate_end) pageblock
       	__alloc_contig_migrate_range
          isolate_migratepages_range
            isolate_migratepages_block
              isolate_or_dissolve_huge_page
                if (hstate_is_gigantic(h))
                    return -ENOMEM;

[   15.815756] memory offlining [mem 0x3c0000000-0x3c7ffffff] failed due to failure to isolate range

Fix it by skipping the __alloc_contig_migrate_range() if met gigantic
pages when memory offline, which return back to the original logic to
handle the gigantic pages.

Fixes: b2c9e2fbba32 ("mm: make alloc_contig_range work at pageblock granularity")
Signed-off-by: Kefeng Wang <wangkefeng.wang@huawei.com>
---
 mm/page_isolation.c | 10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/mm/page_isolation.c b/mm/page_isolation.c
index 042937d5abe4..25db4040e70a 100644
--- a/mm/page_isolation.c
+++ b/mm/page_isolation.c
@@ -400,6 +400,16 @@ static int isolate_single_pageblock(unsigned long boundary_pfn, int flags,
 				continue;
 			}
 
+			if ((flags & MEMORY_OFFLINE) && PageHuge(page)) {
+				struct hstate *h;
+
+				h = size_to_hstate(nr_pages << PAGE_SHIFT);
+				if (hstate_is_gigantic(h)) {
+					pfn = head_pfn + nr_pages;
+					continue;
+				}
+			}
+
 #if defined CONFIG_COMPACTION || defined CONFIG_CMA
 			if (PageHuge(page)) {
 				int page_mt = get_pageblock_migratetype(page);
-- 
2.27.0



^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2024-08-16  0:56 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2024-08-13 12:52 [PATCH RFC] mm: skip gigantic pages in isolate_single_pageblock() when mem offline Kefeng Wang
2024-08-13 14:03 ` Matthew Wilcox
2024-08-13 14:46   ` Kefeng Wang
2024-08-13 14:59     ` Zi Yan
2024-08-14  2:01       ` Kefeng Wang
2024-08-14 14:53         ` Zi Yan
2024-08-15  2:58           ` Kefeng Wang
2024-08-15 16:43             ` Zi Yan
2024-08-16  0:56               ` Kefeng Wang

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox