On 11/9/2023 6:37 PM, Jacky Li wrote:
The cache flush was originally introduced to enforce the cache coherency
across VM boundary in SEV, so the flush is not needed in some cases when
the page remains in the same VM. wbinvd_on_all_cpus() is a costly
operation so use the mmu notifier event type information in the range
struct to only do cache flush when needed.
The physical page might be allocated to a different VM after the range
is unmapped, cleared, released or migrated. So do a cache flush only on
those events.
Signed-off-by: Jacky Li <jackyli@xxxxxxxxxx>
Signed-off-by: Mingwei Zhang <mizhang@xxxxxxxxxx>
Suggested-by: Sean Christpherson <seanjc@xxxxxxxxxx>
---
arch/x86/kvm/svm/sev.c | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/arch/x86/kvm/svm/sev.c b/arch/x86/kvm/svm/sev.c
index 8d30f6c5e872..477df8a06629 100644
--- a/arch/x86/kvm/svm/sev.c
+++ b/arch/x86/kvm/svm/sev.c
@@ -2335,7 +2335,11 @@ void sev_guest_memory_reclaimed(struct kvm *kvm,
if (!sev_guest(kvm))
return;
- wbinvd_on_all_cpus();
+ if (mmu_notifier_event == MMU_NOTIFY_UNMAP ||
+ mmu_notifier_event == MMU_NOTIFY_CLEAR ||
When i looked at MMU notifier event filtering and the various code paths
(of interest) from where the MMU invalidation notifier gets invoked:
For NUMA load balancing during #PF fault handling, try_to_migrate_one()
does MMU invalidation notifier invocation with MMU_NOTIFY_CLEAR event
and then looking at KSM code paths, try_to_merge_one_page() ->
write_protect_page() and try_to_merge_one_page() -> replace_page() does
MMU invalidation notifier invocations also with MMU_NOTIFY_CLEAR event.
Now, i remember from previous discussions, that the CLEAR event is an
overloaded event used for page zapping, madvise, etc., so i don't think
we will be able to filter *out* this event and if this is the case then
i have concerns about this whole patch-series as this event is
triggering most of the performance issues we are observing.
Thanks,
Ashish
+ mmu_notifier_event == MMU_NOTIFY_RELEASE ||
+ mmu_notifier_event == MMU_NOTIFY_MIGRATE)
+ wbinvd_on_all_cpus();
}
void sev_free_vcpu(struct kvm_vcpu *vcpu)