If a slot is removed or moved in the guest physical address space, we
first allocate and install a new slot array with the invalidated
entry.  The old array is then freed.  We then proceed to allocate yet
another slot array to install the permanent replacement.  Re-use the
original array when this occurs and avoid the extra kfree/kmalloc.

Signed-off-by: Alex Williamson <alex.william...@redhat.com>
---
 virt/kvm/kvm_main.c |   21 ++++++++++++++-------
 1 file changed, 14 insertions(+), 7 deletions(-)

diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
index 0f66a0e..2a80dac 100644
--- a/virt/kvm/kvm_main.c
+++ b/virt/kvm/kvm_main.c
@@ -711,7 +711,7 @@ int __kvm_set_memory_region(struct kvm *kvm,
        unsigned long npages;
        struct kvm_memory_slot *memslot, *slot;
        struct kvm_memory_slot old, new;
-       struct kvm_memslots *slots, *old_memslots;
+       struct kvm_memslots *slots = NULL, *old_memslots;
 
        r = check_memory_region_flags(mem);
        if (r)
@@ -827,18 +827,25 @@ int __kvm_set_memory_region(struct kvm *kvm,
                 *      - kvm_is_visible_gfn (mmu_check_roots)
                 */
                kvm_arch_flush_shadow_memslot(kvm, slot);
-               kfree(old_memslots);
+               slots = old_memslots;
        }
 
        r = kvm_arch_prepare_memory_region(kvm, &new, old, mem, user_alloc);
        if (r)
-               goto out_free;
+               goto out_slots;
 
        r = -ENOMEM;
-       slots = kmemdup(kvm->memslots, sizeof(struct kvm_memslots),
-                       GFP_KERNEL);
-       if (!slots)
-               goto out_free;
+       /*
+        * We can re-use the old_memslots from above, the only difference
+        * from the currently installed memslots is the invalid flag.  This
+        * will get overwritten by update_memslots anyway.
+        */
+       if (!slots) {
+               slots = kmemdup(kvm->memslots, sizeof(struct kvm_memslots),
+                               GFP_KERNEL);
+               if (!slots)
+                       goto out_free;
+       }
 
        /* map new memory slot into the iommu */
        if (npages) {

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to