Re: [PATCH 03/12] mm: hugetlb_vmemmap: simplify vmemmap head page handling
From: Muchun Song
Date: Thu Oct 22 2026 - 02:28:30 EST
> On Oct 22, 2026, at 14:24, Lance Yang <lance.yang@xxxxxxxxx> wrote:
>
>
> On Tue, Oct 20, 2026 at 07:58:15PM +0800, Muchun Song wrote:
>> The new head page is already tracked on the vmemmap page list before
>> remapping starts. Passing it separately gives the remap walker two
>> ways to refer to the same page and unnecessarily complicates its
>> interface.
>>
>> Use the page list as the single handoff mechanism for the head page,
>> removing the redundant state from the walker.
>>
>> No functional change intended.
>>
>> Signed-off-by: Muchun Song <songmuchun@xxxxxxxxxxxxx>
>> ---
>> mm/hugetlb_vmemmap.c | 17 +++++++----------
>> 1 file changed, 7 insertions(+), 10 deletions(-)
>>
>> diff --git a/mm/hugetlb_vmemmap.c b/mm/hugetlb_vmemmap.c
>> index 8b3abb562599..164e93e980bf 100644
>> --- a/mm/hugetlb_vmemmap.c
>> +++ b/mm/hugetlb_vmemmap.c
>> @@ -25,7 +25,6 @@
>> *
>> * @remap_pte: called for each lowest-level entry (PTE).
>> * @nr_walked: the number of walked pte.
>> - * @vmemmap_head: the page to be installed as first in the vmemmap range
>> * @vmemmap_tail: the page to be installed as non-first in the vmemmap range
>> * @vmemmap_pages: the list head of the vmemmap pages that can be freed
>> * or is mapped from.
>> @@ -37,7 +36,6 @@ struct vmemmap_remap_walk {
>> struct vmemmap_remap_walk *walk);
>>
>> unsigned long nr_walked;
>> - struct page *vmemmap_head;
>> struct page *vmemmap_tail;
>> struct list_head *vmemmap_pages;
>>
>> @@ -208,10 +206,13 @@ static void vmemmap_remap_pte(pte_t *pte, unsigned long addr,
>> pte_t entry;
>>
>> /* Remapping the head page requires r/w */
>> - if (unlikely(walk->nr_walked == 0 && walk->vmemmap_head)) {
>> + if (unlikely(walk->nr_walked == 0)) {
>> + struct page *head;
>> +
>> VM_WARN_ON_ONCE(!PageHead((const struct page *)addr));
>>
>> - list_del(&walk->vmemmap_head->lru);
>> + head = list_first_entry(walk->vmemmap_pages, struct page, lru);
>> + list_del(&head->lru);
>>
>> /*
>> * Makes sure that preceding stores to the page contents from
>> @@ -220,7 +221,7 @@ static void vmemmap_remap_pte(pte_t *pte, unsigned long addr,
>> */
>> smp_wmb();
>>
>> - entry = mk_pte(walk->vmemmap_head, PAGE_KERNEL);
>> + entry = mk_pte(head, PAGE_KERNEL);
>> } else {
>> VM_WARN_ON_ONCE(!PageTail((const struct page *)addr));
>>
>> @@ -289,7 +290,6 @@ static int vmemmap_remap_split(unsigned long start, unsigned long end)
>> * to remap.
>> * @end: end address of the vmemmap virtual address range that we want to
>> * remap.
>> - * @vmemmap_head: the page to be installed as first in the vmemmap range
>> * @vmemmap_tail: the page to be installed as non-first in the vmemmap range
>> * @vmemmap_pages: list to deposit vmemmap pages to be freed. It is callers
>> * responsibility to free pages.
>> @@ -298,7 +298,6 @@ static int vmemmap_remap_split(unsigned long start, unsigned long end)
>> * Return: %0 on success, negative error code otherwise.
>> */
>
>
> /**
> * vmemmap_remap_free - remap the vmemmap virtual address range [@start, @end)
> * to use @vmemmap_head/tail, then free vmemmap which
> * the range are mapped to.
>
> Nit: could you update the @vmemmap_head/tail comment too, now that the
> head argument is gone?
Good catch! It should be fixed in the next version.
>
> Nothing jumped out at me, so
>
> Reviewed-by: Lance Yang <lance.yang@xxxxxxxxx>
Thank you, Lance.
Muchun