Message ID | 20240325185158.8565-4-will@kernel.org (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | KVM: arm64: TLBI fixes for the pgtable code | expand |
On 25/03/2024 18:51, Will Deacon wrote: > Commit c910f2b65518 ("arm64/mm: Update tlb invalidation routines for > FEAT_LPA2") updated the __tlbi_level() macro to take the target level > as an argument, with TLBI_TTL_UNKNOWN (rather than 0) indicating that > the caller cannot provide level information. Unfortunately, the two > implementations of __kvm_tlb_flush_vmid_range() were not updated and so > now ask for an level 0 invalidation if FEAT_LPA2 is implemented. Ouch, sorry about this! I remember rebasing my change onto the KVM tlbi range changes and having a few conflicts. Obviously I didn't do a good enough job of reviewing the result and missed this new user. > > Fix the problem by passing TLBI_TTL_UNKNOWN instead of 0 as the level > argument to __flush_s2_tlb_range_op() in __kvm_tlb_flush_vmid_range(). > > Cc: Ryan Roberts <ryan.roberts@arm.com> > Cc: Catalin Marinas <catalin.marinas@arm.com> > Cc: Oliver Upton <oliver.upton@linux.dev> > Cc: Marc Zyngier <maz@kernel.org> > Fixes: c910f2b65518 ("arm64/mm: Update tlb invalidation routines for FEAT_LPA2") > Signed-off-by: Will Deacon <will@kernel.org> Reviewed-by: Ryan Roberts <ryan.roberts@arm.com> > --- > arch/arm64/kvm/hyp/nvhe/tlb.c | 3 ++- > arch/arm64/kvm/hyp/vhe/tlb.c | 3 ++- > 2 files changed, 4 insertions(+), 2 deletions(-) > > diff --git a/arch/arm64/kvm/hyp/nvhe/tlb.c b/arch/arm64/kvm/hyp/nvhe/tlb.c > index a60fb13e2192..2fc68da4036d 100644 > --- a/arch/arm64/kvm/hyp/nvhe/tlb.c > +++ b/arch/arm64/kvm/hyp/nvhe/tlb.c > @@ -154,7 +154,8 @@ void __kvm_tlb_flush_vmid_range(struct kvm_s2_mmu *mmu, > /* Switch to requested VMID */ > __tlb_switch_to_guest(mmu, &cxt, false); > > - __flush_s2_tlb_range_op(ipas2e1is, start, pages, stride, 0); > + __flush_s2_tlb_range_op(ipas2e1is, start, pages, stride, > + TLBI_TTL_UNKNOWN); > > dsb(ish); > __tlbi(vmalle1is); > diff --git a/arch/arm64/kvm/hyp/vhe/tlb.c b/arch/arm64/kvm/hyp/vhe/tlb.c > index b32e2940df7d..1a60b95381e8 100644 > --- a/arch/arm64/kvm/hyp/vhe/tlb.c > +++ b/arch/arm64/kvm/hyp/vhe/tlb.c > @@ -171,7 +171,8 @@ void __kvm_tlb_flush_vmid_range(struct kvm_s2_mmu *mmu, > /* Switch to requested VMID */ > __tlb_switch_to_guest(mmu, &cxt); > > - __flush_s2_tlb_range_op(ipas2e1is, start, pages, stride, 0); > + __flush_s2_tlb_range_op(ipas2e1is, start, pages, stride, > + TLBI_TTL_UNKNOWN); > > dsb(ish); > __tlbi(vmalle1is);
On Tue, Mar 26, 2024 at 01:48:46PM +0000, Ryan Roberts wrote: > On 25/03/2024 18:51, Will Deacon wrote: > > Commit c910f2b65518 ("arm64/mm: Update tlb invalidation routines for > > FEAT_LPA2") updated the __tlbi_level() macro to take the target level > > as an argument, with TLBI_TTL_UNKNOWN (rather than 0) indicating that > > the caller cannot provide level information. Unfortunately, the two > > implementations of __kvm_tlb_flush_vmid_range() were not updated and so > > now ask for an level 0 invalidation if FEAT_LPA2 is implemented. > > Ouch, sorry about this! I remember rebasing my change onto the KVM tlbi range > changes and having a few conflicts. Obviously I didn't do a good enough job of > reviewing the result and missed this new user. No problem, it's easily done. It's also not your fault, as we shouldn't have been using the reserved encoding of 0 to mean "no hint" in the first place! > > Cc: Ryan Roberts <ryan.roberts@arm.com> > > Cc: Catalin Marinas <catalin.marinas@arm.com> > > Cc: Oliver Upton <oliver.upton@linux.dev> > > Cc: Marc Zyngier <maz@kernel.org> > > Fixes: c910f2b65518 ("arm64/mm: Update tlb invalidation routines for FEAT_LPA2") > > Signed-off-by: Will Deacon <will@kernel.org> > > Reviewed-by: Ryan Roberts <ryan.roberts@arm.com> Thanks. Will
diff --git a/arch/arm64/kvm/hyp/nvhe/tlb.c b/arch/arm64/kvm/hyp/nvhe/tlb.c index a60fb13e2192..2fc68da4036d 100644 --- a/arch/arm64/kvm/hyp/nvhe/tlb.c +++ b/arch/arm64/kvm/hyp/nvhe/tlb.c @@ -154,7 +154,8 @@ void __kvm_tlb_flush_vmid_range(struct kvm_s2_mmu *mmu, /* Switch to requested VMID */ __tlb_switch_to_guest(mmu, &cxt, false); - __flush_s2_tlb_range_op(ipas2e1is, start, pages, stride, 0); + __flush_s2_tlb_range_op(ipas2e1is, start, pages, stride, + TLBI_TTL_UNKNOWN); dsb(ish); __tlbi(vmalle1is); diff --git a/arch/arm64/kvm/hyp/vhe/tlb.c b/arch/arm64/kvm/hyp/vhe/tlb.c index b32e2940df7d..1a60b95381e8 100644 --- a/arch/arm64/kvm/hyp/vhe/tlb.c +++ b/arch/arm64/kvm/hyp/vhe/tlb.c @@ -171,7 +171,8 @@ void __kvm_tlb_flush_vmid_range(struct kvm_s2_mmu *mmu, /* Switch to requested VMID */ __tlb_switch_to_guest(mmu, &cxt); - __flush_s2_tlb_range_op(ipas2e1is, start, pages, stride, 0); + __flush_s2_tlb_range_op(ipas2e1is, start, pages, stride, + TLBI_TTL_UNKNOWN); dsb(ish); __tlbi(vmalle1is);
Commit c910f2b65518 ("arm64/mm: Update tlb invalidation routines for FEAT_LPA2") updated the __tlbi_level() macro to take the target level as an argument, with TLBI_TTL_UNKNOWN (rather than 0) indicating that the caller cannot provide level information. Unfortunately, the two implementations of __kvm_tlb_flush_vmid_range() were not updated and so now ask for an level 0 invalidation if FEAT_LPA2 is implemented. Fix the problem by passing TLBI_TTL_UNKNOWN instead of 0 as the level argument to __flush_s2_tlb_range_op() in __kvm_tlb_flush_vmid_range(). Cc: Ryan Roberts <ryan.roberts@arm.com> Cc: Catalin Marinas <catalin.marinas@arm.com> Cc: Oliver Upton <oliver.upton@linux.dev> Cc: Marc Zyngier <maz@kernel.org> Fixes: c910f2b65518 ("arm64/mm: Update tlb invalidation routines for FEAT_LPA2") Signed-off-by: Will Deacon <will@kernel.org> --- arch/arm64/kvm/hyp/nvhe/tlb.c | 3 ++- arch/arm64/kvm/hyp/vhe/tlb.c | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-)