When trying to offline pages, HWPoisoned hugepage is migrated without checking PageHWPoison first. So corrupted data could be consumed. Fix it by deferring isolate_huge_page until PageHWPoison is handled. Signed-off-by: Miaohe Lin <linmiaohe@xxxxxxxxxx> --- mm/memory_hotplug.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c index 4c6065e5d274..093f85ec5c5c 100644 --- a/mm/memory_hotplug.c +++ b/mm/memory_hotplug.c @@ -1600,11 +1600,9 @@ do_migrate_range(unsigned long start_pfn, unsigned long end_pfn) folio = page_folio(page); head = &folio->page; - if (PageHuge(page)) { + if (PageHuge(page)) pfn = page_to_pfn(head) + compound_nr(head) - 1; - isolate_huge_page(head, &source); - continue; - } else if (PageTransHuge(page)) + else if (PageTransHuge(page)) pfn = page_to_pfn(head) + thp_nr_pages(page) - 1; /* @@ -1622,6 +1620,11 @@ do_migrate_range(unsigned long start_pfn, unsigned long end_pfn) continue; } + if (PageHuge(page)) { + isolate_huge_page(head, &source); + continue; + } + if (!get_page_unless_zero(page)) continue; /* -- 2.23.0