| From 5419369ed6bd4cf711fdda5e52a5999b940413f5 Mon Sep 17 00:00:00 2001 |
| From: Alex Williamson <alex.williamson@redhat.com> |
| Date: Thu, 29 Nov 2012 14:07:59 -0700 |
| Subject: KVM: Fix user memslot overlap check |
| |
| From: Alex Williamson <alex.williamson@redhat.com> |
| |
| commit 5419369ed6bd4cf711fdda5e52a5999b940413f5 upstream. |
| |
| Prior to memory slot sorting this loop compared all of the user memory |
| slots for overlap with new entries. With memory slot sorting, we're |
| just checking some number of entries in the array that may or may not |
| be user slots. Instead, walk all the slots with kvm_for_each_memslot, |
| which has the added benefit of terminating early when we hit the first |
| empty slot, and skip comparison to private slots. |
| |
| Signed-off-by: Alex Williamson <alex.williamson@redhat.com> |
| Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| virt/kvm/kvm_main.c | 13 +++++-------- |
| 1 file changed, 5 insertions(+), 8 deletions(-) |
| |
| --- a/virt/kvm/kvm_main.c |
| +++ b/virt/kvm/kvm_main.c |
| @@ -709,8 +709,7 @@ int __kvm_set_memory_region(struct kvm * |
| int r; |
| gfn_t base_gfn; |
| unsigned long npages; |
| - unsigned long i; |
| - struct kvm_memory_slot *memslot; |
| + struct kvm_memory_slot *memslot, *slot; |
| struct kvm_memory_slot old, new; |
| struct kvm_memslots *slots, *old_memslots; |
| |
| @@ -761,13 +760,11 @@ int __kvm_set_memory_region(struct kvm * |
| |
| /* Check for overlaps */ |
| r = -EEXIST; |
| - for (i = 0; i < KVM_MEMORY_SLOTS; ++i) { |
| - struct kvm_memory_slot *s = &kvm->memslots->memslots[i]; |
| - |
| - if (s == memslot || !s->npages) |
| + kvm_for_each_memslot(slot, kvm->memslots) { |
| + if (slot->id >= KVM_MEMORY_SLOTS || slot == memslot) |
| continue; |
| - if (!((base_gfn + npages <= s->base_gfn) || |
| - (base_gfn >= s->base_gfn + s->npages))) |
| + if (!((base_gfn + npages <= slot->base_gfn) || |
| + (base_gfn >= slot->base_gfn + slot->npages))) |
| goto out_free; |
| } |
| |