Re: [PATCHv6 11/17] mm/hugetlb: Remove fake head pages

Usama Arif
2026-02-07T20:16:28Z

> +
> int __meminit vmemmap_populate_hvo(unsigned long addr, unsigned long end,
> int node, unsigned long headsize)
> {
> + unsigned long maddr, len, tail_pfn;
> + unsigned int order;
> pte_t *pte;
> - unsigned long maddr;
> +
> + len = end - addr;
> + order = ilog2(len * sizeof(struct page) / PAGE_SIZE);

This doesnt work for ARM. For len = 32 (2MB contiguous-PTE hugetlb on arm64):
ilog2(32 * 64 / 65536) = ilog2(2048 / 65536) = ilog2(0) which is undefined.

Is order = ilog2(len / sizeof(struct page)) better?

> + tail_pfn = vmemmap_get_tail(order, node);
> + if (!tail_pfn)
> + return -ENOMEM;
>
> for (maddr = addr; maddr < addr + headsize; maddr += PAGE_SIZE) {
> pte = vmemmap_populate_address(maddr, node, NULL, -1, 0);
> @@ -398,8 +426,7 @@ int __meminit vmemmap_populate_hvo(unsigned long addr, unsigned long end,
> /*
> * Reuse the last page struct page mapped above for the rest.
> */
> - return vmemmap_populate_range(maddr, end, node, NULL,
> - pte_pfn(ptep_get(pte)), 0);
> + return vmemmap_populate_range(maddr, end, node, NULL, tail_pfn, 0);
> }
>
> void __weak __meminit vmemmap_set_pmd(pmd_t *pmd, void *p, int node,