| Message ID | 20260513130542.35604-3-songmuchun@bytedance.com (mailing list archive) |
|---|---|
| State | Handled Elsewhere |
| Headers | show |
| Series | mm: Generalize HVO for HugeTLB and device DAX | expand |
On Wed, May 13, 2026 at 09:04:30PM +0800, Muchun Song wrote: > __hugetlb_vmemmap_optimize_folios() uses incorrect arguments when handling > bootmem HugeTLB folios. > > The section number passed to register_page_bootmem_memmap() is derived from > the vmemmap virtual address of folio->page instead of the folio PFN, so the > bootmem memmap metadata can be registered against the wrong section. The > helper is also given HUGETLB_VMEMMAP_RESERVE_SIZE even though it expects a > page count, not a size in bytes. In addition, the write-protect range is > based on pages_per_huge_page(h), which does not cover the full HugeTLB > vmemmap area and can leave part of the shared tail vmemmap mapping writable. > > Fix the section lookup to use folio_pfn(folio), use > HUGETLB_VMEMMAP_RESERVE_PAGES when registering the reserved memmap pages, and > use hugetlb_vmemmap_size(h) for the write-protect range. > > Fixes: 752fe17af693 ("mm/hugetlb: add pre-HVO framework") > Signed-off-by: Muchun Song <songmuchun@bytedance.com> Acked-by: Oscar Salvador <osalvador@suse.de> did you observe any Ooops or malfunctioning or was just code reviewing?
> On May 14, 2026, at 15:56, Oscar Salvador <osalvador@suse.de> wrote: > > On Wed, May 13, 2026 at 09:04:30PM +0800, Muchun Song wrote: >> __hugetlb_vmemmap_optimize_folios() uses incorrect arguments when handling >> bootmem HugeTLB folios. >> >> The section number passed to register_page_bootmem_memmap() is derived from >> the vmemmap virtual address of folio->page instead of the folio PFN, so the >> bootmem memmap metadata can be registered against the wrong section. The >> helper is also given HUGETLB_VMEMMAP_RESERVE_SIZE even though it expects a >> page count, not a size in bytes. In addition, the write-protect range is >> based on pages_per_huge_page(h), which does not cover the full HugeTLB >> vmemmap area and can leave part of the shared tail vmemmap mapping writable. >> >> Fix the section lookup to use folio_pfn(folio), use >> HUGETLB_VMEMMAP_RESERVE_PAGES when registering the reserved memmap pages, and >> use hugetlb_vmemmap_size(h) for the write-protect range. >> >> Fixes: 752fe17af693 ("mm/hugetlb: add pre-HVO framework") >> Signed-off-by: Muchun Song <songmuchun@bytedance.com> > > Acked-by: Oscar Salvador <osalvador@suse.de> Thanks. > > did you observe any Ooops or malfunctioning or was just code reviewing? Found by LLM (Gemini Pro). When I touched the code here, LLM will report the bug as well, even it is not introduced by me :) Thanks, Muchun > > > > -- > Oscar Salvador > SUSE Labs
diff --git a/mm/hugetlb_vmemmap.c b/mm/hugetlb_vmemmap.c index 62e61af18c9a..4f58cd940f61 100644 --- a/mm/hugetlb_vmemmap.c +++ b/mm/hugetlb_vmemmap.c @@ -635,12 +635,12 @@ static void __hugetlb_vmemmap_optimize_folios(struct hstate *h, * mirrored tail page structs RO. */ spfn = (unsigned long)&folio->page; - epfn = spfn + pages_per_huge_page(h); + epfn = spfn + hugetlb_vmemmap_size(h); vmemmap_wrprotect_hvo(spfn, epfn, folio_nid(folio), HUGETLB_VMEMMAP_RESERVE_SIZE); - register_page_bootmem_memmap(pfn_to_section_nr(spfn), + register_page_bootmem_memmap(pfn_to_section_nr(folio_pfn(folio)), &folio->page, - HUGETLB_VMEMMAP_RESERVE_SIZE); + HUGETLB_VMEMMAP_RESERVE_PAGES); continue; }
__hugetlb_vmemmap_optimize_folios() uses incorrect arguments when handling bootmem HugeTLB folios. The section number passed to register_page_bootmem_memmap() is derived from the vmemmap virtual address of folio->page instead of the folio PFN, so the bootmem memmap metadata can be registered against the wrong section. The helper is also given HUGETLB_VMEMMAP_RESERVE_SIZE even though it expects a page count, not a size in bytes. In addition, the write-protect range is based on pages_per_huge_page(h), which does not cover the full HugeTLB vmemmap area and can leave part of the shared tail vmemmap mapping writable. Fix the section lookup to use folio_pfn(folio), use HUGETLB_VMEMMAP_RESERVE_PAGES when registering the reserved memmap pages, and use hugetlb_vmemmap_size(h) for the write-protect range. Fixes: 752fe17af693 ("mm/hugetlb: add pre-HVO framework") Signed-off-by: Muchun Song <songmuchun@bytedance.com> --- mm/hugetlb_vmemmap.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)