Patch "KVM: PPC: Book3S HV: Fix race in reading change bit when removing HPTE" has been added to the 4.2-stable tree
Subsystems (3)
This is a note to let you know that I've just added the patch titled
KVM: PPC: Book3S HV: Fix race in reading change bit when removing HPTE
to the 4.2-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
kvm-ppc-book3s-hv-fix-race-in-reading-change-bit-when-removing-hpte.patch
and it can be found in the queue-4.2 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
1e5bf454f58731e360e504253e85bae7aaa2d298Mon Sep 17 00:00:00 2001
From: Paul Mackerras <[email protected]>
Date: Wed, 24 Jun 2015 21:18:05 +1000
Subject: KVM: PPC: Book3S HV: Fix race in reading change bit when removing HPTE
From: Paul Mackerras <[email protected]>
commit 1e5bf454f58731e360e504253e85bae7aaa2d298 upstream.
The reference (R) and change (C) bits in a HPT entry can be set by hardware at any time up until the HPTE is invalidated and the TLB invalidation sequence has completed. This means that when removing a HPTE, we need to read the HPTE after the invalidation sequence has completed in order to obtain reliable values of R and C. The code in kvmppc_do_h_remove() used to do this. However, commit 6f22bd3265fb ("KVM: PPC: Book3S HV: Make HTAB code LE host aware") removed the read after invalidation as a side effect of other changes. This restores the read of the HPTE after invalidation.
The user-visible effect of this bug would be that when migrating a guest, there is a small probability that a page modified by the guest and then unmapped by the guest might not get re-transmitted and thus the destination might end up with a stale copy of the page.
--- arch/powerpc/kvm/book3s_hv_rm_mmu.c | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-)
arch/powerpc/kvm/book3s_hv_rm_mmu.c +12 -6
@@ -421,14 +421,20 @@ long kvmppc_do_h_remove(struct kvm *kvm, rev =real_vmalloc_addr (&kvm->arch.revmap[pte_index]); v = pte & ~HPTE_V_HVLOCK ;if (v &HPTE_V_VALID ) { -u64 pte1; - - pte1 =be64_to_cpu (hpte[1 ]); hpte[0 ] &= ~cpu_to_be64 (HPTE_V_VALID ); - rb =compute_tlbie_rb (v, pte1, pte_index); + rb =compute_tlbie_rb (v,be64_to_cpu (hpte[1 ]), pte_index);do_tlbies (kvm, &rb,1 ,global_invalidates (kvm, flags), true); -/* Read PTE low word after tlbie to get final R/C values */ -remove_revmap_chain (kvm, pte_index, rev, v, pte1); +/* +* The reference (R) and change (C) bits in a HPT +* entry can be set by hardware at any time up until +* the HPTE is invalidated and the TLB invalidation +* sequence has completed. This means that when +* removing a HPTE, we need to re-read the HPTE after +* the invalidation sequence has completed in order to +* obtain reliable values of R and C. +*/ +remove_revmap_chain (kvm, pte_index, rev, v, +be64_to_cpu (hpte[1 ])); } r = rev->guest_rpte & ~HPTE_GR_RESERVED ;note_hpte_modification (kvm, rev);
Patches currently in stable-queue which might be from [email protected] are
queue-4.2/kvm-ppc-book3s-hv-exit-on-h_doorbell-if-host_ipi-is-set.patch queue-4.2/kvm-ppc-book3s-hv-fix-race-in-reading-change-bit-when-removing-hpte.patch