[PATCHv6 16/17] hugetlb: Update vmemmap_dedup.rst
David Hildenbrand (Arm)
david at kernel.org
Fri Feb 6 02:35:30 PST 2026
On 2/2/26 16:56, Kiryl Shutsemau wrote:
> Update the documentation regarding vmemmap optimization for hugetlb to
> reflect the changes in how the kernel maps the tail pages.
>
> Fake heads no longer exist. Remove their description.
>
> Signed-off-by: Kiryl Shutsemau <kas at kernel.org>
> Reviewed-by: Muchun Song <muchun.song at linux.dev>
> ---
> Documentation/mm/vmemmap_dedup.rst | 60 +++++++++++++-----------------
> 1 file changed, 26 insertions(+), 34 deletions(-)
>
> diff --git a/Documentation/mm/vmemmap_dedup.rst b/Documentation/mm/vmemmap_dedup.rst
> index 1863d88d2dcb..fca9d0ce282a 100644
> --- a/Documentation/mm/vmemmap_dedup.rst
> +++ b/Documentation/mm/vmemmap_dedup.rst
> @@ -124,33 +124,35 @@ Here is how things look before optimization::
> | |
> +-----------+
>
> -The value of page->compound_info is the same for all tail pages. The first
> -page of ``struct page`` (page 0) associated with the HugeTLB page contains the 4
> -``struct page`` necessary to describe the HugeTLB. The only use of the remaining
> -pages of ``struct page`` (page 1 to page 7) is to point to page->compound_info.
> -Therefore, we can remap pages 1 to 7 to page 0. Only 1 page of ``struct page``
> -will be used for each HugeTLB page. This will allow us to free the remaining
> -7 pages to the buddy allocator.
> +The first page of ``struct page`` (page 0) associated with the HugeTLB page
> +contains the 4 ``struct page`` necessary to describe the HugeTLB. The remaining
> +pages of ``struct page`` (page 1 to page 7) are tail pages.
> +
> +The optimization is only applied when the size of the struct page is a power-of-2
> +In this case, all tail pages of the same order are identical. See
> +compound_head(). This allows us to remap the tail pages of the vmemmap to a
> +shared, read-only page. The head page is also remapped to a new page. This
> +allows the original vmemmap pages to be freed.
>
> Here is how things look after remapping::
>
> - HugeTLB struct pages(8 pages) page frame(8 pages)
> - +-----------+ ---virt_to_page---> +-----------+ mapping to +-----------+
> - | | | 0 | -------------> | 0 |
> - | | +-----------+ +-----------+
> - | | | 1 | ---------------^ ^ ^ ^ ^ ^ ^
> - | | +-----------+ | | | | | |
> - | | | 2 | -----------------+ | | | | |
> - | | +-----------+ | | | | |
> - | | | 3 | -------------------+ | | | |
> - | | +-----------+ | | | |
> - | | | 4 | ---------------------+ | | |
> - | PMD | +-----------+ | | |
> - | level | | 5 | -----------------------+ | |
> - | mapping | +-----------+ | |
> - | | | 6 | -------------------------+ |
> - | | +-----------+ |
> - | | | 7 | ---------------------------+
> + HugeTLB struct pages(8 pages) page frame
You could highlight that we allocate a new head page like "page frame
(new)".
Wasn't aware of that detail before reading your change above.
Reviewed-by: David Hildenbrand (Arm) <david at kernel.org>
--
Cheers,
David
More information about the linux-riscv
mailing list