]> git.baikalelectronics.ru Git - kernel.git/commitdiff
KVM: PPC: Avoid referencing userspace memory region in memslot updates
authorSean Christopherson <seanjc@google.com>
Mon, 6 Dec 2021 19:54:14 +0000 (20:54 +0100)
committerPaolo Bonzini <pbonzini@redhat.com>
Wed, 8 Dec 2021 09:24:22 +0000 (04:24 -0500)
For PPC HV, get the number of pages directly from the new memslot instead
of computing the same from the userspace memory region, and explicitly
check for !DELETE instead of inferring the same when toggling mmio_update.
The motivation for these changes is to avoid referencing the @mem param
so that it can be dropped in a future commit.

No functional change intended.

Signed-off-by: Sean Christopherson <seanjc@google.com>
Signed-off-by: Maciej S. Szmigiero <maciej.szmigiero@oracle.com>
Message-Id: <1e97fb5198be25f98ef82e63a8d770c682264cc9.1638817639.git.maciej.szmigiero@oracle.com>

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

index b01760dd1374dfa5fcff6a63f2a196d2e7268903..935c58dc38c493b74572e0c074de531db5afc768 100644 (file)
@@ -200,12 +200,10 @@ extern void kvmppc_core_destroy_vm(struct kvm *kvm);
 extern void kvmppc_core_free_memslot(struct kvm *kvm,
                                     struct kvm_memory_slot *slot);
 extern int kvmppc_core_prepare_memory_region(struct kvm *kvm,
-                               const struct kvm_userspace_memory_region *mem,
                                const struct kvm_memory_slot *old,
                                struct kvm_memory_slot *new,
                                enum kvm_mr_change change);
 extern void kvmppc_core_commit_memory_region(struct kvm *kvm,
-                               const struct kvm_userspace_memory_region *mem,
                                struct kvm_memory_slot *old,
                                const struct kvm_memory_slot *new,
                                enum kvm_mr_change change);
@@ -275,12 +273,10 @@ struct kvmppc_ops {
        int (*get_dirty_log)(struct kvm *kvm, struct kvm_dirty_log *log);
        void (*flush_memslot)(struct kvm *kvm, struct kvm_memory_slot *memslot);
        int (*prepare_memory_region)(struct kvm *kvm,
-                                    const struct kvm_userspace_memory_region *mem,
                                     const struct kvm_memory_slot *old,
                                     struct kvm_memory_slot *new,
                                     enum kvm_mr_change change);
        void (*commit_memory_region)(struct kvm *kvm,
-                                    const struct kvm_userspace_memory_region *mem,
                                     struct kvm_memory_slot *old,
                                     const struct kvm_memory_slot *new,
                                     enum kvm_mr_change change);
index 8250e8308674c7967e2e9c0bface18b12325b91b..6d525285dbe8f268d214af19f5e63e4e0dcd5f01 100644 (file)
@@ -847,21 +847,19 @@ void kvmppc_core_flush_memslot(struct kvm *kvm, struct kvm_memory_slot *memslot)
 }
 
 int kvmppc_core_prepare_memory_region(struct kvm *kvm,
-                                     const struct kvm_userspace_memory_region *mem,
                                      const struct kvm_memory_slot *old,
                                      struct kvm_memory_slot *new,
                                      enum kvm_mr_change change)
 {
-       return kvm->arch.kvm_ops->prepare_memory_region(kvm, mem, old, new, change);
+       return kvm->arch.kvm_ops->prepare_memory_region(kvm, old, new, change);
 }
 
 void kvmppc_core_commit_memory_region(struct kvm *kvm,
-                               const struct kvm_userspace_memory_region *mem,
                                struct kvm_memory_slot *old,
                                const struct kvm_memory_slot *new,
                                enum kvm_mr_change change)
 {
-       kvm->arch.kvm_ops->commit_memory_region(kvm, mem, old, new, change);
+       kvm->arch.kvm_ops->commit_memory_region(kvm, old, new, change);
 }
 
 bool kvm_unmap_gfn_range(struct kvm *kvm, struct kvm_gfn_range *range)
index d7594d49d288a3d14fbe7d2adf23d10fb053740b..2b59ecc5f8c698a60ecd9ae5bcd2265125246f0f 100644 (file)
@@ -4854,15 +4854,12 @@ static void kvmppc_core_free_memslot_hv(struct kvm_memory_slot *slot)
 }
 
 static int kvmppc_core_prepare_memory_region_hv(struct kvm *kvm,
-                               const struct kvm_userspace_memory_region *mem,
                                const struct kvm_memory_slot *old,
                                struct kvm_memory_slot *new,
                                enum kvm_mr_change change)
 {
-       unsigned long npages = mem->memory_size >> PAGE_SHIFT;
-
        if (change == KVM_MR_CREATE) {
-               new->arch.rmap = vzalloc(array_size(npages,
+               new->arch.rmap = vzalloc(array_size(new->npages,
                                          sizeof(*new->arch.rmap)));
                if (!new->arch.rmap)
                        return -ENOMEM;
@@ -4874,20 +4871,17 @@ 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,
                                struct kvm_memory_slot *old,
                                const struct kvm_memory_slot *new,
                                enum kvm_mr_change change)
 {
-       unsigned long npages = mem->memory_size >> PAGE_SHIFT;
-
        /*
-        * If we are making a new memslot, it might make
+        * If we are creating or modifying a memslot, it might make
         * some address that was previously cached as emulated
         * MMIO be no longer emulated MMIO, so invalidate
         * all the caches of emulated MMIO translations.
         */
-       if (npages)
+       if (change != KVM_MR_DELETE)
                atomic64_inc(&kvm->arch.mmio_update);
 
        /*
index ffb559cf25f435493e97847949c7bd6e2761f855..30426e8c8cf66b6d882356901e87f6f3bf14681f 100644 (file)
@@ -1899,7 +1899,6 @@ static void kvmppc_core_flush_memslot_pr(struct kvm *kvm,
 }
 
 static int kvmppc_core_prepare_memory_region_pr(struct kvm *kvm,
-                               const struct kvm_userspace_memory_region *mem,
                                const struct kvm_memory_slot *old,
                                struct kvm_memory_slot *new,
                                enum kvm_mr_change change)
@@ -1908,7 +1907,6 @@ 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,
                                struct kvm_memory_slot *old,
                                const struct kvm_memory_slot *new,
                                enum kvm_mr_change change)
index 93c2ac2bee0913b868f86149981cf8f91a1e2003..53b4c9597c303e81e7bbb71d935628789fce1308 100644 (file)
@@ -1821,7 +1821,6 @@ void kvmppc_core_free_memslot(struct kvm *kvm, struct kvm_memory_slot *slot)
 }
 
 int kvmppc_core_prepare_memory_region(struct kvm *kvm,
-                                     const struct kvm_userspace_memory_region *mem,
                                      const struct kvm_memory_slot *old,
                                      struct kvm_memory_slot *new,
                                      enum kvm_mr_change change)
@@ -1830,7 +1829,6 @@ 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,
                                struct kvm_memory_slot *old,
                                const struct kvm_memory_slot *new,
                                enum kvm_mr_change change)
index e875874cf8367d759d2147a7637b8407cf5f5816..575140ecb23c82b64fe1d113c5e7ab07f596bc9c 100644 (file)
@@ -703,7 +703,7 @@ int kvm_arch_prepare_memory_region(struct kvm *kvm,
                                   struct kvm_memory_slot *new,
                                   enum kvm_mr_change change)
 {
-       return kvmppc_core_prepare_memory_region(kvm, mem, old, new, change);
+       return kvmppc_core_prepare_memory_region(kvm, old, new, change);
 }
 
 void kvm_arch_commit_memory_region(struct kvm *kvm,
@@ -712,7 +712,7 @@ void kvm_arch_commit_memory_region(struct kvm *kvm,
                                   const struct kvm_memory_slot *new,
                                   enum kvm_mr_change change)
 {
-       kvmppc_core_commit_memory_region(kvm, mem, old, new, change);
+       kvmppc_core_commit_memory_region(kvm, old, new, change);
 }
 
 void kvm_arch_flush_shadow_memslot(struct kvm *kvm,