diff options
author | 2021-06-23 12:49:19 -0400 | |
---|---|---|
committer | 2021-06-24 18:00:37 -0400 | |
commit | 07dc4f35a44c8f85ba7262b56b70c3fcbc3b74fd (patch) | |
tree | 0fa0c309956294d85545dbe2ac6bf861d339679d | |
parent | KVM: x86/mmu: WARN and zap SP when sync'ing if MMU role mismatches (diff) | |
download | linux-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.c | 13 |
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; |