From: Muchun Song <muchun.song@linux.dev>
To: Zi Yan <ziy@nvidia.com>
Cc: "David Hildenbrand (Arm)" <david@kernel.org>,
"Matthew Wilcox (Oracle)" <willy@infradead.org>,
Andrew Morton <akpm@linux-foundation.org>,
Lorenzo Stoakes <ljs@kernel.org>,
"Liam R. Howlett" <liam@infradead.org>,
Vlastimil Babka <vbabka@kernel.org>,
Mike Rapoport <rppt@kernel.org>,
Suren Baghdasaryan <surenb@google.com>,
Michal Hocko <mhocko@suse.com>,
Baolin Wang <baolin.wang@linux.alibaba.com>,
Nico Pache <nico.pache@linux.dev>,
Ryan Roberts <ryan.roberts@arm.com>, Dev Jain <dev.jain@arm.com>,
Barry Song <baohua@kernel.org>, Lance Yang <lance.yang@linux.dev>,
Usama Arif <usama.arif@linux.dev>,
Gregory Price <gourry@gourry.net>,
Ying Huang <ying.huang@linux.alibaba.com>,
Alistair Popple <apopple@nvidia.com>,
Johannes Weiner <hannes@cmpxchg.org>,
Qi Zheng <qi.zheng@linux.dev>,
Shakeel Butt <shakeel.butt@linux.dev>,
Kairui Song <kasong@tencent.com>,
linux-mm@kvack.org, linux-kernel@vger.kernel.org,
Oscar Salvador <osalvador@suse.de>
Subject: Re: [PATCH v4 05/16] mm/hugetlb: use direct assignment instead of folio_change_private()
Date: Fri, 18 Sep 2026 11:13:05 +0800 [thread overview]
Message-ID: <A1A14368-7A43-40ED-B2AB-C2EC2C5FFB1D@linux.dev> (raw)
In-Reply-To: <DLI26G4YSWIO.E52DKMAH6ZSG@nvidia.com>
> On Sep 18, 2026, at 09:41, Zi Yan <ziy@nvidia.com> wrote:
>
> On Wed Sep 16, 2026 at 2:12 AM EDT, David Hildenbrand (Arm) wrote:
>> On 9/16/26 03:56, Zi Yan wrote:
>>> On 13 Sep 2026, at 22:24, Zi Yan wrote:
>>>
>>>> folio_change_private() should be used along with folio_attach_private() and
>>>> folio_detach_private(), where adding and remove ->private content requires
>>>> folio refcount change. add_hugetlb_folio() simply sets folio->private to
>>>> NULL without refcount manipulation. Change it to direct assignment to avoid
>>>> semantic confusion.
>>>>
>>>> It prepares for a future commit that remove PG_private.
>>>>
>>>> No functional change intended.
>>>>
>>>> Assisted-by: LLM
>>>> To: Muchun Song <muchun.song@linux.dev>
>>>> To: Oscar Salvador <osalvador@suse.de>
>>>> To: Andrew Morton <akpm@linux-foundation.org>
>>>> Cc: David Hildenbrand <david@kernel.org>
>>>> Cc: linux-mm@kvack.org
>>>> Cc: linux-kernel@vger.kernel.org
>>>> Acked-by: Usama Arif <usama.arif@linux.dev>
>>>> Reviewed-by: Gregory Price (Meta) <gourry@gourry.net>
>>>> Signed-off-by: Zi Yan <ziy@nvidia.com>
>>>> ---
>>>> mm/hugetlb.c | 7 ++-----
>>>> 1 file changed, 2 insertions(+), 5 deletions(-)
>>>>
>>>> diff --git a/mm/hugetlb.c b/mm/hugetlb.c
>>>> index d3a0650ff6905..8d551cdaef9db 100644
>>>> --- a/mm/hugetlb.c
>>>> +++ b/mm/hugetlb.c
>>>> @@ -1446,11 +1446,8 @@ void add_hugetlb_folio(struct hstate *h, struct folio *folio,
>>>> }
>>>>
>>>> __folio_set_hugetlb(folio);
>>>> - folio_change_private(folio, NULL);
>>>> - /*
>>>> - * We have to set hugetlb_vmemmap_optimized again as above
>>>> - * folio_change_private(folio, NULL) cleared it.
>>>> - */
>>>> + /* Clear all folio->private flags except hugetlb_vmemmap_optimized. */
>>>> + folio->private = NULL;
>>>> folio_set_hugetlb_vmemmap_optimized(folio);
>>>>
>>>
>>> Sashiko[1] said when a CMA hugetlb folio is freed but fails vmemmap restore,
>>> add_hugetlb_folio() clears HPG_cma. It either bypasses
>>> hugetlb_cma_free_frozen_folio() due to the missing HPG_cma flag, or
>>> skips cma_release() and causes a CMA memory leak if it is free directly
>>> to buddy allocator. Sashiko also asked if HPG_temporary should be preserved
>>> as well HPG_cma.
>>>
>>> Answer:
>>>
>>> Missing HPG_cma is a real issue. It can be fixed by checking
>>> folio_test_hugetlb_cma(folio) at the beginning of add_hugetlb_folio() and
>>> setting HPG_cma after folio->private is assigned to NULL.
>>
>>
>> Maybe we should just simply only clear flags we actually want to clear ...
>
> And it turns out to be a clean result (see below). add_hugetlb_folio()
> adds a hugetlb folio back to freelist, so prior operations like
> remove_hugetlb_folio() should clear hugetlb flags, like HPG_freed,
> HPG_restore_reserve, HPG_migratible. HPG_temporary is only set in
> one callsite in free_huge_folio() and is cleared before the folio is
> passed to add_hugetlb_folio() via update_and_free_hugetlb_folio().
> HPG_raw_hwp_unreliable probably can stay, since it preserves poison
> information. The remaining HPG_cma and HPG_vmemmap_optimized are the two
> we want to preserve.
>
> Muchun, maybe you can chime in about the patch below. It can be a
> follow-up patch after this series.
>
> Thanks.
>
>
> diff --git a/mm/hugetlb.c b/mm/hugetlb.c
> index 8d551cdaef9db..bc772954e5685 100644
> --- a/mm/hugetlb.c
> +++ b/mm/hugetlb.c
> @@ -1446,9 +1446,6 @@ void add_hugetlb_folio(struct hstate *h, struct folio *folio,
> }
>
> __folio_set_hugetlb(folio);
> - /* Clear all folio->private flags except hugetlb_vmemmap_optimized. */
> - folio->private = NULL;
> - folio_set_hugetlb_vmemmap_optimized(folio);
This looks good to me. Since add_hugetlb_folio() will no longer clear
folio->private, would it be worth adding a whitelist-based
VM_WARN_ON_ONCE_FOLIO() here to catch unexpected flags? This would document
which flags may survive the transition and help detect future callers that
fail to clear transient state before returning a folio to the pool.
Thanks.
>
> arch_clear_hugetlb_flags(folio);
> enqueue_hugetlb_folio(h, folio);
> @@ -1736,6 +1733,7 @@ void free_huge_folio(struct folio *folio)
> h->resv_huge_pages++;
>
> if (folio_test_hugetlb_temporary(folio)) {
> + folio_clear_hugetlb_temporary(folio);
> remove_hugetlb_folio(h, folio, false);
> spin_unlock_irqrestore(&hugetlb_lock, flags);
> update_and_free_hugetlb_folio(h, folio, true);
>
>
> --
> Best Regards,
> Yan, Zi
next prev parent reply other threads:[~2026-09-18 3:13 UTC|newest]
Thread overview: 77+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-14 2:23 [PATCH v4 00/16] Remove PG_private by using page/folio->private checks instead Zi Yan
2026-09-14 2:23 ` Zi Yan
2026-09-14 2:23 ` [f2fs-dev] " Zi Yan via Linux-f2fs-devel
2026-09-14 2:23 ` [PATCH v4 01/16] mm/zsmalloc: replace PG_private with pointer comparison Zi Yan
2026-09-14 2:24 ` [PATCH v4 02/16] perf/ring_buffer: stop using PG_private as AUX page high-order marker Zi Yan
2026-09-14 2:36 ` sashiko-bot
2026-09-14 2:24 ` [PATCH v4 03/16] xen/grant-table: stop setting PG_private on pages for grant mapping Zi Yan
2026-09-14 13:15 ` David Hildenbrand (Arm)
2026-09-14 2:24 ` [PATCH v4 04/16] fscrypt: stop setting PG_private on bounce page Zi Yan
2026-09-14 2:24 ` [PATCH v4 05/16] mm/hugetlb: use direct assignment instead of folio_change_private() Zi Yan
2026-09-14 2:58 ` Muchun Song
2026-09-14 13:16 ` David Hildenbrand (Arm)
2026-09-16 1:56 ` Zi Yan
2026-09-16 6:12 ` David Hildenbrand (Arm)
2026-09-18 1:41 ` Zi Yan
2026-09-18 3:13 ` Muchun Song [this message]
2026-09-14 2:24 ` [f2fs-dev] [PATCH v4 06/16] f2fs: stop using PG_private Zi Yan via Linux-f2fs-devel
2026-09-14 2:24 ` Zi Yan
2026-09-14 13:17 ` [f2fs-dev] " David Hildenbrand (Arm) via Linux-f2fs-devel
2026-09-14 13:17 ` David Hildenbrand (Arm)
2026-09-14 2:24 ` [f2fs-dev] [PATCH v4 07/16] f2fs: convert the ->private flag helpers to folio-only Zi Yan via Linux-f2fs-devel
2026-09-14 2:24 ` Zi Yan
2026-09-16 2:20 ` [f2fs-dev] " Zi Yan via Linux-f2fs-devel
2026-09-16 2:20 ` Zi Yan
2026-09-14 2:24 ` [PATCH v4 08/16] erofs: mm/pagemap: add readahead_folio_last() to avoid folio->private Zi Yan
2026-09-14 2:24 ` [PATCH v4 09/16] erofs: use folio_attach/detach_private() instead of direct assignment Zi Yan
2026-09-14 13:18 ` David Hildenbrand (Arm)
2026-09-14 2:24 ` [PATCH v4 10/16] mm/page-flags: check page/folio->private instead of PG_private Zi Yan
2026-09-14 13:26 ` David Hildenbrand (Arm)
2026-09-14 14:44 ` Zi Yan
2026-09-14 15:11 ` David Hildenbrand (Arm)
2026-09-14 15:21 ` Zi Yan
2026-09-14 2:24 ` [PATCH v4 11/16] treewide: remove folio_set/clear_private() usage Zi Yan
2026-09-14 2:24 ` [PATCH v4 12/16] ceph: replace PagePrivate() with page_private() Zi Yan
2026-09-14 13:26 ` David Hildenbrand (Arm)
2026-09-14 2:24 ` [PATCH v4 13/16] md/md-bitmap: " Zi Yan
2026-09-14 2:24 ` [PATCH v4 14/16] buffer: replace page_buffer() with page_private() and delete it Zi Yan
2026-09-14 2:24 ` [PATCH v4 15/16] treewide: remove PagePrivate() and PG_private from comments and docs Zi Yan
2026-09-14 2:24 ` Zi Yan
2026-09-14 13:36 ` David Hildenbrand (Arm)
2026-09-14 13:36 ` David Hildenbrand (Arm)
2026-09-14 2:24 ` [PATCH v4 16/16] mm/page-flags: remove PG_private Zi Yan
2026-09-14 2:47 ` sashiko-bot
2026-09-14 13:37 ` David Hildenbrand (Arm)
2026-09-14 13:38 ` David Hildenbrand (Arm)
2026-09-14 3:39 ` [PATCH v4 00/16] Remove PG_private by using page/folio->private checks instead Andrew Morton
2026-09-14 3:39 ` Andrew Morton
2026-09-14 3:39 ` [f2fs-dev] " Andrew Morton
2026-09-15 17:16 ` Zi Yan
2026-09-15 17:16 ` Zi Yan
2026-09-15 17:16 ` [f2fs-dev] " Zi Yan via Linux-f2fs-devel
2026-09-15 18:18 ` Zi Yan via Linux-f2fs-devel
2026-09-14 4:18 ` [PATCH 1/3] md: Use folio_alloc_buffers() Matthew Wilcox (Oracle)
2026-09-14 4:27 ` sashiko-bot
2026-09-14 13:12 ` David Hildenbrand (Arm)
2026-09-14 13:17 ` Matthew Wilcox
2026-09-14 13:20 ` David Hildenbrand (Arm)
2026-09-14 14:36 ` Zi Yan
2026-09-14 4:18 ` [PATCH 2/3] md: Use folio APIs in free_page() Matthew Wilcox (Oracle)
2026-09-14 4:31 ` sashiko-bot
2026-09-14 16:21 ` Matthew Wilcox
2026-09-14 16:25 ` Zi Yan
2026-09-14 13:13 ` David Hildenbrand (Arm)
2026-09-14 4:18 ` [PATCH 3/3] md: Remove the last use of page_buffers() Matthew Wilcox (Oracle)
2026-09-14 4:29 ` sashiko-bot
2026-09-14 13:14 ` David Hildenbrand (Arm)
2026-09-14 4:21 ` [PATCH v4 00/16] Remove PG_private by using page/folio->private checks instead Matthew Wilcox
2026-09-14 4:21 ` Matthew Wilcox
2026-09-14 4:21 ` [f2fs-dev] " Matthew Wilcox
2026-09-14 13:10 ` David Hildenbrand (Arm)
2026-09-14 13:10 ` David Hildenbrand (Arm)
2026-09-14 13:10 ` [f2fs-dev] " David Hildenbrand (Arm) via Linux-f2fs-devel
2026-09-14 15:30 ` patchwork-bot+f2fs
2026-09-14 15:30 ` patchwork-bot+f2fs
2026-09-14 15:30 ` patchwork-bot+f2fs--- via Linux-f2fs-devel
2026-09-15 21:49 ` Andrew Morton
2026-09-15 23:14 ` Roman Gushchin
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=A1A14368-7A43-40ED-B2AB-C2EC2C5FFB1D@linux.dev \
--to=muchun.song@linux.dev \
--cc=akpm@linux-foundation.org \
--cc=apopple@nvidia.com \
--cc=baohua@kernel.org \
--cc=baolin.wang@linux.alibaba.com \
--cc=david@kernel.org \
--cc=dev.jain@arm.com \
--cc=gourry@gourry.net \
--cc=hannes@cmpxchg.org \
--cc=kasong@tencent.com \
--cc=lance.yang@linux.dev \
--cc=liam@infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=ljs@kernel.org \
--cc=mhocko@suse.com \
--cc=nico.pache@linux.dev \
--cc=osalvador@suse.de \
--cc=qi.zheng@linux.dev \
--cc=rppt@kernel.org \
--cc=ryan.roberts@arm.com \
--cc=shakeel.butt@linux.dev \
--cc=surenb@google.com \
--cc=usama.arif@linux.dev \
--cc=vbabka@kernel.org \
--cc=willy@infradead.org \
--cc=ying.huang@linux.alibaba.com \
--cc=ziy@nvidia.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.