aboutsummaryrefslogtreecommitdiffstats
path: root/virt/kvm/kvm_main.c
diff options
context:
space:
mode:
Diffstat (limited to 'virt/kvm/kvm_main.c')
-rw-r--r--virt/kvm/kvm_main.c11
1 files changed, 5 insertions, 6 deletions
diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
index 605697e9c4dd..1ecbe2391c8b 100644
--- a/virt/kvm/kvm_main.c
+++ b/virt/kvm/kvm_main.c
@@ -920,6 +920,7 @@ int __kvm_set_memory_region(struct kvm *kvm,
920 int r; 920 int r;
921 gfn_t base_gfn; 921 gfn_t base_gfn;
922 unsigned long npages; 922 unsigned long npages;
923 int largepages;
923 unsigned long i; 924 unsigned long i;
924 struct kvm_memory_slot *memslot; 925 struct kvm_memory_slot *memslot;
925 struct kvm_memory_slot old, new; 926 struct kvm_memory_slot old, new;
@@ -960,7 +961,7 @@ int __kvm_set_memory_region(struct kvm *kvm,
960 for (i = 0; i < KVM_MEMORY_SLOTS; ++i) { 961 for (i = 0; i < KVM_MEMORY_SLOTS; ++i) {
961 struct kvm_memory_slot *s = &kvm->memslots[i]; 962 struct kvm_memory_slot *s = &kvm->memslots[i];
962 963
963 if (s == memslot) 964 if (s == memslot || !s->npages)
964 continue; 965 continue;
965 if (!((base_gfn + npages <= s->base_gfn) || 966 if (!((base_gfn + npages <= s->base_gfn) ||
966 (base_gfn >= s->base_gfn + s->npages))) 967 (base_gfn >= s->base_gfn + s->npages)))
@@ -995,11 +996,8 @@ int __kvm_set_memory_region(struct kvm *kvm,
995 new.userspace_addr = 0; 996 new.userspace_addr = 0;
996 } 997 }
997 if (npages && !new.lpage_info) { 998 if (npages && !new.lpage_info) {
998 int largepages = npages / KVM_PAGES_PER_HPAGE; 999 largepages = 1 + (base_gfn + npages - 1) / KVM_PAGES_PER_HPAGE;
999 if (npages % KVM_PAGES_PER_HPAGE) 1000 largepages -= base_gfn / KVM_PAGES_PER_HPAGE;
1000 largepages++;
1001 if (base_gfn % KVM_PAGES_PER_HPAGE)
1002 largepages++;
1003 1001
1004 new.lpage_info = vmalloc(largepages * sizeof(*new.lpage_info)); 1002 new.lpage_info = vmalloc(largepages * sizeof(*new.lpage_info));
1005 1003
@@ -1985,6 +1983,7 @@ static long kvm_dev_ioctl_check_extension_generic(long arg)
1985 switch (arg) { 1983 switch (arg) {
1986 case KVM_CAP_USER_MEMORY: 1984 case KVM_CAP_USER_MEMORY:
1987 case KVM_CAP_DESTROY_MEMORY_REGION_WORKS: 1985 case KVM_CAP_DESTROY_MEMORY_REGION_WORKS:
1986 case KVM_CAP_JOIN_MEMORY_REGIONS_WORKS:
1988 return 1; 1987 return 1;
1989#ifdef CONFIG_HAVE_KVM_IRQCHIP 1988#ifdef CONFIG_HAVE_KVM_IRQCHIP
1990 case KVM_CAP_IRQ_ROUTING: 1989 case KVM_CAP_IRQ_ROUTING: