Re: [RFC PATCH v2 22/25] KVM: x86/mmu: Refactor kvm_mmu_invlpg() to allow skipping the gva flush

From: Sean Christopherson

Date: Wed Jul 22 2026 - 20:56:47 EST


On Wed, Jul 22, 2026, Sean Christopherson wrote:
> On Tue, Jun 16, 2026, Yosry Ahmed wrote:
> > Refactor helpers out of kvm_mmu_invalidate_addr() and kvm_mmu_invlpg()
> > that take in an extra argument to skip the GVA flush.
> >
> > This will be used when invalidating GVAs in a different context than the
> > correct one (i.e. invalidating an L2 GVA from L1), so flushing the
> > current context would flush the wrong TLB entries.
> >
> > No functional change intended.
> >
> > Signed-off-by: Yosry Ahmed <yosry@xxxxxxxxxx>
> > ---
> > arch/x86/kvm/mmu/mmu.c | 23 +++++++++++++++++------
> > 1 file changed, 17 insertions(+), 6 deletions(-)
> >
> > diff --git a/arch/x86/kvm/mmu/mmu.c b/arch/x86/kvm/mmu/mmu.c
> > index 65c35ed8f4a01..3feb75732f7b4 100644
> > --- a/arch/x86/kvm/mmu/mmu.c
> > +++ b/arch/x86/kvm/mmu/mmu.c
> > @@ -6615,15 +6615,15 @@ static void kvm_mmu_invalidate_addr_in_root(struct kvm_vcpu *vcpu,
> > write_unlock(&vcpu->kvm->mmu_lock);
> > }
> >
> > -void kvm_mmu_invalidate_addr(struct kvm_vcpu *vcpu, struct kvm_mmu *mmu,
> > - u64 addr, unsigned long roots)
> > +static void __kvm_mmu_invalidate_addr(struct kvm_vcpu *vcpu, struct kvm_mmu *mmu,
> > + u64 addr, unsigned long roots, bool flush_gva)
> > {
> > int i;
> >
> > WARN_ON_ONCE(roots & ~KVM_MMU_ROOTS_ALL);
> >
> > /* It's actually a GPA for vcpu->arch.guest_mmu. */
> > - if (mmu != &vcpu->arch.guest_mmu) {
> > + if (flush_gva && mmu != &vcpu->arch.guest_mmu) {
> > /* INVLPG on a non-canonical address is a NOP according to the SDM. */
> > if (is_noncanonical_invlpg_address(addr, vcpu))
> > return;
> > @@ -6642,9 +6642,15 @@ void kvm_mmu_invalidate_addr(struct kvm_vcpu *vcpu, struct kvm_mmu *mmu,
> > kvm_mmu_invalidate_addr_in_root(vcpu, mmu, addr, mmu->prev_roots[i].hpa);
> > }
> > }
> > +
> > +void kvm_mmu_invalidate_addr(struct kvm_vcpu *vcpu, struct kvm_mmu *mmu,
> > + u64 addr, unsigned long roots)
>
> Rather than kvm_mmu_invalidate_addr() for the wrapper, what if we call this
> kvm_mmu_invalidate_gva()? And then kvm_mmu_invlpg_gva(). Then we don't need
> to have the "in_root" version to a quad-underscores helper, and IMO it's more
> obvious what's different between the one-line wrappers and the inner helpers.

Hrm, or maybe I'm not understanding what "flush_gva" means. At first glance, I
was assuming you were using it to differentiate between GVA and GPA, but IIUC,
it's literally skipping the flush for the current context, which just so happens
to be done only for GVAs. I'd still like to avoid the "in_root" helper, if at
all possible.