Commit c972f3b125d8818748429b94cd2e59f473943a33

Authored by Takuya Yoshikawa
Committed by Gleb Natapov
1 parent aa11e3a8a6

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

... ... @@ -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
... ... @@ -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) {