• Paul Mackerras's avatar
    KVM: PPC: Book3S HV: Keep HPTE locked when invalidating · a92bce95
    Paul Mackerras authored
    This reworks the implementations of the H_REMOVE and H_BULK_REMOVE
    hcalls to make sure that we keep the HPTE locked and in the reverse-
    mapping chain until we have finished invalidating it.  Previously
    we would remove it from the chain and unlock it before invalidating
    it, leaving a tiny window when the guest could access the page even
    though we believe we have removed it from the guest (e.g.,
    kvm_unmap_hva() has been called for the page and has found no HPTEs
    in the chain).  In addition, we'll need this for future patches where
    we will need to read the R and C bits in the HPTE after invalidating
    it.
    
    Doing this required restructuring kvmppc_h_bulk_remove() substantially.
    Since we want to batch up the tlbies, we now need to keep several
    HPTEs locked simultaneously.  In order to avoid possible deadlocks,
    we don't spin on the HPTE bitlock for any except the first HPTE in
    a batch.  If we can't acquire the HPTE bitlock for the second or
    subsequent HPTE, we terminate the batch at that point, do the tlbies
    that we have accumulated so far, unlock those HPTEs, and then start
    a new batch to do the remaining invalidations.
    Signed-off-by: default avatarPaul Mackerras <paulus@samba.org>
    Signed-off-by: default avatarAlexander Graf <agraf@suse.de>
    Signed-off-by: default avatarAvi Kivity <avi@redhat.com>
    a92bce95
book3s_hv_rm_mmu.c 21.6 KB