From: "Lorenzo Stoakes (ARM)" <ljs@kernel.org>
To: Will Deacon <will@kernel.org>
Cc: Mike Rapoport <rppt@kernel.org>,
Andrew Morton <akpm@linux-foundation.org>,
Suren Baghdasaryan <surenb@google.com>,
"Liam R. Howlett" <liam@infradead.org>,
Vlastimil Babka <vbabka@kernel.org>,
Shakeel Butt <shakeel.butt@linux.dev>,
David Hildenbrand <david@kernel.org>,
Michal Hocko <mhocko@suse.com>,
Uladzislau Rezki <urezki@gmail.com>,
Toshi Kani <toshi.kani@hpe.com>,
Dave Hansen <dave.hansen@linux.intel.com>,
Andy Lutomirski <luto@kernel.org>,
Peter Zijlstra <peterz@infradead.org>,
Thomas Gleixner <tglx@kernel.org>,
Ingo Molnar <mingo@redhat.com>, Borislav Petkov <bp@alien8.de>,
x86@kernel.org, "H. Peter Anvin" <hpa@zytor.com>,
Kiryl Shutsemau <kas@kernel.org>,
Catalin Marinas <catalin.marinas@arm.com>,
Dev Jain <dev.jain@arm.com>, Ryan Roberts <ryan.roberts@arm.com>,
David Carlier <devnexen@gmail.com>,
linux-mm@kvack.org, linux-kernel@vger.kernel.org,
bpf@vger.kernel.org, linux-arm-kernel@lists.infradead.org,
stable@vger.kernel.org, abarnas@google.com
Subject: Re: [PATCH mm-hotfixes v3 2/4] x86/mm/pat: acquire mmap lock on page table free to avoid ptdump UAF
Date: Thu, 16 Jul 2026 14:29:38 +0100 [thread overview]
Message-ID: <aljb7hoFxL7aUZvG@lucifer> (raw)
In-Reply-To: <aljBF-am7dqqG8Gd@willie-the-truck>
On Thu, Jul 16, 2026 at 12:31:35PM +0100, Will Deacon wrote:
> On Thu, Jul 16, 2026 at 11:06:51AM +0100, Lorenzo Stoakes (ARM) wrote:
> > On 2026-07-15 18:49 +0300, Mike Rapoport wrote:
> > > On Wed, Jul 15, 2026 at 04:24:59PM +0100, Will Deacon wrote:
> > > > > diff --git a/arch/x86/mm/pat/set_memory.c b/arch/x86/mm/pat/set_memory.c
> > > > > index d023a40a1e03..4c4b8244502f 100644
> > > > > --- a/arch/x86/mm/pat/set_memory.c
> > > > > +++ b/arch/x86/mm/pat/set_memory.c
> > > > > @@ -22,6 +22,7 @@
> > > > > #include <linux/cc_platform.h>
> > > > > #include <linux/set_memory.h>
> > > > > #include <linux/memregion.h>
> > > > > +#include <linux/cleanup.h>
> > > > >
> > > > > #include <asm/e820/api.h>
> > > > > #include <asm/processor.h>
> > > > > @@ -436,9 +437,16 @@ static void cpa_collapse_large_pages(struct cpa_data *cpa)
> > > > >
> > > > > flush_tlb_all();
> > > > >
> > > > > - list_for_each_entry_safe(ptdesc, tmp, &pgtables, pt_list) {
> > > > > - list_del(&ptdesc->pt_list);
> > > > > - pagetable_free(ptdesc);
> > > > > + /*
> > > > > + * ptdump might read these page tables, so avoid a use-after-free by
> > > > > + * acquiring the mmap read lock on init_mm (ptdump acquires the mmap
> > > > > + * write lock).
> > > > > + */
> > > > > + scoped_guard(mmap_read_lock, &init_mm) {
> > > > > + list_for_each_entry_safe(ptdesc, tmp, &pgtables, pt_list) {
> > > > > + list_del(&ptdesc->pt_list);
> > > > > + pagetable_free(ptdesc);
> > > > > + }
> > > >
> > > > As I understand it, the argument for taking the read lock is that we're
> > > > operating on a region that we "wholly own" and therefore we can happily
> > > > run concurrently with CPUs walking distinct parts of the page-table.
> > > > However, from what I can tell, the CPA collapse logic will operate on
> > > > regions outside of the address range being manipulated by its caller
> > > > because it rounds up to the PMD size.
> > > >
> > > > As a made-up example, imagine I have a 2MiB aligned region where the
> > > > first 1MiB is read-only and the second 1MiB is in the default r/w state.
> > > > If one CPU calls set_memory_rw() on the first 1MiB while another CPU is
> > > > walking the second 1MiB (via some other API that doesn't take cpa_lock),
> > > > it looks to me like the first CPU can collapse the page-table and free
> > > > the unused pages under the feet of the other CPU. What prevents that
> > > > from happening?
> > >
> > > Nothing, and there's a patch to fix that that synchronizes
> > > cpa_collapse_large_pages() using cpa_lock:
> > >
> > > https://lore.kernel.org/all/20260626163213.2284080-1-den@openvz.org
>
> Hmm, but that relies on all concurrent walkers taking cpa_lock, no? Surely
> that's not generally the case.
>
> > Thanks Mike!
> >
> > >
> > > This still won't be enough to sync with ptdump though.
> >
> > Yeah, so this patch is still necessary.
> >
> > But that patch conflicts with this one as it holds a spin lock over the page
> > table freeing, which prevents taking an rwsem... :/
> >
> > Anyway I think this one is still fine as it seems there's not a consensus over
> > there as there was discussion about just removing the locking anyway ([0])?
> >
> > So can kick that can down the road and just get these ptdump bugs fixed :)
> >
> > >
> > > > If all concurrent walkers have interrupts disabled, I guess the TLB
> > > > invalidation logic would do it, but it would be good to call this out in
> > > > the commit message because it's not clear to me why the read_lock is
> > > > sufficient for the collapsing case.
> >
> > Yeah, so this patch is _only_ fixing the ptdump case. Any existing bug must be
> > addressed separately.
>
> Up to you folks, but if you took the write lock during collapse wouldn't
> that fix it for all concurrent walkers and we wouldn't need another patch?
>
> I would argue that using the read lock here directly contradicts the
> rationale for why this is safe, because this is an occurence of code
> that operates on a range that it doesn't wholly own. It seems bizarre
> to me to go to the effort of adding locking, but then not adding
> sufficient locking for all concurrent walkers.
Yeah good point, we could avoid the cpa spin lock altogether and guarantee that
we're the only writer by using an mmap write lock instead.
We have to take a write lock in the ptdump reader because of non-VMA ranges for
some architectures + munmap downgrades to a read lock on teardown (having
already removed the VMA ranges hence non-VMA the only ones we are concerned
about).
We take read locks for stabilisation here + in vmap code because that suffices,
but so does a write lock.
I'll post on that thread and do a respin with that then.
>
> Will
Cheers, Lorenzo
next prev parent reply other threads:[~2026-07-16 14:49 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-07-14 17:24 [PATCH mm-hotfixes v3 0/4] mm: fix UAF caused by race between ptdump and vmap pgtable freeing Lorenzo Stoakes
2026-07-14 17:24 ` [PATCH mm-hotfixes v3 1/4] mm/vmalloc: acquire init_mm lock on huge vmap to avoid ptdump UAF Lorenzo Stoakes
2026-07-15 10:34 ` Kiryl Shutsemau
2026-07-15 14:16 ` Lorenzo Stoakes (ARM)
2026-07-15 19:14 ` Andrew Morton
2026-07-14 17:24 ` [PATCH mm-hotfixes v3 2/4] x86/mm/pat: acquire mmap lock on page table free " Lorenzo Stoakes
2026-07-14 17:29 ` Dave Hansen
2026-07-15 15:24 ` Will Deacon
2026-07-15 15:49 ` Mike Rapoport
[not found] ` <178419641178.59347.17339330762419756196.b4-reply@b4>
2026-07-16 11:31 ` Will Deacon
2026-07-16 13:29 ` Lorenzo Stoakes (ARM) [this message]
2026-07-14 17:24 ` [PATCH mm-hotfixes v3 3/4] mm/ptdump: always stabilise against page table freeing using init_mm Lorenzo Stoakes
2026-07-15 10:36 ` Kiryl Shutsemau
2026-07-14 17:24 ` [PATCH mm-hotfixes v3 4/4] arm64: remove redundant concurrent ptdump UAF mitigation Lorenzo Stoakes
2026-07-14 17:31 ` [PATCH mm-hotfixes v3 0/4] mm: fix UAF caused by race between ptdump and vmap pgtable freeing Dave Hansen
2026-07-14 19:11 ` Andrew Morton
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=aljb7hoFxL7aUZvG@lucifer \
--to=ljs@kernel.org \
--cc=abarnas@google.com \
--cc=akpm@linux-foundation.org \
--cc=bp@alien8.de \
--cc=bpf@vger.kernel.org \
--cc=catalin.marinas@arm.com \
--cc=dave.hansen@linux.intel.com \
--cc=david@kernel.org \
--cc=dev.jain@arm.com \
--cc=devnexen@gmail.com \
--cc=hpa@zytor.com \
--cc=kas@kernel.org \
--cc=liam@infradead.org \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=luto@kernel.org \
--cc=mhocko@suse.com \
--cc=mingo@redhat.com \
--cc=peterz@infradead.org \
--cc=rppt@kernel.org \
--cc=ryan.roberts@arm.com \
--cc=shakeel.butt@linux.dev \
--cc=stable@vger.kernel.org \
--cc=surenb@google.com \
--cc=tglx@kernel.org \
--cc=toshi.kani@hpe.com \
--cc=urezki@gmail.com \
--cc=vbabka@kernel.org \
--cc=will@kernel.org \
--cc=x86@kernel.org \
/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