• Yan Zhao's avatar
    KVM: x86/mmu: Zap KVM TDP when noncoherent DMA assignment starts/stops · 362ff6dc
    Yan Zhao authored
    Zap KVM TDP when noncoherent DMA assignment starts (noncoherent dma count
    transitions from 0 to 1) or stops (noncoherent dma count transitions
    from 1 to 0). Before the zap, test if guest MTRR is to be honored after
    the assignment starts or was honored before the assignment stops.
    
    When there's no noncoherent DMA device, EPT memory type is
    ((MTRR_TYPE_WRBACK << VMX_EPT_MT_EPTE_SHIFT) | VMX_EPT_IPAT_BIT)
    
    When there're noncoherent DMA devices, EPT memory type needs to honor
    guest CR0.CD and MTRR settings.
    
    So, if noncoherent DMA count transitions between 0 and 1, EPT leaf entries
    need to be zapped to clear stale memory type.
    
    This issue might be hidden when the device is statically assigned with
    VFIO adding/removing MMIO regions of the noncoherent DMA devices for
    several times during guest boot, and current KVM MMU will call
    kvm_mmu_zap_all_fast() on the memslot removal.
    
    But if the device is hot-plugged, or if the guest has mmio_always_on for
    the device, the MMIO regions of it may only be added for once, then there's
    no path to do the EPT entries zapping to clear stale memory type.
    
    Therefore do the EPT zapping when noncoherent assignment starts/stops to
    ensure stale entries cleaned away.
    Signed-off-by: default avatarYan Zhao <yan.y.zhao@intel.com>
    Link: https://lore.kernel.org/r/20230714065223.20432-1-yan.y.zhao@intel.com
    [sean: fix misspelled words in comment and changelog]
    Signed-off-by: default avatarSean Christopherson <seanjc@google.com>
    362ff6dc
x86.c 364 KB