x86/hvm: limit memory type cache flush to running domains

Avoid the cache flush if the domain is not yet running.  There shouldn't be
any cached data resulting from domain accesses that need flushing, as the
domain hasn't run yet.

There can be data in the caches as a result of Xen and/or toolstack
behavior.  Ideally we would do a cache flush strictly before starting the
domain, however doing so only makes sense once we can guarantee there are
no leftover mappings of the affected ranges with cacheable attributes,
otherwise the CPU can speculatively populate the cache with data from those
ranges.

No change in domain observable behavior intended.

Signed-off-by: Roger Pau Monné <roger.pau@citrix.com>
Reviewed-by: Jan Beulich <jbeulich@suse.com>
This commit is contained in:
Roger Pau Monne committed 2025-05-20 16:35:52 +02:00
1 parent 8333e358e4
commit 3125ca0da2
1 file changed
+7 -1
+7 -1
View File
@@ -783,7 +783,13 @@ 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)) &&
d->vcpu && d->vcpu[0] && p2m_memory_type_changed(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 )
{
flush_all(FLUSH_CACHE);
}
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.