On 13 Sep 2023, at 16:12, Zi Yan wrote: > From: Zi Yan <ziy@xxxxxxxxxx> > > When dealing with hugetlb pages, manipulating struct page pointers > directly can get to wrong struct page, since struct page is not guaranteed > to be contiguous on SPARSEMEM without VMEMMAP. Use pfn calculation to > handle it properly. > > Fixes: eeb0efd071d8 ("mm,memory_hotplug: fix scan_movable_pages() for gigantic hugepages") > Cc: <stable@xxxxxxxxxxxxxxx> > Signed-off-by: Zi Yan <ziy@xxxxxxxxxx> > Reviewed-by: Muchun Song <songmuchun@xxxxxxxxxxxxx> > Acked-by: David Hildenbrand <david@xxxxxxxxxx> > --- > mm/memory_hotplug.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/mm/memory_hotplug.c b/mm/memory_hotplug.c > index 1b03f4ec6fd2..3b301c4023ff 100644 > --- a/mm/memory_hotplug.c > +++ b/mm/memory_hotplug.c > @@ -1689,7 +1689,7 @@ static int scan_movable_pages(unsigned long start, unsigned long end, > */ > if (HPageMigratable(head)) > goto found; > - skip = compound_nr(head) - (page - head); > + skip = compound_nr(head) - (pfn - page_to_pfn(head)); > pfn += skip - 1; > } > return -ENOENT; > -- > 2.40.1 Without the fix, a wrong number of page might be skipped. Since skip cannot be negative, scan_movable_page() will end early and might miss a movable page with -ENOENT. This might fail offline_pages(). No bug is reported. The fix comes from code inspection. -- Best Regards, Yan, Zi
Attachment:
signature.asc
Description: OpenPGP digital signature