From: Kiryl Shutsemau <kas@kernel.org>
To: "David Hildenbrand (Arm)" <david@kernel.org>
Cc: Usama Arif <usama.arif@linux.dev>,
Andrew Morton <akpm@linux-foundation.org>,
chrisl@kernel.org, kasong@tencent.com, ljs@kernel.org,
ziy@nvidia.com, linux-mm@kvack.org,
ying.huang@linux.alibaba.com, Baoquan He <baoquan.he@linux.dev>,
willy@infradead.org, youngjun.park@lge.com, hannes@cmpxchg.org,
riel@surriel.com, shakeel.butt@linux.dev, alex@ghiti.fr,
baohua@kernel.org, dev.jain@arm.com,
baolin.wang@linux.alibaba.com, Nico Pache <nico.pache@linux.dev>,
"Liam R. Howlett" <liam@infradead.org>,
ryan.roberts@arm.com, Vlastimil Babka <vbabka@kernel.org>,
lance.yang@linux.dev, linux-kernel@vger.kernel.org,
nphamcs@gmail.com, shikemeng@huaweicloud.com, yosry@kernel.org,
kernel-team@meta.com
Subject: Re: [PATCH v6 03/12] mm: add PMD swap entry splitting support
Date: Wed, 19 Aug 2026 16:16:51 +0100 [thread overview]
Message-ID: <aoXIQWO6NEfEKipn@thinkstation> (raw)
In-Reply-To: <a5c3a93d-fcc5-4fc1-a764-726ca1d0185a@kernel.org>
On Tue, Aug 18, 2026 at 07:53:48PM +0200, David Hildenbrand (Arm) wrote:
> On 8/18/26 15:09, Usama Arif wrote:
> > Add a swap branch in __split_huge_pmd_locked() that splits a PMD swap
> > entry into 512 PTE swap entries. No folio reference is needed because
> > swap entries point to swap slots rather than pages. Each PTE inherits
> > the correct sub-slot offset and preserves soft_dirty, uffd_wp, and
> > exclusive flags.
> >
> > The folio_remove_rmap_pmd() gate at the end must inspect old_pmd
> > rather than *pmd: for a present THP split, *pmd has already been
> > cleared by pmdp_invalidate(), and that invalidated bit pattern can
> > decode as a plausible swap entry.
> >
> > This branch is reached from the explicit __split_huge_pmd() callers
> > that hit a non-present PMD: partial-range mprotect / munmap, the
> > wp_huge_pmd() PMD-COW fallback, and the swap-in / swapoff fallbacks
> > added in later patches when the cached folio is no longer PMD-sized.
> > page_vma_mapped_walk() does not iterate PMD swap entries, so
> > try_to_unmap_one() and try_to_migrate_one() do not reach this branch
> > and freeze=true cannot occur in this branch today. page and folio
> > are therefore left uninitialized in the swap branch; a
> > VM_WARN_ON_ONCE(freeze) catches any future caller that breaks this
> > invariant before the freeze path dereferences page_to_pfn(page + i)
> > or put_page(page).
> >
> > Signed-off-by: Usama Arif <usama.arif@linux.dev>
> > ---
> > mm/huge_memory.c | 29 ++++++++++++++++++++++++++++-
> > 1 file changed, 28 insertions(+), 1 deletion(-)
> >
> > diff --git a/mm/huge_memory.c b/mm/huge_memory.c
> > index 1b6b0aa2baa3b..a473e85d30f51 100644
> > --- a/mm/huge_memory.c
> > +++ b/mm/huge_memory.c
> > @@ -3252,6 +3252,14 @@ static void __split_huge_pmd_locked(struct vm_area_struct *vma, pmd_t *pmd,
> > folio_add_anon_rmap_ptes(folio, page, HPAGE_PMD_NR,
> > vma, haddr, rmap_flags);
> > }
> > + } else if (pmd_is_swap_entry(*pmd)) {
> > + VM_WARN_ON_ONCE(freeze);
> > + /* Swap entries have no page for the migration freeze path. */
> > + freeze = false;
>
> It's odd to VM_WARN_ON_ONCE() and then set freeze=false;
>
> I'd just add the comment above the VM_WARN_ON_ONCE() and drop the =false.
VM_WARN_ON_ONCE() is compiled out without DEBUG_VM. The freeze = false is
what actually keeps the swap entry out of
if (freeze || pmd_is_migration_entry(old_pmd)) {
...
make_writable_migration_entry(page_to_pfn(page + i));
and out of the put_page(page) below it, where page is uninitialized in the
swap branch. Dropping it leaves nothing on production builds.
If freeze = false goes, folio and page must be set to NULL there (or
something along the lines).
--
Kiryl Shutsemau / Kirill A. Shutemov
next prev parent reply other threads:[~2026-08-19 15:17 UTC|newest]
Thread overview: 38+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-08-18 13:09 [PATCH v6 00/12] mm: PMD-level swap entries for anonymous THPs Usama Arif
2026-08-18 13:09 ` [PATCH v6 01/12] mm: rename pmd_to_softleaf_folio() to pmd_softleaf_to_folio() Usama Arif
2026-08-18 14:24 ` David Hildenbrand (Arm)
2026-08-18 18:36 ` Lorenzo Stoakes (ARM)
2026-08-18 18:38 ` Zi Yan
2026-08-19 14:32 ` Kiryl Shutsemau
2026-08-18 13:09 ` [PATCH v6 02/12] mm: add PMD swap entry detection support Usama Arif
2026-08-18 14:40 ` David Hildenbrand (Arm)
2026-08-18 18:42 ` Lorenzo Stoakes (ARM)
2026-08-19 12:33 ` Usama Arif
2026-08-19 16:05 ` David Hildenbrand (Arm)
2026-08-19 12:31 ` Usama Arif
2026-08-19 14:42 ` Kiryl Shutsemau
2026-08-19 16:00 ` David Hildenbrand (Arm)
2026-08-18 13:09 ` [PATCH v6 03/12] mm: add PMD swap entry splitting support Usama Arif
2026-08-18 17:53 ` David Hildenbrand (Arm)
2026-08-19 12:39 ` Usama Arif
2026-08-19 16:05 ` David Hildenbrand (Arm)
2026-08-19 15:16 ` Kiryl Shutsemau [this message]
2026-08-19 16:04 ` David Hildenbrand (Arm)
2026-08-19 15:13 ` Kiryl Shutsemau
2026-08-18 13:09 ` [PATCH v6 04/12] mm: handle PMD swap entries in fork path Usama Arif
2026-08-19 15:46 ` Kiryl Shutsemau
2026-08-18 13:09 ` [PATCH v6 05/12] mm: zswap: add range lookup for large-folio swapin Usama Arif
2026-08-18 18:28 ` Yosry Ahmed
2026-08-19 12:50 ` Usama Arif
2026-08-18 13:09 ` [PATCH v6 06/12] mm: swap in PMD swap entries as whole THPs during swapoff Usama Arif
2026-08-19 5:38 ` Lance Yang
2026-08-19 12:52 ` Usama Arif
2026-08-18 13:09 ` [PATCH v6 07/12] mm: handle PMD swap entries in non-present PMD walkers Usama Arif
2026-08-18 13:09 ` [PATCH v6 08/12] mm: handle PMD swap entries in MADV_WILLNEED Usama Arif
2026-08-18 13:09 ` [PATCH v6 09/12] mm: handle PMD swap entries in UFFDIO_MOVE Usama Arif
2026-08-18 13:09 ` [PATCH v6 10/12] mm: handle PMD swap entry faults on swap-in Usama Arif
2026-08-18 13:09 ` [PATCH v6 11/12] mm: install PMD swap entries on swap-out Usama Arif
2026-08-18 13:09 ` [PATCH v6 12/12] selftests/mm: add PMD swap entry tests Usama Arif
2026-08-19 10:10 ` Lance Yang
2026-08-19 12:56 ` Usama Arif
2026-08-19 13:04 ` [PATCH v6 00/12] mm: PMD-level swap entries for anonymous THPs Usama Arif
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=aoXIQWO6NEfEKipn@thinkstation \
--to=kas@kernel.org \
--cc=akpm@linux-foundation.org \
--cc=alex@ghiti.fr \
--cc=baohua@kernel.org \
--cc=baolin.wang@linux.alibaba.com \
--cc=baoquan.he@linux.dev \
--cc=chrisl@kernel.org \
--cc=david@kernel.org \
--cc=dev.jain@arm.com \
--cc=hannes@cmpxchg.org \
--cc=kasong@tencent.com \
--cc=kernel-team@meta.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=nico.pache@linux.dev \
--cc=nphamcs@gmail.com \
--cc=riel@surriel.com \
--cc=ryan.roberts@arm.com \
--cc=shakeel.butt@linux.dev \
--cc=shikemeng@huaweicloud.com \
--cc=usama.arif@linux.dev \
--cc=vbabka@kernel.org \
--cc=willy@infradead.org \
--cc=ying.huang@linux.alibaba.com \
--cc=yosry@kernel.org \
--cc=youngjun.park@lge.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.