aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTakuya Yoshikawa <yoshikawa.takuya@oss.ntt.co.jp>2012-05-20 00:13:28 -0400
committerAvi Kivity <avi@redhat.com>2012-06-05 09:29:39 -0400
commit92eca8faad2d1b136c939bc122842dcdabd6ff46 (patch)
treee7ee10a4a8eadea746fc8b9fdc53253cb1cdc42d
parent99becf1328d8d71dd6f4480e3591d7dcdb389e57 (diff)
KVM: Separate out dirty_bitmap allocation code as kvm_kvzalloc()
Will be used for lpage_info allocation later. Signed-off-by: Takuya Yoshikawa <yoshikawa.takuya@oss.ntt.co.jp> Signed-off-by: Avi Kivity <avi@redhat.com>
-rw-r--r--virt/kvm/kvm_main.c32
1 files changed, 22 insertions, 10 deletions
diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
index 7e140683ff14..1148c96a4817 100644
--- a/virt/kvm/kvm_main.c
+++ b/virt/kvm/kvm_main.c
@@ -516,16 +516,32 @@ out_err_nodisable:
516 return ERR_PTR(r); 516 return ERR_PTR(r);
517} 517}
518 518
519/*
520 * Avoid using vmalloc for a small buffer.
521 * Should not be used when the size is statically known.
522 */
523static void *kvm_kvzalloc(unsigned long size)
524{
525 if (size > PAGE_SIZE)
526 return vzalloc(size);
527 else
528 return kzalloc(size, GFP_KERNEL);
529}
530
531static void kvm_kvfree(const void *addr)
532{
533 if (is_vmalloc_addr(addr))
534 vfree(addr);
535 else
536 kfree(addr);
537}
538
519static void kvm_destroy_dirty_bitmap(struct kvm_memory_slot *memslot) 539static void kvm_destroy_dirty_bitmap(struct kvm_memory_slot *memslot)
520{ 540{
521 if (!memslot->dirty_bitmap) 541 if (!memslot->dirty_bitmap)
522 return; 542 return;
523 543
524 if (2 * kvm_dirty_bitmap_bytes(memslot) > PAGE_SIZE) 544 kvm_kvfree(memslot->dirty_bitmap);
525 vfree(memslot->dirty_bitmap);
526 else
527 kfree(memslot->dirty_bitmap);
528
529 memslot->dirty_bitmap = NULL; 545 memslot->dirty_bitmap = NULL;
530} 546}
531 547
@@ -617,11 +633,7 @@ static int kvm_create_dirty_bitmap(struct kvm_memory_slot *memslot)
617#ifndef CONFIG_S390 633#ifndef CONFIG_S390
618 unsigned long dirty_bytes = 2 * kvm_dirty_bitmap_bytes(memslot); 634 unsigned long dirty_bytes = 2 * kvm_dirty_bitmap_bytes(memslot);
619 635
620 if (dirty_bytes > PAGE_SIZE) 636 memslot->dirty_bitmap = kvm_kvzalloc(dirty_bytes);
621 memslot->dirty_bitmap = vzalloc(dirty_bytes);
622 else
623 memslot->dirty_bitmap = kzalloc(dirty_bytes, GFP_KERNEL);
624
625 if (!memslot->dirty_bitmap) 637 if (!memslot->dirty_bitmap)
626 return -ENOMEM; 638 return -ENOMEM;
627 639