KVM: s390: Dont do a gmap update on minor memslot changes
authorChristian Borntraeger <borntraeger@de.ibm.com>
Mon, 25 Mar 2013 16:22:48 +0000 (17:22 +0100)
committerGleb Natapov <gleb@redhat.com>
Tue, 2 Apr 2013 13:14:07 +0000 (16:14 +0300)
Some memslot updates dont affect the gmap implementation,
e.g. setting/unsetting dirty tracking. Since a gmap update
will cause tlb flushes and segment table invalidations we
want to avoid that.

Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
Signed-off-by: Cornelia Huck <cornelia.huck@de.ibm.com>
Signed-off-by: Gleb Natapov <gleb@redhat.com>
arch/s390/kvm/kvm-s390.c

index 33161b4a8280ee333f7c228fef42cc466d2d0f13..f241e3315ebb85611e250c56f560913898df1cc8 100644 (file)
@@ -1007,6 +1007,16 @@ void kvm_arch_commit_memory_region(struct kvm *kvm,
 {
        int rc;
 
+       /* If the basics of the memslot do not change, we do not want
+        * to update the gmap. Every update causes several unnecessary
+        * segment translation exceptions. This is usually handled just
+        * fine by the normal fault handler + gmap, but it will also
+        * cause faults on the prefix page of running guest CPUs.
+        */
+       if (old->userspace_addr == mem->userspace_addr &&
+           old->base_gfn * PAGE_SIZE == mem->guest_phys_addr &&
+           old->npages * PAGE_SIZE == mem->memory_size)
+               return;
 
        rc = gmap_map_segment(kvm->arch.gmap, mem->userspace_addr,
                mem->guest_phys_addr, mem->memory_size);