[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[xen master] x86/hvm: reduce the need to flush caches in memory_type_changed()



commit 2d779cabddfa0166f6baae50627a4b370d8f0f19
Author:     Roger Pau Monne <roger.pau@xxxxxxxxxx>
AuthorDate: Thu May 15 15:15:07 2025 +0200
Commit:     Roger Pau Monne <roger.pau@xxxxxxxxxx>
CommitDate: Tue May 20 16:35:52 2025 +0200

    x86/hvm: reduce the need to flush caches in memory_type_changed()
    
    The current cache flushing done in memory_type_changed() is too wide, and
    this doesn't scale on boxes with high number of CPUs.  Attempt to limit
    cache flushes as a result of p2m type changes, and only do them if:
    
     * The CPU doesn't support (or has broken) self-snoop capability, otherwise
       there would be leftover aliases in the cache.  For guest initiated
       memory changes (like changes to MTRRs) the guest should already do a
       cache flush.
     * The IOMMU cannot force all DMA accesses to be snooping ones.
    
    Signed-off-by: Roger Pau Monné <roger.pau@xxxxxxxxxx>
    Reviewed-by: Jan Beulich <jbeulich@xxxxxxxx>
    Acked-By: Oleksii Kurochko <oleksii.kurochko@xxxxxxxxx>
---
 CHANGELOG.md            |  4 ++++
 xen/arch/x86/hvm/mtrr.c | 12 ++++++++++--
 2 files changed, 14 insertions(+), 2 deletions(-)

diff --git a/CHANGELOG.md b/CHANGELOG.md
index 1ea06524db..faf2271011 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -12,6 +12,10 @@ The format is based on [Keep a 
Changelog](https://keepachangelog.com/en/1.0.0/)
    - For ARM32 and ARM64, GCC 5.1 and Binutils 2.25
  - Linux based device model stubdomains are now fully supported.
 
+ - On x86:
+   - Restrict the cache flushing done as a result of guest physical memory map
+     manipulations and memory type changes.
+
 ### Added
  - On x86:
    - Option to attempt to fixup p2m page-faults on PVH dom0.
diff --git a/xen/arch/x86/hvm/mtrr.c b/xen/arch/x86/hvm/mtrr.c
index 8e1e15af8d..4b8afad2c5 100644
--- a/xen/arch/x86/hvm/mtrr.c
+++ b/xen/arch/x86/hvm/mtrr.c
@@ -782,14 +782,22 @@ HVM_REGISTER_SAVE_RESTORE(MTRR, hvm_save_mtrr_msr, NULL, 
hvm_load_mtrr_msr, 1,
 
 void memory_type_changed(struct domain *d)
 {
-    if ( (is_iommu_enabled(d) || cache_flush_permitted(d)) &&
+    if ( cache_flush_permitted(d) &&
          d->vcpu && d->vcpu[0] && p2m_memory_type_changed(d) &&
          /*
           * Do the p2m type-change, but skip the cache flush if the domain is
           * not yet running.  The check for creation_finished must strictly be
           * done after the call to p2m_memory_type_changed().
           */
-         d->creation_finished )
+         d->creation_finished &&
+         /*
+          * The cache flush should be done if either: CPU doesn't have
+          * self-snoop in which case there could be aliases left in the cache,
+          * or (some) IOMMUs cannot force all DMA device accesses to be
+          * snooped.
+          */
+         (!boot_cpu_has(X86_FEATURE_XEN_SELFSNOOP) ||
+          (is_iommu_enabled(d) && !iommu_snoop)) )
     {
         flush_all(FLUSH_CACHE);
     }
--
generated by git-patchbot for /home/xen/git/xen.git#master



 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.