From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from out-177.mta0.migadu.com (out-177.mta0.migadu.com [91.218.175.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 5D6EA15539A for ; Mon, 2 Mar 2026 03:11:42 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=91.218.175.177 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772421104; cv=none; b=kslwsUPkOEKDz91RoebMY+b1Uj63I3GJg9NZDEZ7lAYoRSwZQhUubUO8lhziWnySTcOTH+jU89t0JCN/+6cf3sJkVTjCstSfp7YV0tmhQyjlL5EKFfI9Un5HYCMMd3WOMvY9NPEthW07rnxnGlKe0hD0+1al31rd/vLd8Z9uUck= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1772421104; c=relaxed/simple; bh=BVR85JZsBdA5YhaCWav14e0U4PdgOrVUGlkqBYLVCYA=; h=Content-Type:Mime-Version:Subject:From:In-Reply-To:Date:Cc: Message-Id:References:To; b=plEONShOS/hSPWplu2h2cL6CnR+fRdEtJ2gDfwzRTZqCJ4amyC6oMkOgaTx3Z6+wGjFTujFhg46KQo10d7NswqZbzu1U5vDXi4aGXR8fOLP3fsO27uziD2oP1fgEiLqr1a6yERzB878OyArlj14ur9ZkrgHlkUraRuqZRWjiTSs= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev; spf=pass smtp.mailfrom=linux.dev; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b=XWQnUevh; arc=none smtp.client-ip=91.218.175.177 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linux.dev Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linux.dev Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=linux.dev header.i=@linux.dev header.b="XWQnUevh" Content-Type: text/plain; charset=utf-8 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.dev; s=key1; t=1772421100; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=c80IjFmwrSTyfEdA2osb6JnCGS7RM2etVw9Vzge3vcA=; b=XWQnUevhvW3qqt0n4MlcEcWHSZ9PyYGSKnaoUT9LD7wZytjhOoL4nZQVilpTsPHWq03g7t cWdDmURaQq8W53Sfoqq1cwyqVh/BY7X9Q3O30L3PFDo0vomLWjqiuHGs12JSmtR86BFf6N 6SN+deifYZIQ7qmRKRLZh9ibPTEC1/Q= Precedence: bulk X-Mailing-List: linux-doc@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 (Mac OS X Mail 16.0 \(3864.400.21\)) Subject: Re: [PATCHv7 17/18] hugetlb: Update vmemmap_dedup.rst X-Report-Abuse: Please report any abuse attempt to abuse@migadu.com and include these headers. From: Muchun Song In-Reply-To: <20260227194302.274384-18-kas@kernel.org> Date: Mon, 2 Mar 2026 11:10:54 +0800 Cc: Andrew Morton , David Hildenbrand , Matthew Wilcox , Usama Arif , Frank van der Linden , Oscar Salvador , Mike Rapoport , Vlastimil Babka , Lorenzo Stoakes , Zi Yan , Baoquan He , Michal Hocko , Johannes Weiner , Jonathan Corbet , Huacai Chen , WANG Xuerui , Palmer Dabbelt , Paul Walmsley , Albert Ou , Alexandre Ghiti , kernel-team@meta.com, linux-mm@kvack.org, linux-kernel@vger.kernel.org, linux-doc@vger.kernel.org, loongarch@lists.linux.dev, linux-riscv@lists.infradead.org Content-Transfer-Encoding: quoted-printable Message-Id: References: <20260227194302.274384-1-kas@kernel.org> <20260227194302.274384-18-kas@kernel.org> To: "Kiryl Shutsemau (Meta)" X-Migadu-Flow: FLOW_OUT > On Feb 28, 2026, at 03:42, Kiryl Shutsemau (Meta) = wrote: >=20 > From: Kiryl Shutsemau >=20 > Update the documentation regarding vmemmap optimization for hugetlb to > reflect the changes in how the kernel maps the tail pages. >=20 > Fake heads no longer exist. Remove their description. >=20 > Signed-off-by: Kiryl Shutsemau > Reviewed-by: Muchun Song > Reviewed-by: David Hildenbrand (Arm) > --- > Documentation/mm/vmemmap_dedup.rst | 60 +++++++++++++----------------- > 1 file changed, 26 insertions(+), 34 deletions(-) >=20 > diff --git a/Documentation/mm/vmemmap_dedup.rst = b/Documentation/mm/vmemmap_dedup.rst > index 1863d88d2dcb..4aaef36d8971 100644 > --- a/Documentation/mm/vmemmap_dedup.rst > +++ b/Documentation/mm/vmemmap_dedup.rst > @@ -124,33 +124,35 @@ Here is how things look before optimization:: > | | > +-----------+ >=20 > -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. >=20 > Here is how things look after remapping:: >=20 > - 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 (new) > + +-----------+ ---virt_to_page---> +-----------+ mapping to = +----------------+ > + | | | 0 | -------------> | = 0 | > + | | +-----------+ = +----------------+ > + | | | 1 | ------=E2=94=90 > + | | +-----------+ | > + | | | 2 | ------=E2=94=BC = +----------------------------+ > + | | +-----------+ | | A = single, per-node page | You've changed it to per-node-per-zone. Need update. > + | | | 3 | ------=E2=94=BC------>= | frame shared among all | > + | | +-----------+ | | = hugepages of the same size | > + | | | 4 | ------=E2=94=BC = +----------------------------+ > + | | +-----------+ | > + | | | 5 | ------=E2=94=BC > + | PMD | +-----------+ | > + | level | | 6 | ------=E2=94=BC > + | mapping | +-----------+ | > + | | | 7 | ------=E2=94=98 > | | +-----------+ > | | > | | > @@ -172,16 +174,6 @@ The contiguous bit is used to increase the = mapping size at the pmd and pte > (last) level. So this type of HugeTLB page can be optimized only when = its > size of the ``struct page`` structs is greater than **1** page. >=20 > -Notice: The head vmemmap page is not freed to the buddy allocator and = all > -tail vmemmap pages are mapped to the head vmemmap page frame. So we = can see > -more than one ``struct page`` struct with ``PG_head`` (e.g. 8 per 2 = MB HugeTLB > -page) associated with each HugeTLB page. The ``compound_head()`` can = handle > -this correctly. There is only **one** head ``struct page``, the tail > -``struct page`` with ``PG_head`` are fake head ``struct page``. We = need an > -approach to distinguish between those two different types of ``struct = page`` so > -that ``compound_head()`` can return the real head ``struct page`` = when the > -parameter is the tail ``struct page`` but with ``PG_head``. > - > Device DAX > =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D >=20 > --=20 > 2.51.2 >=20