• Avi Kivity's avatar
    KVM: MMU: Fix race when instantiating a shadow pte · f7d9c7b7
    Avi Kivity authored
    For improved concurrency, the guest walk is performed concurrently with other
    vcpus.  This means that we need to revalidate the guest ptes once we have
    write-protected the guest page tables, at which point they can no longer be
    modified.
    
    The current code attempts to avoid this check if the shadow page table is not
    new, on the assumption that if it has existed before, the guest could not have
    modified the pte without the shadow lock.  However the assumption is incorrect,
    as the racing vcpu could have modified the pte, then instantiated the shadow
    page, before our vcpu regains control:
    
      vcpu0        vcpu1
    
      fault
      walk pte
    
                   modify pte
                   fault in same pagetable
                   instantiate shadow page
    
      lookup shadow page
      conclude it is old
      instantiate spte based on stale guest pte
    
    We could do something clever with generation counters, but a test run by
    Marcelo suggests this is unnecessary and we can just do the revalidation
    unconditionally.  The pte will be in the processor cache and the check can
    be quite fast.
    Signed-off-by: default avatarAvi Kivity <avi@qumranet.com>
    f7d9c7b7
mmu.c 44.9 KB