KVM: s390: implement KVM_REQ_TLB_FLUSH and make use of it
authorDavid Hildenbrand <dahi@linux.vnet.ibm.com>
Tue, 29 Jul 2014 06:53:36 +0000 (08:53 +0200)
committerChristian Borntraeger <borntraeger@de.ibm.com>
Mon, 25 Aug 2014 12:35:55 +0000 (14:35 +0200)
Use the KVM_REQ_TLB_FLUSH request in order to trigger tlb flushes instead
of manipulating the SIE control block whenever we need it. Also trigger it for
a control register sync directly instead of (ab)using kvm_s390_set_prefix().

Signed-off-by: David Hildenbrand <dahi@linux.vnet.ibm.com>
Reviewed-by: Cornelia Huck <cornelia.huck@de.ibm.com>
Acked-by: Christian Borntraeger <borntraeger@de.ibm.com>
Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
arch/s390/kvm/kvm-s390.c
arch/s390/kvm/kvm-s390.h

index ab7cd645c127b149f90730ebe9ab2d7b9810fa90..56193becdca59b605d3364b0f0a7fad13239f419 100644 (file)
@@ -1051,6 +1051,11 @@ retry:
                goto retry;
        }
 
+       if (kvm_check_request(KVM_REQ_TLB_FLUSH, vcpu)) {
+               vcpu->arch.sie_block->ihcpu = 0xffff;
+               goto retry;
+       }
+
        if (kvm_check_request(KVM_REQ_ENABLE_IBS, vcpu)) {
                if (!ibs_enabled(vcpu)) {
                        trace_kvm_s390_enable_disable_ibs(vcpu->vcpu_id, 1);
@@ -1306,7 +1311,8 @@ static void sync_regs(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run)
                kvm_s390_set_prefix(vcpu, kvm_run->s.regs.prefix);
        if (kvm_run->kvm_dirty_regs & KVM_SYNC_CRS) {
                memcpy(&vcpu->arch.sie_block->gcr, &kvm_run->s.regs.crs, 128);
-               kvm_s390_set_prefix(vcpu, kvm_run->s.regs.prefix);
+               /* some control register changes require a tlb flush */
+               kvm_make_request(KVM_REQ_TLB_FLUSH, vcpu);
        }
        if (kvm_run->kvm_dirty_regs & KVM_SYNC_ARCH0) {
                vcpu->arch.sie_block->cputm = kvm_run->s.regs.cputm;
@@ -1519,7 +1525,7 @@ void kvm_s390_vcpu_start(struct kvm_vcpu *vcpu)
         * Another VCPU might have used IBS while we were offline.
         * Let's play safe and flush the VCPU at startup.
         */
-       vcpu->arch.sie_block->ihcpu  = 0xffff;
+       kvm_make_request(KVM_REQ_TLB_FLUSH, vcpu);
        spin_unlock(&vcpu->kvm->arch.start_stop_lock);
        return;
 }
index 894fa4653dfb1cecee3c012ab994d573a5964d34..54c25fd5bed6756778a72c7115e9e8acd60a183c 100644 (file)
@@ -70,7 +70,7 @@ static inline u32 kvm_s390_get_prefix(struct kvm_vcpu *vcpu)
 static inline void kvm_s390_set_prefix(struct kvm_vcpu *vcpu, u32 prefix)
 {
        vcpu->arch.sie_block->prefix = prefix >> GUEST_PREFIX_SHIFT;
-       vcpu->arch.sie_block->ihcpu  = 0xffff;
+       kvm_make_request(KVM_REQ_TLB_FLUSH, vcpu);
        kvm_make_request(KVM_REQ_MMU_RELOAD, vcpu);
 }