KVM: MMU: Fix regression with ept memory types merged into non-ept page tables
authorAvi Kivity <avi@redhat.com>
Mon, 13 Sep 2010 14:45:28 +0000 (16:45 +0200)
committerAvi Kivity <avi@redhat.com>
Sun, 24 Oct 2010 08:52:49 +0000 (10:52 +0200)
Commit "KVM: MMU: Make tdp_enabled a mmu-context parameter" made real-mode
set ->direct_map, and changed the code that merges in the memory type depend
on direct_map instead of tdp_enabled.  However, in this case what really
matters is tdp, not direct_map, since tdp changes the pte format regardless
of whether the mapping is direct or not.

As a result, real-mode shadow mappings got corrupted with ept memory types.
The result was a huge slowdown, likely due to the cache being disabled.

Change it back as the simplest fix for the regression (real fix is to move
all that to vmx code, and not use tdp_enabled as a synonym for ept).

Signed-off-by: Avi Kivity <avi@redhat.com>
arch/x86/kvm/mmu.c

index 6e248d80e350f553cee751d8c2be5c72cbe45097..3ce56bfe056e671e683b911fbd6c92c753c02bd9 100644 (file)
@@ -1980,7 +1980,7 @@ static int set_spte(struct kvm_vcpu *vcpu, u64 *sptep,
                spte |= shadow_user_mask;
        if (level > PT_PAGE_TABLE_LEVEL)
                spte |= PT_PAGE_SIZE_MASK;
-       if (vcpu->arch.mmu.direct_map)
+       if (tdp_enabled)
                spte |= kvm_x86_ops->get_mt_mask(vcpu, gfn,
                        kvm_is_mmio_pfn(pfn));