]> git.proxmox.com Git - mirror_ubuntu-hirsute-kernel.git/commitdiff
KVM: vmx: rewrite the comment in vmx_get_mt_mask
authorChia-I Wu <olvaffe@gmail.com>
Thu, 13 Feb 2020 21:30:34 +0000 (13:30 -0800)
committerPaolo Bonzini <pbonzini@redhat.com>
Mon, 16 Mar 2020 16:57:08 +0000 (17:57 +0100)
Better reflect the structure of the code and metion why we could not
always honor the guest.

Signed-off-by: Chia-I Wu <olvaffe@gmail.com>
Cc: Gurchetan Singh <gurchetansingh@chromium.org>
Cc: Gerd Hoffmann <kraxel@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
arch/x86/kvm/vmx/vmx.c

index 63aaf44edd1ff62aaa6529a2ef714a5f25ff41a4..5f6a262111838dc1e7b9a3b4177480cc489c3052 100644 (file)
@@ -6898,17 +6898,24 @@ static u64 vmx_get_mt_mask(struct kvm_vcpu *vcpu, gfn_t gfn, bool is_mmio)
        u8 cache;
        u64 ipat = 0;
 
-       /* For VT-d and EPT combination
-        * 1. MMIO: always map as UC
-        * 2. EPT with VT-d:
-        *   a. VT-d without snooping control feature: can't guarantee the
-        *      result, try to trust guest.
-        *   b. VT-d with snooping control feature: snooping control feature of
-        *      VT-d engine can guarantee the cache correctness. Just set it
-        *      to WB to keep consistent with host. So the same as item 3.
-        * 3. EPT without VT-d: always map as WB and set IPAT=1 to keep
-        *    consistent with host MTRR
+       /* We wanted to honor guest CD/MTRR/PAT, but doing so could result in
+        * memory aliases with conflicting memory types and sometimes MCEs.
+        * We have to be careful as to what are honored and when.
+        *
+        * For MMIO, guest CD/MTRR are ignored.  The EPT memory type is set to
+        * UC.  The effective memory type is UC or WC depending on guest PAT.
+        * This was historically the source of MCEs and we want to be
+        * conservative.
+        *
+        * When there is no need to deal with noncoherent DMA (e.g., no VT-d
+        * or VT-d has snoop control), guest CD/MTRR/PAT are all ignored.  The
+        * EPT memory type is set to WB.  The effective memory type is forced
+        * WB.
+        *
+        * Otherwise, we trust guest.  Guest CD/MTRR/PAT are all honored.  The
+        * EPT memory type is used to emulate guest CD/MTRR.
         */
+
        if (is_mmio) {
                cache = MTRR_TYPE_UNCACHABLE;
                goto exit;