diff options
Diffstat (limited to 'virt/kvm')
-rw-r--r-- | virt/kvm/kvm_main.c | 11 |
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 | */ | ||
540 | static int kvm_create_dirty_bitmap(struct kvm_memory_slot *memslot) | 546 | static 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 | ||