|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH v2 6/6] 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>
---
Changes since v1:
- New in this version.
---
Not sure whether this attempt to reduce cache flushing should get some
mention in the CHANGELOG.
---
xen/arch/x86/hvm/mtrr.c | 11 +++++++++--
1 file changed, 9 insertions(+), 2 deletions(-)
diff --git a/xen/arch/x86/hvm/mtrr.c b/xen/arch/x86/hvm/mtrr.c
index 8e1e15af8d73..9a6f6865a05e 100644
--- a/xen/arch/x86/hvm/mtrr.c
+++ b/xen/arch/x86/hvm/mtrr.c
@@ -782,14 +782,21 @@ 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 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);
}
--
2.48.1
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |