Skip to content

Commit

Permalink
KVM: use kmalloc() for small dirty bitmaps
Browse files Browse the repository at this point in the history
Currently we are using vmalloc() for all dirty bitmaps even if
they are small enough, say less than K bytes.

We use kmalloc() if dirty bitmap size is less than or equal to
PAGE_SIZE so that we can avoid vmalloc area usage for VGA.

This will also make the logging start/stop faster.

Signed-off-by: Takuya Yoshikawa <[email protected]>
Signed-off-by: Marcelo Tosatti <[email protected]>
  • Loading branch information
Takuya Yoshikawa authored and avikivity committed Jan 12, 2011
1 parent 515a012 commit 6f9e5c1
Showing 1 changed file with 10 additions and 3 deletions.
13 changes: 10 additions & 3 deletions virt/kvm/kvm_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -449,7 +449,11 @@ static void kvm_destroy_dirty_bitmap(struct kvm_memory_slot *memslot)
if (!memslot->dirty_bitmap)
return;

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

memslot->dirty_bitmap = NULL;
memslot->dirty_bitmap_head = NULL;
}
Expand Down Expand Up @@ -547,11 +551,14 @@ static int kvm_create_dirty_bitmap(struct kvm_memory_slot *memslot)
{
unsigned long dirty_bytes = 2 * kvm_dirty_bitmap_bytes(memslot);

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

if (!memslot->dirty_bitmap)
return -ENOMEM;

memset(memslot->dirty_bitmap, 0, dirty_bytes);
memslot->dirty_bitmap_head = memslot->dirty_bitmap;
return 0;
}
Expand Down

0 comments on commit 6f9e5c1

Please sign in to comment.