Message ID | 20230830182753.55367-2-zi.yan@sent.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | Use nth_page() in place of direct struct page manipulation | expand |
> On Aug 31, 2023, at 02:27, Zi Yan <zi.yan@sent.com> wrote: > > From: Zi Yan <ziy@nvidia.com> > > 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 nth_page() to handle > it properly. > > Signed-off-by: Zi Yan <ziy@nvidia.com> Reviewed-by: Muchun Song <songmuchun@bytedance.com> Maybe 3 separate patches would be better for backporting purpose.
On 31 Aug 2023, at 3:14, Muchun Song wrote: >> On Aug 31, 2023, at 02:27, Zi Yan <zi.yan@sent.com> wrote: >> >> From: Zi Yan <ziy@nvidia.com> >> >> 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 nth_page() to handle >> it properly. >> >> Signed-off-by: Zi Yan <ziy@nvidia.com> > > Reviewed-by: Muchun Song <songmuchun@bytedance.com> > > Maybe 3 separate patches would be better for backporting purpose. Sure. Will split it and add Fixes in the next version. -- Best Regards, Yan, Zi
diff --git a/mm/cma.c b/mm/cma.c index da2967c6a223..2b2494fd6b59 100644 --- a/mm/cma.c +++ b/mm/cma.c @@ -505,7 +505,7 @@ struct page *cma_alloc(struct cma *cma, unsigned long count, */ if (page) { for (i = 0; i < count; i++) - page_kasan_tag_reset(page + i); + page_kasan_tag_reset(nth_page(page, i)); } if (ret && !no_warn) { diff --git a/mm/hugetlb.c b/mm/hugetlb.c index ba6d39b71cb1..77e8d2cf4eed 100644 --- a/mm/hugetlb.c +++ b/mm/hugetlb.c @@ -6474,7 +6474,7 @@ struct page *hugetlb_follow_page_mask(struct vm_area_struct *vma, } } - page += ((address & ~huge_page_mask(h)) >> PAGE_SHIFT); + page = nth_page(page, ((address & ~huge_page_mask(h)) >> PAGE_SHIFT)); /* * Note that page may be a sub-page, and with vmemmap 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;