KVM: pre-allocate one more dirty bitmap to avoid vmalloc()
authorTakuya Yoshikawa <yoshikawa.takuya@oss.ntt.co.jp>
Wed, 27 Oct 2010 09:23:54 +0000 (18:23 +0900)
committerAvi Kivity <avi@redhat.com>
Wed, 12 Jan 2011 09:28:46 +0000 (11:28 +0200)
commit515a01279a187415322a80736800a7d6325876ab
tree8690a1b26013cb385b9d143c83301bdab758dd48
parenta36a57b1a19bce17b67f5c6f43460baf664ae5fa
KVM: pre-allocate one more dirty bitmap to avoid vmalloc()

Currently x86's kvm_vm_ioctl_get_dirty_log() needs to allocate a bitmap by
vmalloc() which will be used in the next logging and this has been causing
bad effect to VGA and live-migration: vmalloc() consumes extra systime,
triggers tlb flush, etc.

This patch resolves this issue by pre-allocating one more bitmap and switching
between two bitmaps during dirty logging.

Performance improvement:
  I measured performance for the case of VGA update by trace-cmd.
  The result was 1.5 times faster than the original one.

  In the case of live migration, the improvement ratio depends on the workload
  and the guest memory size. In general, the larger the memory size is the more
  benefits we get.

Note:
  This does not change other architectures's logic but the allocation size
  becomes twice. This will increase the actual memory consumption only when
  the new size changes the number of pages allocated by vmalloc().

Signed-off-by: Takuya Yoshikawa <yoshikawa.takuya@oss.ntt.co.jp>
Signed-off-by: Fernando Luis Vazquez Cao <fernando@oss.ntt.co.jp>
Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
arch/x86/kvm/x86.c
include/linux/kvm_host.h
virt/kvm/kvm_main.c