All of lore.kernel.org
 help / color / mirror / Atom feed
From: Kiryl Shutsemau <kirill@shutemov.name>
To: Jann Horn <jannh@google.com>
Cc: akpm@linux-foundation.org, david@kernel.org, ljs@kernel.org,
	 nico.pache@linux.dev, baolin.wang@linux.alibaba.com,
	baohua@kernel.org,  dev.jain@arm.com, hughd@google.com,
	lance.yang@linux.dev, liam@infradead.org,  mhocko@suse.com,
	rppt@kernel.org, ryan.roberts@arm.com, shuah@kernel.org,
	 surenb@google.com, usama.arif@linux.dev, vbabka@kernel.org,
	ziy@nvidia.com,  usama.anjum@arm.com, agordeev@linux.ibm.com,
	linux-mm@kvack.org,  linux-kselftest@vger.kernel.org,
	linux-kernel@vger.kernel.org, willy@infradead.org,
	 pfalcato@suse.de, rostedt@goodmis.org, mhiramat@kernel.org,
	 linux-trace-kernel@vger.kernel.org, bpf@vger.kernel.org
Subject: Re: [RFC PATCH 19/57] mm/collapse: install a PMD leaf as the terminal layer
Date: Wed, 26 Aug 2026 19:36:54 +0100	[thread overview]
Message-ID: <ao8okZ-A7cnvoju6@thinkstation> (raw)
In-Reply-To: <CAG48ez1fiCzTMATN07HHfzvUGFuZ5gELNpZXdXx=ySa7nihxmA@mail.gmail.com>

On Tue, Aug 25, 2026 at 06:52:17PM +0200, Jann Horn wrote:
> On Mon, Aug 17, 2026 at 12:46 AM Kiryl Shutsemau <kirill@shutemov.name> wrote:
> > Fill in the PMD install.  Under the pmd lock, with the pte ptl nested
> > inside it: verify, detach the table with pmdp_collapse_flush(), deposit a
> > fresh one and map the leaf.
> >
> > That is one atomic section, so no pmd_none() window ever exists: faults
> 
> What do you mean by "atomic" and "no pmd_none() window ever exists"?
> Is that supposed to be with respect to a subset of readers?
> 
> While the PMD table spinlock is held, you clear the PMD entry
> (pmdp_collapse_flush) and set it to a new value
> (map_anon_folio_pmd_nopf). But codepaths that walk page tables don't
> take that spinlock unless they already know they're in a THP case.
> 
> zap_pmd_range() does not lock the PMD table before checking
> pmd_none(), and if that is true, it skips over the PMD. I think this
> means that THP collapse can race with MADV_DONTNEED or zap_vma_range()
> such that the zap wrongly has no effect?

Yes, the race with MADV_DONTNEED you point out is real. Thanks for
flagging this.

The idea I want to explore is installing a pmd_mkinvalid() entry rather
than none in pmdp_collapse_flush(), so walkers have to serialize on the
pmd lock.

But it was a long day, I am not sure if the idea is sane.

> > stay held down at pte level by the migration entries throughout.  It is
> 
> But you don't have a migration entry at the PMD level, right?

Right.

They are all at pte level, in the table being detached. What
keeps a fault out during the install is the pmd lock: pmd_install() takes
it before it can put a table back.

I will fix wording once the pmd_none() question above is settled.

> > what lets PMD collapse run under mmap_read like everything else here.
> >
> > Two things force that nesting, which is the one the tree already uses to
> 
> I'm lost, what is "the tree"?

Upstream.

try_collapse_pte_mapped_thp() and retract_page_tables() nest the pte ptl
inside the pmd lock the same way.

I will update wording here.

> >  - rmap walks on the sources are unreachable, their refcounts frozen and
> >    their folio locks held from freeze to putback;
> 
> To be clear, we can concurrently rmap-walk into the PMD, right?
> Because we might be looking at a different folio which was created in
> the parent process or something like that? And so a
> page_vma_mapped_walk() without PVMW_SYNC might look at stale PTEs?
> (Which may or may not be fine, but would not be what this commit
> message claims.)

Again, wording should be better here.

A walk can reach the range, but it cannot act on a source: that takes the
folio lock, which the round holds from freeze to putback.

> > +       /* The deposit balanced the detached table, so the count is already right */
> > +       if (old_table)
> > +               pte_free_defer(mm, old_table);
> 
> What does old_table contain at this point - migration entries?

Yes.  I will clear it under the ptl before it goes.

Not for the pattern you name, though: a pte_offset_map_rw_nolock() caller
owes a pmd_same() recheck and page_vma_mapped_walk() does it.

The exposure is the plain pte_offset_map() callers -- pagewalk.c,
memory-failure.c, swap_state.c and a dozen more -- none of which
rechecks the pmd.

-- 
  Kiryl Shutsemau / Kirill A. Shutemov


  reply	other threads:[~2026-08-26 18:37 UTC|newest]

Thread overview: 119+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-08-16 22:45 [RFC PATCH 00/57] mm/collapse: rebuild collapse on migration primitives Kiryl Shutsemau
2026-08-16 22:45 ` [RFC PATCH 01/57] mm: add pte_folio() Kiryl Shutsemau
2026-08-18 16:38   ` Rik van Riel
2026-08-18 18:13     ` David Hildenbrand (Arm)
2026-08-18 20:04       ` Rik van Riel
2026-08-19  7:57         ` David Hildenbrand (Arm)
2026-08-18 17:09   ` David Hildenbrand (Arm)
2026-08-18 18:30     ` Lorenzo Stoakes (ARM)
2026-08-20 10:52     ` Kiryl Shutsemau
2026-08-16 22:45 ` [RFC PATCH 02/57] mm: add pte_none_or_zero() Kiryl Shutsemau
2026-08-17 17:57   ` David Hildenbrand (Arm)
2026-08-20 11:03     ` Kiryl Shutsemau
2026-08-16 22:45 ` [RFC PATCH 03/57] mm/collapse: add collapse.h for the shared collapse state Kiryl Shutsemau
2026-08-18 10:50   ` Lorenzo Stoakes (ARM)
2026-08-20 11:06     ` Kiryl Shutsemau
2026-08-19 14:19   ` David Hildenbrand (Arm)
2026-08-20 11:11     ` Kiryl Shutsemau
2026-08-24 11:47       ` David Hildenbrand (Arm)
2026-08-24 12:10         ` Kiryl Shutsemau
2026-08-24 12:28           ` David Hildenbrand (Arm)
2026-08-24 12:36             ` Kiryl Shutsemau
2026-08-24 14:09               ` Lorenzo Stoakes (ARM)
2026-08-24 15:18                 ` Kiryl Shutsemau
2026-08-24 15:23                   ` Lorenzo Stoakes (ARM)
2026-08-24 15:51                   ` Lorenzo Stoakes (ARM)
2026-08-16 22:45 ` [RFC PATCH 04/57] mm/collapse: rename mthp_present_ptes to eligible_ptes Kiryl Shutsemau
2026-08-16 22:45 ` [RFC PATCH 05/57] mm/collapse: state what a collapse may do in the policy Kiryl Shutsemau
2026-08-16 22:45 ` [RFC PATCH 06/57] mm/collapse: move the smallest collapse order to collapse.h Kiryl Shutsemau
2026-08-16 22:45 ` [RFC PATCH 07/57] mm/collapse: sketch the new anonymous collapse engine Kiryl Shutsemau
2026-08-16 22:45 ` [RFC PATCH 08/57] mm/collapse: scan a table for what a collapse could use Kiryl Shutsemau
2026-08-24  8:39   ` Lance Yang
2026-08-24  9:36     ` Kiryl Shutsemau
2026-08-16 22:45 ` [RFC PATCH 09/57] mm/collapse: collect candidate windows into a round Kiryl Shutsemau
2026-08-16 22:45 ` [RFC PATCH 10/57] mm/collapse: run a round and feed the outcomes back Kiryl Shutsemau
2026-08-16 22:45 ` [RFC PATCH 11/57] mm/collapse: sketch the passes of a round Kiryl Shutsemau
2026-08-16 22:45 ` [RFC PATCH 12/57] mm/collapse: allocate a destination per candidate Kiryl Shutsemau
2026-08-24 11:20   ` Lance Yang
2026-08-24 12:37     ` Kiryl Shutsemau
2026-08-16 22:45 ` [RFC PATCH 13/57] mm/collapse: revalidate a round against the VMA Kiryl Shutsemau
2026-08-16 22:45 ` [RFC PATCH 14/57] mm/collapse: fault the sources in before the freeze Kiryl Shutsemau
2026-08-16 22:45 ` [RFC PATCH 15/57] mm/collapse: check what a candidate would freeze Kiryl Shutsemau
2026-08-16 22:45 ` [RFC PATCH 16/57] mm/collapse: freeze the sources behind migration entries Kiryl Shutsemau
2026-08-24 13:12   ` Lance Yang
2026-08-24 14:13     ` Kiryl Shutsemau
2026-08-24 15:49       ` Johannes Weiner
2026-08-24 16:13         ` Usama Arif
2026-08-25  2:44           ` Lance Yang
2026-08-16 22:45 ` [RFC PATCH 17/57] mm/collapse: copy the sources into the destinations Kiryl Shutsemau
2026-08-16 22:45 ` [RFC PATCH 18/57] mm/collapse: install the destinations at PTE level Kiryl Shutsemau
2026-08-25  6:48   ` Lance Yang
2026-08-26 16:57     ` Kiryl Shutsemau
2026-08-16 22:45 ` [RFC PATCH 19/57] mm/collapse: install a PMD leaf as the terminal layer Kiryl Shutsemau
2026-08-25 12:23   ` Lance Yang
2026-08-26 17:54     ` Kiryl Shutsemau
2026-08-25 16:52   ` Jann Horn
2026-08-26 18:36     ` Kiryl Shutsemau [this message]
2026-08-16 22:45 ` [RFC PATCH 20/57] mm/collapse: put the sources back Kiryl Shutsemau
2026-08-16 22:45 ` [RFC PATCH 21/57] mm/collapse: settle whatever the round reached Kiryl Shutsemau
2026-08-16 22:45 ` [RFC PATCH 22/57] mm/collapse: walk a table with a selection cursor Kiryl Shutsemau
2026-08-16 22:45 ` [RFC PATCH 23/57] mm/collapse: give a refused region a second chance Kiryl Shutsemau
2026-08-16 22:45 ` [RFC PATCH 24/57] mm/collapse: report each candidate's outcome to tracing Kiryl Shutsemau
2026-08-16 22:45 ` [RFC PATCH 25/57] mm/collapse: collapse anonymous memory with the new engine Kiryl Shutsemau
2026-08-16 22:45 ` [RFC PATCH 26/57] mm/collapse: give collapse_single_pmd() the range to work on Kiryl Shutsemau
2026-08-16 22:45 ` [RFC PATCH 27/57] mm/collapse: scan the windows a VMA can hold Kiryl Shutsemau
2026-08-16 22:45 ` [RFC PATCH 28/57] mm/collapse: remove the mechanism the engine replaces Kiryl Shutsemau
2026-08-16 22:45 ` [RFC PATCH 29/57] mm/collapse: move what a collapse is judged on into collapse.c Kiryl Shutsemau
2026-08-16 22:45 ` [RFC PATCH 30/57] mm/collapse: name the max_ptes ceiling after collapse Kiryl Shutsemau
2026-08-16 22:45 ` [RFC PATCH 31/57] mm/khugepaged: count collapses where khugepaged makes them Kiryl Shutsemau
2026-08-16 22:45 ` [RFC PATCH 32/57] mm/collapse: move the file collapse into collapse.c Kiryl Shutsemau
2026-08-16 22:45 ` [RFC PATCH 33/57] mm/collapse: split collapse into a scan and a run Kiryl Shutsemau
2026-08-16 22:45 ` [RFC PATCH 34/57] mm/collapse: implement MADV_COLLAPSE in madvise.c Kiryl Shutsemau
2026-08-16 22:45 ` [RFC PATCH 35/57] mm/madvise: drop MADV_COLLAPSE's redundant mm reference Kiryl Shutsemau
2026-08-16 22:45 ` [RFC PATCH 36/57] mm/collapse: report what the scan found Kiryl Shutsemau
2026-08-16 22:45 ` [RFC PATCH 37/57] mm/collapse: report what the fault-in pass paid Kiryl Shutsemau
2026-08-16 22:45 ` [RFC PATCH 38/57] mm/collapse: report the round, and what it made faulters wait Kiryl Shutsemau
2026-08-16 22:45 ` [RFC PATCH 39/57] mm/collapse: name the file collapse's tracepoints after collapse Kiryl Shutsemau
2026-08-16 22:45 ` [RFC PATCH 40/57] mm/collapse: remove the tracepoints of the mechanism that is gone Kiryl Shutsemau
2026-08-16 22:45 ` [RFC PATCH 41/57] mm/collapse: give collapse its own trace header Kiryl Shutsemau
2026-08-16 22:45 ` [RFC PATCH 42/57] mm/collapse: allow error injection into the freeze Kiryl Shutsemau
2026-08-16 22:45 ` [RFC PATCH 43/57] mm/khugepaged: check the scan budget before the work, not after Kiryl Shutsemau
2026-08-16 22:45 ` [RFC PATCH 44/57] mm/khugepaged: hold the address space open across a scan Kiryl Shutsemau
2026-08-16 22:45 ` [RFC PATCH 45/57] mm/collapse: take a per-VMA read lock for the round Kiryl Shutsemau
2026-08-16 22:45 ` [RFC PATCH 46/57] mm/khugepaged: scan under a per-VMA read lock Kiryl Shutsemau
2026-08-16 22:45 ` [RFC PATCH 47/57] mm/madvise: collapse " Kiryl Shutsemau
2026-08-16 22:46 ` [RFC PATCH 48/57] mm/collapse: assert the mm reference the engine relies on Kiryl Shutsemau
2026-08-16 22:46 ` [RFC PATCH 49/57] mm/khugepaged: drop the mmap_lock barrier from __khugepaged_exit() Kiryl Shutsemau
2026-08-16 22:46 ` [RFC PATCH 50/57] selftests/mm: attribute collapses by candidate event alone Kiryl Shutsemau
2026-08-16 22:46 ` [RFC PATCH 51/57] selftests/mm: cover collapse inside a sub-PMD VMA Kiryl Shutsemau
2026-08-16 22:46 ` [RFC PATCH 52/57] selftests/mm: cover a hole-y window in " Kiryl Shutsemau
2026-08-16 22:46 ` [RFC PATCH 53/57] selftests/mm: cover collapse of mlocked ranges Kiryl Shutsemau
2026-08-16 22:46 ` [RFC PATCH 54/57] selftests/mm: cover collapse beside a MADV_FREE'd page Kiryl Shutsemau
2026-08-16 22:46 ` [RFC PATCH 55/57] selftests/mm: cover collapse beside a pinned page Kiryl Shutsemau
2026-08-16 22:46 ` [RFC PATCH 56/57] selftests/mm: cover the scaled max_ptes_shared limit Kiryl Shutsemau
2026-08-16 22:46 ` [RFC PATCH 57/57] MAINTAINERS: add an entry for collapse Kiryl Shutsemau
2026-08-17  8:04   ` Lorenzo Stoakes (ARM)
2026-08-17  8:08     ` David Hildenbrand (Arm)
2026-08-17 10:12       ` Kiryl Shutsemau
2026-08-17  2:02 ` [RFC PATCH 00/57] mm/collapse: rebuild collapse on migration primitives Zi Yan
2026-08-17 10:07   ` Kiryl Shutsemau
2026-08-17  8:52 ` Lorenzo Stoakes (ARM)
2026-08-17 13:38   ` Kiryl Shutsemau
2026-08-18 13:06     ` Lorenzo Stoakes (ARM)
2026-08-18 14:12       ` David Hildenbrand (Arm)
2026-08-18 14:33         ` Lorenzo Stoakes (ARM)
2026-08-19 18:08         ` Kiryl Shutsemau
2026-08-24 14:22           ` Lorenzo Stoakes (ARM)
2026-08-24 14:59             ` Kiryl Shutsemau
2026-08-24 17:00               ` Lorenzo Stoakes (ARM)
2026-09-14 14:54           ` David Hildenbrand (Arm)
2026-09-15 10:40             ` Kiryl Shutsemau
2026-08-18 14:15     ` David Hildenbrand (Arm)
2026-08-18 14:41       ` Lorenzo Stoakes (ARM)
2026-08-19 18:22         ` Kiryl Shutsemau
2026-08-19 18:14       ` Kiryl Shutsemau
2026-08-18 13:55 ` David Hildenbrand (Arm)
2026-08-19 17:09   ` Kiryl Shutsemau
2026-09-14 15:07     ` David Hildenbrand (Arm)
2026-09-15 10:46       ` Kiryl Shutsemau
2026-09-15 15:21         ` David Hildenbrand (Arm)

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=ao8okZ-A7cnvoju6@thinkstation \
    --to=kirill@shutemov.name \
    --cc=agordeev@linux.ibm.com \
    --cc=akpm@linux-foundation.org \
    --cc=baohua@kernel.org \
    --cc=baolin.wang@linux.alibaba.com \
    --cc=bpf@vger.kernel.org \
    --cc=david@kernel.org \
    --cc=dev.jain@arm.com \
    --cc=hughd@google.com \
    --cc=jannh@google.com \
    --cc=lance.yang@linux.dev \
    --cc=liam@infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-kselftest@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=linux-trace-kernel@vger.kernel.org \
    --cc=ljs@kernel.org \
    --cc=mhiramat@kernel.org \
    --cc=mhocko@suse.com \
    --cc=nico.pache@linux.dev \
    --cc=pfalcato@suse.de \
    --cc=rostedt@goodmis.org \
    --cc=rppt@kernel.org \
    --cc=ryan.roberts@arm.com \
    --cc=shuah@kernel.org \
    --cc=surenb@google.com \
    --cc=usama.anjum@arm.com \
    --cc=usama.arif@linux.dev \
    --cc=vbabka@kernel.org \
    --cc=willy@infradead.org \
    --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.