aboutsummaryrefslogtreecommitdiffstats
path: root/virt
diff options
context:
space:
mode:
authorTakuya Yoshikawa <yoshikawa.takuya@oss.ntt.co.jp>2012-05-20 00:15:07 -0400
committerAvi Kivity <avi@redhat.com>2012-06-05 09:29:49 -0400
commitc1a7b32a14138f908df52d7c53b5ce3415ec6b50 (patch)
tree6f61d847e217212de98c8bdc9563ef09e25019e1 /virt
parent92eca8faad2d1b136c939bc122842dcdabd6ff46 (diff)
KVM: Avoid wasting pages for small lpage_info arrays
lpage_info is created for each large level even when the memory slot is not for RAM. This means that when we add one slot for a PCI device, we end up allocating at least KVM_NR_PAGE_SIZES - 1 pages by vmalloc(). To make things worse, there is an increasing number of devices which would result in more pages being wasted this way. This patch mitigates this problem by using kvm_kvzalloc(). Signed-off-by: Takuya Yoshikawa <yoshikawa.takuya@oss.ntt.co.jp> Signed-off-by: Avi Kivity <avi@redhat.com>
Diffstat (limited to 'virt')
-rw-r--r--virt/kvm/kvm_main.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
index 1148c96a4817..02cb440f802d 100644
--- a/virt/kvm/kvm_main.c
+++ b/virt/kvm/kvm_main.c
@@ -520,7 +520,7 @@ out_err_nodisable:
520 * Avoid using vmalloc for a small buffer. 520 * Avoid using vmalloc for a small buffer.
521 * Should not be used when the size is statically known. 521 * Should not be used when the size is statically known.
522 */ 522 */
523static void *kvm_kvzalloc(unsigned long size) 523void *kvm_kvzalloc(unsigned long size)
524{ 524{
525 if (size > PAGE_SIZE) 525 if (size > PAGE_SIZE)
526 return vzalloc(size); 526 return vzalloc(size);
@@ -528,7 +528,7 @@ static void *kvm_kvzalloc(unsigned long size)
528 return kzalloc(size, GFP_KERNEL); 528 return kzalloc(size, GFP_KERNEL);
529} 529}
530 530
531static void kvm_kvfree(const void *addr) 531void kvm_kvfree(const void *addr)
532{ 532{
533 if (is_vmalloc_addr(addr)) 533 if (is_vmalloc_addr(addr))
534 vfree(addr); 534 vfree(addr);