aboutsummaryrefslogtreecommitdiffstats
path: root/virt/kvm
diff options
context:
space:
mode:
Diffstat (limited to 'virt/kvm')
-rw-r--r--virt/kvm/kvm_main.c11
1 files changed, 9 insertions, 2 deletions
diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
index 0021c2862140..27649fdaa007 100644
--- a/virt/kvm/kvm_main.c
+++ b/virt/kvm/kvm_main.c
@@ -449,8 +449,9 @@ static void kvm_destroy_dirty_bitmap(struct kvm_memory_slot *memslot)
449 if (!memslot->dirty_bitmap) 449 if (!memslot->dirty_bitmap)
450 return; 450 return;
451 451
452 vfree(memslot->dirty_bitmap); 452 vfree(memslot->dirty_bitmap_head);
453 memslot->dirty_bitmap = NULL; 453 memslot->dirty_bitmap = NULL;
454 memslot->dirty_bitmap_head = NULL;
454} 455}
455 456
456/* 457/*
@@ -537,15 +538,21 @@ static int kvm_vm_release(struct inode *inode, struct file *filp)
537 return 0; 538 return 0;
538} 539}
539 540
541/*
542 * Allocation size is twice as large as the actual dirty bitmap size.
543 * This makes it possible to do double buffering: see x86's
544 * kvm_vm_ioctl_get_dirty_log().
545 */
540static int kvm_create_dirty_bitmap(struct kvm_memory_slot *memslot) 546static int kvm_create_dirty_bitmap(struct kvm_memory_slot *memslot)
541{ 547{
542 unsigned long dirty_bytes = kvm_dirty_bitmap_bytes(memslot); 548 unsigned long dirty_bytes = 2 * kvm_dirty_bitmap_bytes(memslot);
543 549
544 memslot->dirty_bitmap = vmalloc(dirty_bytes); 550 memslot->dirty_bitmap = vmalloc(dirty_bytes);
545 if (!memslot->dirty_bitmap) 551 if (!memslot->dirty_bitmap)
546 return -ENOMEM; 552 return -ENOMEM;
547 553
548 memset(memslot->dirty_bitmap, 0, dirty_bytes); 554 memset(memslot->dirty_bitmap, 0, dirty_bytes);
555 memslot->dirty_bitmap_head = memslot->dirty_bitmap;
549 return 0; 556 return 0;
550} 557}
551 558