aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSean Christopherson <seanjc@google.com>2021-06-23 12:49:19 -0400
committerPaolo Bonzini <pbonzini@redhat.com>2021-06-24 18:00:37 -0400
commit07dc4f35a44c8f85ba7262b56b70c3fcbc3b74fd (patch)
tree0fa0c309956294d85545dbe2ac6bf861d339679d
parentKVM: x86/mmu: WARN and zap SP when sync'ing if MMU role mismatches (diff)
downloadlinux-dev-07dc4f35a44c8f85ba7262b56b70c3fcbc3b74fd.tar.xz
linux-dev-07dc4f35a44c8f85ba7262b56b70c3fcbc3b74fd.zip
KVM: x86/mmu: comment on kvm_mmu_get_page's syncing of pages
Explain the usage of sync_page() in kvm_mmu_get_page(), which is subtle in how and why it differs from mmu_sync_children(). Signed-off-by: Sean Christopherson <seanjc@google.com> [Split out of a different patch by Sean. - Paolo] Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
-rw-r--r--arch/x86/kvm/mmu/mmu.c13
1 files changed, 11 insertions, 2 deletions
diff --git a/arch/x86/kvm/mmu/mmu.c b/arch/x86/kvm/mmu/mmu.c
index e4415e739807..726e5b171543 100644
--- a/arch/x86/kvm/mmu/mmu.c
+++ b/arch/x86/kvm/mmu/mmu.c
@@ -2008,8 +2008,17 @@ static struct kvm_mmu_page *kvm_mmu_get_page(struct kvm_vcpu *vcpu,
goto trace_get_page;
if (sp->unsync) {
- /* The page is good, but __kvm_sync_page might still end
- * up zapping it. If so, break in order to rebuild it.
+ /*
+ * The page is good, but is stale. __kvm_sync_page does
+ * get the latest guest state, but (unlike mmu_unsync_children)
+ * it doesn't write-protect the page or mark it synchronized!
+ * This way the validity of the mapping is ensured, but the
+ * overhead of write protection is not incurred until the
+ * guest invalidates the TLB mapping. This allows multiple
+ * SPs for a single gfn to be unsync.
+ *
+ * If the sync fails, the page is zapped. If so, break
+ * in order to rebuild it.
*/
if (!__kvm_sync_page(vcpu, sp, &invalid_list))
break;