KVM: add "new" argument to kvm_arch_commit_memory_region
authorPaolo Bonzini <pbonzini@redhat.com>
Mon, 18 May 2015 11:20:23 +0000 (13:20 +0200)
committerPaolo Bonzini <pbonzini@redhat.com>
Thu, 28 May 2015 08:42:58 +0000 (10:42 +0200)
This lets the function access the new memory slot without going through
kvm_memslots and id_to_memslot.  It will simplify the code when more
than one address space will be supported.

Unfortunately, the "const"ness of the new argument must be casted
away in two places.  Fixing KVM to accept const struct kvm_memory_slot
pointers would require modifications in pretty much all architectures,
and is left for later.

Reviewed-by: Radim Krcmar <rkrcmar@redhat.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
14 files changed:
arch/arm/kvm/mmu.c
arch/mips/kvm/mips.c
arch/powerpc/include/asm/kvm_ppc.h
arch/powerpc/kvm/book3s.c
arch/powerpc/kvm/book3s_hv.c
arch/powerpc/kvm/book3s_pr.c
arch/powerpc/kvm/booke.c
arch/powerpc/kvm/powerpc.c
arch/s390/kvm/kvm-s390.c
arch/x86/include/asm/kvm_host.h
arch/x86/kvm/mmu.c
arch/x86/kvm/x86.c
include/linux/kvm_host.h
virt/kvm/kvm_main.c

index e9ac084d21ea9d091236fa2272f3ac4cf2669166..7f473e6d3bf56f5293c84bf91b5c8a1cd219728d 100644 (file)
@@ -1721,6 +1721,7 @@ out:
 void kvm_arch_commit_memory_region(struct kvm *kvm,
                                   const struct kvm_userspace_memory_region *mem,
                                   const struct kvm_memory_slot *old,
+                                  const struct kvm_memory_slot *new,
                                   enum kvm_mr_change change)
 {
        /*
index 5963e2e8a6d7aa5e60addc7bb95d618a259cd0f1..cd4c129ce7434d60fc6af74bb6b764b536de4dda 100644 (file)
@@ -207,6 +207,7 @@ int kvm_arch_prepare_memory_region(struct kvm *kvm,
 void kvm_arch_commit_memory_region(struct kvm *kvm,
                                   const struct kvm_userspace_memory_region *mem,
                                   const struct kvm_memory_slot *old,
+                                  const struct kvm_memory_slot *new,
                                   enum kvm_mr_change change)
 {
        unsigned long npages = 0;
index aff563b5f0013e1547de0a2ddac5df05f4ab1477..c6ef05bd0765dd17fe77af03b1a736a671ffc2c9 100644 (file)
@@ -185,7 +185,8 @@ extern int kvmppc_core_prepare_memory_region(struct kvm *kvm,
                                const struct kvm_userspace_memory_region *mem);
 extern void kvmppc_core_commit_memory_region(struct kvm *kvm,
                                const struct kvm_userspace_memory_region *mem,
-                               const struct kvm_memory_slot *old);
+                               const struct kvm_memory_slot *old,
+                               const struct kvm_memory_slot *new);
 extern int kvm_vm_ioctl_get_smmu_info(struct kvm *kvm,
                                      struct kvm_ppc_smmu_info *info);
 extern void kvmppc_core_flush_memslot(struct kvm *kvm,
@@ -246,7 +247,8 @@ struct kvmppc_ops {
                                     const struct kvm_userspace_memory_region *mem);
        void (*commit_memory_region)(struct kvm *kvm,
                                     const struct kvm_userspace_memory_region *mem,
-                                    const struct kvm_memory_slot *old);
+                                    const struct kvm_memory_slot *old,
+                                    const struct kvm_memory_slot *new);
        int (*unmap_hva)(struct kvm *kvm, unsigned long hva);
        int (*unmap_hva_range)(struct kvm *kvm, unsigned long start,
                           unsigned long end);
index 60aa0726dcccb5d5025214567c6cc2ccfef07151..05ea8fc7f82976f5944391c8454ea11b189e572d 100644 (file)
@@ -764,9 +764,10 @@ int kvmppc_core_prepare_memory_region(struct kvm *kvm,
 
 void kvmppc_core_commit_memory_region(struct kvm *kvm,
                                const struct kvm_userspace_memory_region *mem,
-                               const struct kvm_memory_slot *old)
+                               const struct kvm_memory_slot *old,
+                               const struct kvm_memory_slot *new)
 {
-       kvm->arch.kvm_ops->commit_memory_region(kvm, mem, old);
+       kvm->arch.kvm_ops->commit_memory_region(kvm, mem, old, new);
 }
 
 int kvm_unmap_hva(struct kvm *kvm, unsigned long hva)
index ed493d123268883d43c21daaa8e4ca9e2e8a0e7e..68d067ad4222fd4ece16bd049bdadf6be57402d5 100644 (file)
@@ -2383,7 +2383,8 @@ static int kvmppc_core_prepare_memory_region_hv(struct kvm *kvm,
 
 static void kvmppc_core_commit_memory_region_hv(struct kvm *kvm,
                                const struct kvm_userspace_memory_region *mem,
-                               const struct kvm_memory_slot *old)
+                               const struct kvm_memory_slot *old,
+                               const struct kvm_memory_slot *new)
 {
        unsigned long npages = mem->memory_size >> PAGE_SHIFT;
        struct kvm_memslots *slots;
index 0873e766df1bb29b18a95ee45c41d3f2c555cd43..64891b081ad54f57bbaa603d3315bf32b48368c8 100644 (file)
@@ -1580,7 +1580,8 @@ static int kvmppc_core_prepare_memory_region_pr(struct kvm *kvm,
 
 static void kvmppc_core_commit_memory_region_pr(struct kvm *kvm,
                                const struct kvm_userspace_memory_region *mem,
-                               const struct kvm_memory_slot *old)
+                               const struct kvm_memory_slot *old,
+                               const struct kvm_memory_slot *new)
 {
        return;
 }
index 518e3a8b351f7ab49552c9e183d0567908e6526b..cc5842657161580262d10fb49e0bdfde4de497fd 100644 (file)
@@ -1791,7 +1791,8 @@ int kvmppc_core_prepare_memory_region(struct kvm *kvm,
 
 void kvmppc_core_commit_memory_region(struct kvm *kvm,
                                const struct kvm_userspace_memory_region *mem,
-                               const struct kvm_memory_slot *old)
+                               const struct kvm_memory_slot *old,
+                               const struct kvm_memory_slot *new)
 {
 }
 
index 5985bb2a332b3629391d55d958114a056ec7d0d3..e5dde32fe71fc1856cb5ae515150aa7130de3c96 100644 (file)
@@ -604,9 +604,10 @@ int kvm_arch_prepare_memory_region(struct kvm *kvm,
 void kvm_arch_commit_memory_region(struct kvm *kvm,
                                   const struct kvm_userspace_memory_region *mem,
                                   const struct kvm_memory_slot *old,
+                                  const struct kvm_memory_slot *new,
                                   enum kvm_mr_change change)
 {
-       kvmppc_core_commit_memory_region(kvm, mem, old);
+       kvmppc_core_commit_memory_region(kvm, mem, old, new);
 }
 
 void kvm_arch_flush_shadow_memslot(struct kvm *kvm,
index 994f9c37f25f3a563e381b8b7906e09a5a2a99ed..8ad4b9a5667f3b819db4933ae165c0957af3d670 100644 (file)
@@ -2602,6 +2602,7 @@ int kvm_arch_prepare_memory_region(struct kvm *kvm,
 void kvm_arch_commit_memory_region(struct kvm *kvm,
                                const struct kvm_userspace_memory_region *mem,
                                const struct kvm_memory_slot *old,
+                               const struct kvm_memory_slot *new,
                                enum kvm_mr_change change)
 {
        int rc;
index 1a4d6a0547490e2b562b1c2cab7e9c0914579c67..7276107b35df63d8412516ed1449b7ee0860a623 100644 (file)
@@ -874,7 +874,7 @@ void kvm_mmu_reset_context(struct kvm_vcpu *vcpu);
 void kvm_mmu_slot_remove_write_access(struct kvm *kvm,
                                      struct kvm_memory_slot *memslot);
 void kvm_mmu_zap_collapsible_sptes(struct kvm *kvm,
-                                       struct kvm_memory_slot *memslot);
+                                  const struct kvm_memory_slot *memslot);
 void kvm_mmu_slot_leaf_clear_dirty(struct kvm *kvm,
                                   struct kvm_memory_slot *memslot);
 void kvm_mmu_slot_largepage_remove_write_access(struct kvm *kvm,
index 49c34e632b9166f0d58388bebfafc585cc3b1b8e..1bf2ae9ca521786cb3cb78e64ce3950db3d99701 100644 (file)
@@ -4621,10 +4621,12 @@ restart:
 }
 
 void kvm_mmu_zap_collapsible_sptes(struct kvm *kvm,
-                       struct kvm_memory_slot *memslot)
+                                  const struct kvm_memory_slot *memslot)
 {
+       /* FIXME: const-ify all uses of struct kvm_memory_slot.  */
        spin_lock(&kvm->mmu_lock);
-       slot_handle_leaf(kvm, memslot, kvm_mmu_zap_collapsible_spte, true);
+       slot_handle_leaf(kvm, (struct kvm_memory_slot *)memslot,
+                        kvm_mmu_zap_collapsible_spte, true);
        spin_unlock(&kvm->mmu_lock);
 }
 
index f0aec85f8cddf3882498b5b973e1e395c88a431b..ba7b0cc52fedad6d2bc2fa594a432dfaa88d90b1 100644 (file)
@@ -7780,13 +7780,12 @@ static void kvm_mmu_slot_apply_flags(struct kvm *kvm,
 void kvm_arch_commit_memory_region(struct kvm *kvm,
                                const struct kvm_userspace_memory_region *mem,
                                const struct kvm_memory_slot *old,
+                               const struct kvm_memory_slot *new,
                                enum kvm_mr_change change)
 {
-       struct kvm_memslots *slots;
-       struct kvm_memory_slot *new;
        int nr_mmu_pages = 0;
 
-       if ((mem->slot >= KVM_USER_MEM_SLOTS) && (change == KVM_MR_DELETE)) {
+       if (change == KVM_MR_DELETE && old->id >= KVM_USER_MEM_SLOTS) {
                int ret;
 
                ret = vm_munmap(old->userspace_addr,
@@ -7803,10 +7802,6 @@ void kvm_arch_commit_memory_region(struct kvm *kvm,
        if (nr_mmu_pages)
                kvm_mmu_change_mmu_pages(kvm, nr_mmu_pages);
 
-       /* It's OK to get 'new' slot here as it has already been installed */
-       slots = kvm_memslots(kvm);
-       new = id_to_memslot(slots, mem->slot);
-
        /*
         * Dirty logging tracks sptes in 4k granularity, meaning that large
         * sptes have to be split.  If live migration is successful, the guest
@@ -7831,9 +7826,11 @@ void kvm_arch_commit_memory_region(struct kvm *kvm,
         * been zapped so no dirty logging staff is needed for old slot. For
         * KVM_MR_FLAGS_ONLY, the old slot is essentially the same one as the
         * new and it's also covered when dealing with the new slot.
+        *
+        * FIXME: const-ify all uses of struct kvm_memory_slot.
         */
        if (change != KVM_MR_DELETE)
-               kvm_mmu_slot_apply_flags(kvm, new);
+               kvm_mmu_slot_apply_flags(kvm, (struct kvm_memory_slot *) new);
 }
 
 void kvm_arch_flush_shadow_all(struct kvm *kvm)
index 8815f1dffb77bebafa7d362d3e386b88cf0edee7..9bd3bc16be876fbcded7e6b0b78fa1a11f985391 100644 (file)
@@ -516,6 +516,7 @@ int kvm_arch_prepare_memory_region(struct kvm *kvm,
 void kvm_arch_commit_memory_region(struct kvm *kvm,
                                const struct kvm_userspace_memory_region *mem,
                                const struct kvm_memory_slot *old,
+                               const struct kvm_memory_slot *new,
                                enum kvm_mr_change change);
 bool kvm_largepages_enabled(void);
 void kvm_disable_largepages(void);
index 4361204a6348962edf162f5169824f4d1a0986c9..9f67c942d8ee432b31dfb89bbbc62e6eed4dbc3f 100644 (file)
@@ -912,7 +912,7 @@ int __kvm_set_memory_region(struct kvm *kvm,
        update_memslots(slots, &new);
        old_memslots = install_new_memslots(kvm, slots);
 
-       kvm_arch_commit_memory_region(kvm, mem, &old, change);
+       kvm_arch_commit_memory_region(kvm, mem, &old, &new, change);
 
        kvm_free_memslot(kvm, &old, &new);
        kvfree(old_memslots);