KVM: PPC: Book3S HV: Make H_REMOVE return correct HPTE value for absent HPTEs
authorPaul Mackerras <paulus@samba.org>
Mon, 18 May 2015 04:10:54 +0000 (14:10 +1000)
committerPaul Mackerras <paulus@samba.org>
Wed, 21 Oct 2015 05:25:06 +0000 (16:25 +1100)
This fixes a bug where the old HPTE value returned by H_REMOVE has
the valid bit clear if the HPTE was an absent HPTE, as happens for
HPTEs for emulated MMIO pages and for RAM pages that have been paged
out by the host.  If the absent bit is set, we clear it and set the
valid bit, because from the guest's point of view, the HPTE is valid.

Signed-off-by: Paul Mackerras <paulus@samba.org>
arch/powerpc/kvm/book3s_hv_rm_mmu.c

index c1df9bb1e413a1ec76222a58cf0bc13c9bfdb280..97e7f8c853d8fea79a6cefd7b72af652530f3bb8 100644 (file)
@@ -470,6 +470,8 @@ long kvmppc_do_h_remove(struct kvm *kvm, unsigned long flags,
        note_hpte_modification(kvm, rev);
        unlock_hpte(hpte, 0);
 
+       if (v & HPTE_V_ABSENT)
+               v = (v & ~HPTE_V_ABSENT) | HPTE_V_VALID;
        hpret[0] = v;
        hpret[1] = r;
        return H_SUCCESS;