Skip to contentSkip to conversation

propagate pat caching on the shadow l1

PATCH In review Jean Guyader 1 participant 2 messages Apr 26, 2010

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 propagate pat caching on the shadow l1

PAT caching was only propagated if has_arch_pdevs(), causing the hvm_get_mem_pinned_cacheattr() to be ignored in the non passthrough case.
l1_disallow_mask() needs to be relaxed.

xen/arch/x86/mm.c +2 -1
diff -r 8ab9285a8354 xen/arch/x86/mm.c
@@ -167,7 +167,8 @@
     ((d != dom_io) &&                                           \
      (rangeset_is_empty((d)->iomem_caps) &&                     \
       rangeset_is_empty((d)->arch.ioport_caps) &&               \
-      !has_arch_pdevs(d)) ?                                     \
+      !has_arch_pdevs(d) &&                                     \
+      !is_hvm_domain(d)) ?                                      \
      L1_DISALLOW_MASK : (L1_DISALLOW_MASK & ~PAGE_CACHE_ATTRS))
 
 #ifdef CONFIG_COMPAT
xen/arch/x86/mm/shadow/multi.c +19 -15
diff -r 8ab9285a8354 xen/arch/x86/mm/shadow/multi.c
@@ -562,7 +562,7 @@
      * For HVM domains with direct access to MMIO areas, set the correct
      * caching attributes in the shadows to match what was asked for.
      */
-    if ( (level == 1) && is_hvm_domain(d) && has_arch_pdevs(d) &&
+    if ( (level == 1) && is_hvm_domain(d) &&
          !is_xen_heap_mfn(mfn_x(target_mfn)) )
     {
         unsigned int type;
@@ -578,20 +578,24 @@
             sflags |= pat_type_2_pte_flags(type);
         else if ( d->arch.hvm_domain.is_in_uc_mode )
             sflags |= pat_type_2_pte_flags(PAT_TYPE_UNCACHABLE);
-        else if ( p2mt == p2m_mmio_direct )
-            sflags |= get_pat_flags(v,
-                                    gflags,
-                                    gfn_to_paddr(target_gfn),
-                                    ((paddr_t)mfn_x(target_mfn)) << PAGE_SHIFT,
-                                    MTRR_TYPE_UNCACHABLE); 
-        else if ( iommu_snoop )
-            sflags |= pat_type_2_pte_flags(PAT_TYPE_WRBACK);
-        else
-            sflags |= get_pat_flags(v,
-                                    gflags,
-                                    gfn_to_paddr(target_gfn),
-                                    ((paddr_t)mfn_x(target_mfn)) << PAGE_SHIFT,
-                                    NO_HARDCODE_MEM_TYPE);
+        else
+            if ( has_arch_pdevs(d) )
+            {
+                if ( p2mt == p2m_mmio_direct )
+                    sflags |= get_pat_flags(v,
+                            gflags,
+                            gfn_to_paddr(target_gfn),
+                            ((paddr_t)mfn_x(target_mfn)) << PAGE_SHIFT,
+                            MTRR_TYPE_UNCACHABLE);
+                else if ( iommu_snoop )
+                    sflags |= pat_type_2_pte_flags(PAT_TYPE_WRBACK);
+                else
+                    sflags |= get_pat_flags(v,
+                            gflags,
+                            gfn_to_paddr(target_gfn),
+                            ((paddr_t)mfn_x(target_mfn)) << PAGE_SHIFT,
+                            NO_HARDCODE_MEM_TYPE);
+            }
     }
 
     // Set the A&D bits for higher level shadows.

_______________________________________________
Xen-devel mailing list
[email protected]
http://lists.xensource.com/xen-devel

#1 lore raw
Quoted 8 lines · Jean Guyader

PAT caching was only propagated if has_arch_pdevs(), causing the hvm_get_mem_pinned_cacheattr() to be ignored in the non passthrough case.
l1_disallow_mask() needs to be relaxed.

I forgot to mentioned that this patch is against 3.4-testing. I'll send another patch for unstable.

Jean