diff options
| -rw-r--r-- | virt/kvm/kvm_main.c | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c index 27649fdaa007..9ce1079e8f89 100644 --- a/virt/kvm/kvm_main.c +++ b/virt/kvm/kvm_main.c | |||
| @@ -449,7 +449,11 @@ 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_head); | 452 | if (2 * kvm_dirty_bitmap_bytes(memslot) > PAGE_SIZE) |
| 453 | vfree(memslot->dirty_bitmap_head); | ||
| 454 | else | ||
| 455 | kfree(memslot->dirty_bitmap_head); | ||
| 456 | |||
| 453 | memslot->dirty_bitmap = NULL; | 457 | memslot->dirty_bitmap = NULL; |
| 454 | memslot->dirty_bitmap_head = NULL; | 458 | memslot->dirty_bitmap_head = NULL; |
| 455 | } | 459 | } |
| @@ -547,11 +551,14 @@ static int kvm_create_dirty_bitmap(struct kvm_memory_slot *memslot) | |||
| 547 | { | 551 | { |
| 548 | unsigned long dirty_bytes = 2 * kvm_dirty_bitmap_bytes(memslot); | 552 | unsigned long dirty_bytes = 2 * kvm_dirty_bitmap_bytes(memslot); |
| 549 | 553 | ||
| 550 | memslot->dirty_bitmap = vmalloc(dirty_bytes); | 554 | if (dirty_bytes > PAGE_SIZE) |
| 555 | memslot->dirty_bitmap = vzalloc(dirty_bytes); | ||
| 556 | else | ||
| 557 | memslot->dirty_bitmap = kzalloc(dirty_bytes, GFP_KERNEL); | ||
| 558 | |||
| 551 | if (!memslot->dirty_bitmap) | 559 | if (!memslot->dirty_bitmap) |
| 552 | return -ENOMEM; | 560 | return -ENOMEM; |
| 553 | 561 | ||
| 554 | memset(memslot->dirty_bitmap, 0, dirty_bytes); | ||
| 555 | memslot->dirty_bitmap_head = memslot->dirty_bitmap; | 562 | memslot->dirty_bitmap_head = memslot->dirty_bitmap; |
| 556 | return 0; | 563 | return 0; |
| 557 | } | 564 | } |
