Linux-mm Archive on lore.kernel.org
 help / color / mirror / Atom feed
From: "David Hildenbrand (Arm)" <david@kernel.org>
To: Kiryl Shutsemau <kas@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 18:04:15 +0200	[thread overview]
Message-ID: <ff19ed22-72b5-4c6e-9fe1-de780c9c6bf9@kernel.org> (raw)
In-Reply-To: <aoXIQWO6NEfEKipn@thinkstation>

On 8/19/26 17:16, Kiryl Shutsemau wrote:
> 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.

Right, because it's a condition you shouldn't hit on production builds.

And I raised how we can restructure the code to make it clear that we are being
overly cautions here.

Let's not add unnecessary code just because the existing code is hard to follow.

-- 
Cheers,

David


  reply	other threads:[~2026-08-19 16:04 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
2026-08-19 16:04       ` David Hildenbrand (Arm) [this message]
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=ff19ed22-72b5-4c6e-9fe1-de780c9c6bf9@kernel.org \
    --to=david@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=dev.jain@arm.com \
    --cc=hannes@cmpxchg.org \
    --cc=kas@kernel.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox