All of lore.kernel.org
 help / color / mirror / Atom feed
From: Catalin Marinas <catalin.marinas@arm.com>
To: Will Deacon <will@kernel.org>
Cc: Usama Anjum <usama.anjum@arm.com>,
	Linu Cherian <linu.cherian@arm.com>,
	Ryan Roberts <ryan.roberts@arm.com>,
	Kevin Brodsky <kevin.brodsky@arm.com>,
	Anshuman Khandual <anshuman.khandual@arm.com>,
	Yang Shi <yang@os.amperecomputing.com>,
	Mark Rutland <mark.rutland@arm.com>,
	Huang Ying <ying.huang@linux.alibaba.com>,
	linux-arm-kernel@lists.infradead.org,
	linux-kernel@vger.kernel.org, maz@kernel.org
Subject: Re: [PATCH v2] arm64: tlbflush: Don't broadcast if mm was only active on local cpu
Date: Fri, 30 Oct 2026 12:18:39 +0000	[thread overview]
Message-ID: <auSLH65dv2nEctXd@arm.com> (raw)
In-Reply-To: <auR9iDfUxqz3ExP8@willie-the-truck>

On Fri, Oct 30, 2026 at 11:20:40AM +0000, Will Deacon wrote:
> On Wed, Oct 28, 2026 at 02:47:19PM +0000, Usama Anjum wrote:
> > On 23/05/2026 2:47 pm, Linu Cherian wrote:
> > > From: Ryan Roberts <ryan.roberts@arm.com>
> > > 
> > > There are 3 variants of tlb flush that invalidate user mappings:
> > > flush_tlb_mm(), flush_tlb_page() and __flush_tlb_range(). All of these
> > > would previously unconditionally broadcast their tlbis to all cpus in
> > > the inner shareable domain.
> > > 
> > > But this is a waste of effort if we can prove that the mm for which we
> > > are flushing the mappings has only ever been active on the local cpu. In
> > > that case, it is safe to avoid the broadcast and simply invalidate the
> > > current cpu.
> > > 
> > > So let's track in mm_context_t::active_cpu either the mm has never been
> > > active on any cpu, has been active on more than 1 cpu, or has been
> > > active on precisely 1 cpu - and in that case, which one. We update this
> > > when switching context, being careful to ensure that it gets updated
> > > *before* installing the mm's pgtables. On the reader side, we ensure we
> > > read *after* the previous write(s) to the pgtable(s) that necessitated
> > > the tlb flush have completed. This guarrantees that if a cpu that is
> > > doing a tlb flush sees it's own id in active_cpu, then the old pgtable
> > > entry cannot have been seen by any other cpu and we can flush only the
> > > local cpu.
> > > 
> > > Signed-off-by: Ryan Roberts <ryan.roberts@arm.com>
> > > Reviewed-by: Catalin Marinas <catalin.marinas@arm.com>
> > > Tested-by: Huang Ying <ying.huang@linux.alibaba.com>
> > > [linu.cherian@arm.com: Adapted for v7.1 flush tlb API changes]
> > > Signed-off-by: Linu Cherian <linu.cherian@arm.com>
> > > ---
> > > Changelog from RFC v1:
> > > - Adapted for v7.1 flush tlb API changes
> > >   No changes in core logic
> > > - Collected Rb and Tb tags
> > > - lat_mmap benchmark showed dsb(ishst) performs better than dsb(ish),
> > >   hence retained dsb(ishst) in flush_tlb_user_pre	
> > > 
> > > 
> > > Testing with 7.1-rc4 :
> > > +-----------------------+---------------------------------------------------+-------------+
> > > | Benchmark             | Result Class                                      |  Improvement|  
> > > +=======================+===================================================+=============+
> > > | perf/syscall          | fork (ops/sec)                                    |   (I) 3.25% |
> > > +-----------------------+---------------------------------------------------+-------------+
> > > | pts/memtier-benchmark | Protocol: Redis Clients: 100 Ratio: 1:5 (Ops/sec) |   (I) 2.70% |
> > > | 			| Protocol: Redis Clients: 100 Ratio: 5:1 (Ops/sec) |   (I) 2.13% |
> > > +-----------------------+---------------------------------------------------+-------------+
> > 
> > I tested this patch using a synthetic Firecracker benchmark on a 192-CPU
> > arm64 host, with Linux v7.3 on both the host and guests. Each worker
> > repeatedly creates a fresh 1-vCPU microVM, boots Ubuntu, verifies an echo
> > response over the serial console, and shuts the guest down, waiting for
> > Firecracker to exit before starting the next VM. Each guest has 256 MiB of
> > RAM, with two VM slots per workload CPU.
> > 
> > With 4 KiB guests, the unpatched workload stops scaling between 64 and 96
> > CPUs: throughput falls from approximately 68 to 65 completed lifecycles/s
> > despite the additional CPUs.
> > 
> > Applying the patch to the guest substantially improves throughput at higher
> > concurrency. At 128 workload CPUs, I measured:
> > 
> >   Guest pages  Unpatched  Guest patched only  Host patched only
> >   -----------  ---------  ------------------  -----------------
> >   4 KiB        73.83/s    108.55/s (+47.0%)    74.09/s (+0.4%)
> >   64 KiB       86.46/s    105.04/s (+21.5%)    90.15/s (+4.3%)
> > 
> > The host uses 4 KiB pages throughout. The host-only difference with 4 KiB
> > guests is small enough that I would regard it as essentially unchanged.
> 
> Sorry, but I haven't understood the setup here. If each guest ("microVM")
> only has 1 vCPU, then why does this patch have any effect in the "guest
> patched only" case?

I wonder whether it's the repeat TLBI workaround just doing more DVM
traffic. Turned off when no broadcast is needed.

> Additionally, the non-broadcast TLB invalidation will
> be upgraded to broadcast by the hypervisor.

I have a hack that makes things even faster (opportunistic
HCR_EL2.FB=0). I may post it once I understand the implications
properly.

-- 
Catalin


      reply	other threads:[~2026-10-30 12:18 UTC|newest]

Thread overview: 20+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-05-23 13:47 [PATCH v2] arm64: tlbflush: Don't broadcast if mm was only active on local cpu Linu Cherian
2026-06-14 11:04 ` Will Deacon
2026-06-14 11:33   ` Will Deacon
2026-06-15 11:21   ` Ryan Roberts
2026-06-15 14:43     ` Will Deacon
2026-06-15 15:41       ` Ryan Roberts
2026-06-16  5:05         ` Linu Cherian
2026-06-19 15:34         ` Will Deacon
2026-06-19 15:54           ` Ryan Roberts
2026-06-16  5:00       ` Linu Cherian
2026-06-18  6:01       ` Linu Cherian
2026-06-16  4:54     ` Linu Cherian
2026-06-15 12:39   ` Mark Rutland
2026-06-15 14:44     ` Will Deacon
2026-06-16  6:13       ` Mark Rutland
2026-06-17 13:58         ` Will Deacon
2026-07-02 23:17 ` [PATCH] arm64: tlbflush: add debug counters for local vs broadcast flushes Sayali Kulkarni
2026-10-28 14:47 ` [PATCH v2] arm64: tlbflush: Don't broadcast if mm was only active on local cpu Usama Anjum
2026-10-30 11:20   ` Will Deacon
2026-10-30 12:18     ` Catalin Marinas [this message]

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=auSLH65dv2nEctXd@arm.com \
    --to=catalin.marinas@arm.com \
    --cc=anshuman.khandual@arm.com \
    --cc=kevin.brodsky@arm.com \
    --cc=linu.cherian@arm.com \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mark.rutland@arm.com \
    --cc=maz@kernel.org \
    --cc=ryan.roberts@arm.com \
    --cc=usama.anjum@arm.com \
    --cc=will@kernel.org \
    --cc=yang@os.amperecomputing.com \
    --cc=ying.huang@linux.alibaba.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.