KVM: introduce update_memslots function
authorXiao Guangrong <xiaoguangrong@linux.vnet.ibm.com>
Thu, 24 Nov 2011 09:38:24 +0000 (17:38 +0800)
committerAvi Kivity <avi@redhat.com>
Tue, 27 Dec 2011 09:17:35 +0000 (11:17 +0200)
Introduce update_memslots to update slot which will be update to
kvm->memslots

Signed-off-by: Xiao Guangrong <xiaoguangrong@linux.vnet.ibm.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
arch/x86/kvm/x86.c
include/linux/kvm_host.h
virt/kvm/kvm_main.c

index af546b768ffd3bebfeeef05d51365c2dce1810d5..917a287d21c8117ebdd377d0961b61f8186de090 100644 (file)
@@ -3546,7 +3546,7 @@ int kvm_vm_ioctl_get_dirty_log(struct kvm *kvm,
                memslot = &slots->memslots[log->slot];
                memslot->dirty_bitmap = dirty_bitmap;
                memslot->nr_dirty_pages = 0;
-               slots->generation++;
+               update_memslots(slots, NULL);
 
                old_slots = kvm->memslots;
                rcu_assign_pointer(kvm->memslots, slots);
index 924df0d7ac5f5036a357e148922d6bf684d3bbc7..23f795c66220a1d8953309a15676ec3b1b922f8c 100644 (file)
@@ -320,6 +320,7 @@ void kvm_exit(void);
 
 void kvm_get_kvm(struct kvm *kvm);
 void kvm_put_kvm(struct kvm *kvm);
+void update_memslots(struct kvm_memslots *slots, struct kvm_memory_slot *new);
 
 static inline struct kvm_memslots *kvm_memslots(struct kvm *kvm)
 {
index 9ad94c9996e752f6d2161a4f9330e49b159e7836..b5ed7770ced3c8664e447a1590bfb80c2ef708e1 100644 (file)
@@ -630,6 +630,19 @@ static int kvm_create_dirty_bitmap(struct kvm_memory_slot *memslot)
 }
 #endif /* !CONFIG_S390 */
 
+void update_memslots(struct kvm_memslots *slots, struct kvm_memory_slot *new)
+{
+       if (new) {
+               int id = new->id;
+
+               slots->memslots[id] = *new;
+               if (id >= slots->nmemslots)
+                       slots->nmemslots = id + 1;
+       }
+
+       slots->generation++;
+}
+
 /*
  * Allocate some memory and give it an address in the guest physical address
  * space.
@@ -780,10 +793,8 @@ skip_lpage:
                                GFP_KERNEL);
                if (!slots)
                        goto out_free;
-               if (mem->slot >= slots->nmemslots)
-                       slots->nmemslots = mem->slot + 1;
-               slots->generation++;
                slots->memslots[mem->slot].flags |= KVM_MEMSLOT_INVALID;
+               update_memslots(slots, NULL);
 
                old_memslots = kvm->memslots;
                rcu_assign_pointer(kvm->memslots, slots);
@@ -815,9 +826,6 @@ skip_lpage:
                        GFP_KERNEL);
        if (!slots)
                goto out_free;
-       if (mem->slot >= slots->nmemslots)
-               slots->nmemslots = mem->slot + 1;
-       slots->generation++;
 
        /* actual memory is freed via old in kvm_free_physmem_slot below */
        if (!npages) {
@@ -827,7 +835,7 @@ skip_lpage:
                        new.lpage_info[i] = NULL;
        }
 
-       slots->memslots[mem->slot] = new;
+       update_memslots(slots, &new);
        old_memslots = kvm->memslots;
        rcu_assign_pointer(kvm->memslots, slots);
        synchronize_srcu_expedited(&kvm->srcu);