Commit c972f3b125d8818748429b94cd2e59f473943a33
Committed by
Gleb Natapov
1 parent
aa11e3a8a6
Exists in
smarc-l5.0.0_1.0.0-ga
and in
5 other branches
KVM: Write protect the updated slot only when dirty logging is enabled
Calling kvm_mmu_slot_remove_write_access() for a deleted slot does nothing but search for non-existent mmu pages which have mappings to that deleted memory; this is safe but a waste of time. Since we want to make the function rmap based in a later patch, in a manner which makes it unsafe to be called for a deleted slot, we makes the caller see if the slot is non-zero and being dirty logged. Reviewed-by: Marcelo Tosatti <mtosatti@redhat.com> Signed-off-by: Takuya Yoshikawa <yoshikawa_takuya_b1@lab.ntt.co.jp> Signed-off-by: Gleb Natapov <gleb@redhat.com>
Showing 2 changed files with 7 additions and 2 deletions Side-by-side Diff
arch/x86/kvm/x86.c
... | ... | @@ -6897,7 +6897,13 @@ |
6897 | 6897 | spin_lock(&kvm->mmu_lock); |
6898 | 6898 | if (nr_mmu_pages) |
6899 | 6899 | kvm_mmu_change_mmu_pages(kvm, nr_mmu_pages); |
6900 | - kvm_mmu_slot_remove_write_access(kvm, mem->slot); | |
6900 | + /* | |
6901 | + * Write protect all pages for dirty logging. | |
6902 | + * Existing largepage mappings are destroyed here and new ones will | |
6903 | + * not be created until the end of the logging. | |
6904 | + */ | |
6905 | + if (npages && (mem->flags & KVM_MEM_LOG_DIRTY_PAGES)) | |
6906 | + kvm_mmu_slot_remove_write_access(kvm, mem->slot); | |
6901 | 6907 | spin_unlock(&kvm->mmu_lock); |
6902 | 6908 | /* |
6903 | 6909 | * If memory slot is created, or moved, we need to clear all |
virt/kvm/kvm_main.c
... | ... | @@ -817,7 +817,6 @@ |
817 | 817 | if ((new.flags & KVM_MEM_LOG_DIRTY_PAGES) && !new.dirty_bitmap) { |
818 | 818 | if (kvm_create_dirty_bitmap(&new) < 0) |
819 | 819 | goto out_free; |
820 | - /* destroy any largepage mappings for dirty tracking */ | |
821 | 820 | } |
822 | 821 | |
823 | 822 | if (!npages || base_gfn != old.base_gfn) { |