diff mbox

KVM: PPC: Book3S HV: Always flush TLB in kvmppc_alloc_reset_hpt()

Message ID 20180110060439.21822-1-david@gibson.dropbear.id.au (mailing list archive)
State New, archived
Headers show

Commit Message

David Gibson Jan. 10, 2018, 6:04 a.m. UTC
The KVM_PPC_ALLOCATE_HTAB ioctl(), implemented by kvmppc_alloc_reset_hpt()
is supposed to completely clear and reset a guest's Hashed Page Table (HPT)
allocating or re-allocating it if necessary.

In the case where an HPT of the right size already exists and it just
zeroes it, it forces a TLB flush on all guest CPUs, to remove any stale TLB
entries loaded from the old HPT.

However, that situation can arise when the HPT is resizing as well - or
even when switching from an RPT to HPT - so those cases need a TLB flush as
well.

So, move the TLB flush to trigger in all cases except for errors.

Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
---
 arch/powerpc/kvm/book3s_64_mmu_hv.c | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

Paul, this is based on Paolo's KVM tree, but it should apply without
modification to pretty much any vaguely current tree.  It's a pretty
nasty bug - the case we've found hitting it in the wild is a bit
esoteric, but it could in theory affect other situations as well.

Please apply ASAP, and should probably be queued for the stable
branches as well.

Comments

Paul Mackerras Jan. 11, 2018, 9:54 a.m. UTC | #1
On Wed, Jan 10, 2018 at 05:04:39PM +1100, David Gibson wrote:
> The KVM_PPC_ALLOCATE_HTAB ioctl(), implemented by kvmppc_alloc_reset_hpt()
> is supposed to completely clear and reset a guest's Hashed Page Table (HPT)
> allocating or re-allocating it if necessary.
> 
> In the case where an HPT of the right size already exists and it just
> zeroes it, it forces a TLB flush on all guest CPUs, to remove any stale TLB
> entries loaded from the old HPT.
> 
> However, that situation can arise when the HPT is resizing as well - or
> even when switching from an RPT to HPT - so those cases need a TLB flush as
> well.
> 
> So, move the TLB flush to trigger in all cases except for errors.
> 
> Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
> ---
>  arch/powerpc/kvm/book3s_64_mmu_hv.c | 6 ++++--
>  1 file changed, 4 insertions(+), 2 deletions(-)
> 
> Paul, this is based on Paolo's KVM tree, but it should apply without
> modification to pretty much any vaguely current tree.  It's a pretty
> nasty bug - the case we've found hitting it in the wild is a bit
> esoteric, but it could in theory affect other situations as well.
> 
> Please apply ASAP, and should probably be queued for the stable
> branches as well.

Thanks, applied to my kvm-ppc-fixes branch, and I added
cc: stable@vger.kernel.org.

Paul.
diff mbox

Patch

diff --git a/arch/powerpc/kvm/book3s_64_mmu_hv.c b/arch/powerpc/kvm/book3s_64_mmu_hv.c
index 966097232d21..51a275cc8a4d 100644
--- a/arch/powerpc/kvm/book3s_64_mmu_hv.c
+++ b/arch/powerpc/kvm/book3s_64_mmu_hv.c
@@ -159,8 +159,6 @@  long kvmppc_alloc_reset_hpt(struct kvm *kvm, int order)
 		 * Reset all the reverse-mapping chains for all memslots
 		 */
 		kvmppc_rmap_reset(kvm);
-		/* Ensure that each vcpu will flush its TLB on next entry. */
-		cpumask_setall(&kvm->arch.need_tlb_flush);
 		err = 0;
 		goto out;
 	}
@@ -176,6 +174,10 @@  long kvmppc_alloc_reset_hpt(struct kvm *kvm, int order)
 	kvmppc_set_hpt(kvm, &info);
 
 out:
+	if (err == 0)
+		/* Ensure that each vcpu will flush its TLB on next entry. */
+		cpumask_setall(&kvm->arch.need_tlb_flush);
+
 	mutex_unlock(&kvm->lock);
 	return err;
 }