aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRusty Russell <rusty@rustcorp.com.au>2007-07-31 05:57:47 -0400
committerAvi Kivity <avi@qumranet.com>2007-10-13 04:18:21 -0400
commit39214915f50f6ac2350355f2db63910d968fa790 (patch)
tree0314e24ba07b5e0f20fa5ef71e82e2481a56b3f7
parentb114b0804df7131cb6764b948c1c530c834fa3c0 (diff)
KVM: kvm_vm_ioctl_get_dirty_log restore "nothing dirty" optimization
kvm_vm_ioctl_get_dirty_log scans bitmap to see it it's all zero, but doesn't use that information. Avi says: Looks like it was used to guard kvm_mmu_slot_remove_write_access(); optimizing the case where the guest just leaves the screen alone (which it usually does, especially in benchmarks). I'd rather reinstate that optimization. See 90cb0529dd230548a7f0d6b315997be854caea1b where the damage was done. It's pretty simple: if the bitmap is all zero, we don't need to do anything to clean it. Signed-off-by: Rusty Russell <rusty@rustcorp.com.au> Signed-off-by: Avi Kivity <avi@qumranet.com>
-rw-r--r--drivers/kvm/kvm_main.c13
1 files changed, 8 insertions, 5 deletions
diff --git a/drivers/kvm/kvm_main.c b/drivers/kvm/kvm_main.c
index bfb1b6de0584..5dee3024579d 100644
--- a/drivers/kvm/kvm_main.c
+++ b/drivers/kvm/kvm_main.c
@@ -803,11 +803,14 @@ static int kvm_vm_ioctl_get_dirty_log(struct kvm *kvm,
803 if (copy_to_user(log->dirty_bitmap, memslot->dirty_bitmap, n)) 803 if (copy_to_user(log->dirty_bitmap, memslot->dirty_bitmap, n))
804 goto out; 804 goto out;
805 805
806 mutex_lock(&kvm->lock); 806 /* If nothing is dirty, don't bother messing with page tables. */
807 kvm_mmu_slot_remove_write_access(kvm, log->slot); 807 if (any) {
808 kvm_flush_remote_tlbs(kvm); 808 mutex_lock(&kvm->lock);
809 memset(memslot->dirty_bitmap, 0, n); 809 kvm_mmu_slot_remove_write_access(kvm, log->slot);
810 mutex_unlock(&kvm->lock); 810 kvm_flush_remote_tlbs(kvm);
811 memset(memslot->dirty_bitmap, 0, n);
812 mutex_unlock(&kvm->lock);
813 }
811 814
812 r = 0; 815 r = 0;
813 816