Skip to content

Commit

Permalink
KVM: Separate out dirty_bitmap allocation code as kvm_kvzalloc()
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Takuya Yoshikawa authored and Avi Kivity committed Jun 5, 2012
1 parent 99becf1 commit 92eca8f
Showing 1 changed file with 22 additions and 10 deletions.
32 changes: 22 additions & 10 deletions virt/kvm/kvm_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -516,16 +516,32 @@ static struct kvm *kvm_create_vm(unsigned long type)
return ERR_PTR(r);
}

/*
* Avoid using vmalloc for a small buffer.
* Should not be used when the size is statically known.
*/
static void *kvm_kvzalloc(unsigned long size)
{
if (size > PAGE_SIZE)
return vzalloc(size);
else
return kzalloc(size, GFP_KERNEL);
}

static void kvm_kvfree(const void *addr)
{
if (is_vmalloc_addr(addr))
vfree(addr);
else
kfree(addr);
}

static void kvm_destroy_dirty_bitmap(struct kvm_memory_slot *memslot)
{
if (!memslot->dirty_bitmap)
return;

if (2 * kvm_dirty_bitmap_bytes(memslot) > PAGE_SIZE)
vfree(memslot->dirty_bitmap);
else
kfree(memslot->dirty_bitmap);

kvm_kvfree(memslot->dirty_bitmap);
memslot->dirty_bitmap = NULL;
}

Expand Down Expand Up @@ -617,11 +633,7 @@ static int kvm_create_dirty_bitmap(struct kvm_memory_slot *memslot)
#ifndef CONFIG_S390
unsigned long dirty_bytes = 2 * kvm_dirty_bitmap_bytes(memslot);

if (dirty_bytes > PAGE_SIZE)
memslot->dirty_bitmap = vzalloc(dirty_bytes);
else
memslot->dirty_bitmap = kzalloc(dirty_bytes, GFP_KERNEL);

memslot->dirty_bitmap = kvm_kvzalloc(dirty_bytes);
if (!memslot->dirty_bitmap)
return -ENOMEM;

Expand Down

0 comments on commit 92eca8f

Please sign in to comment.