KVM: s390: Make the simple ipte mutex specific to a VM instead of global
authorThomas Huth <thuth@linux.vnet.ibm.com>
Wed, 1 Oct 2014 12:48:42 +0000 (14:48 +0200)
committerChristian Borntraeger <borntraeger@de.ibm.com>
Tue, 28 Oct 2014 12:08:59 +0000 (13:08 +0100)
The ipte-locking should be done for each VM seperately, not globally.
This way we avoid possible congestions when the simple ipte-lock is used
and multiple VMs are running.

Suggested-by: Heiko Carstens <heiko.carstens@de.ibm.com>
Signed-off-by: Thomas Huth <thuth@linux.vnet.ibm.com>
Acked-by: Heiko Carstens <heiko.carstens@de.ibm.com>
Reviewed-by: Christian Borntraeger <borntraeger@de.ibm.com>
Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
arch/s390/include/asm/kvm_host.h
arch/s390/kvm/gaccess.c
arch/s390/kvm/kvm-s390.c

index 2175f911a73a0606fda558f7417243fcedaf07e1..584b820eeaf8188a938807f478a491f0a6a3a1e2 100644 (file)
@@ -434,6 +434,8 @@ struct kvm_arch{
        int user_cpu_state_ctrl;
        struct s390_io_adapter *adapters[MAX_S390_IO_ADAPTERS];
        wait_queue_head_t ipte_wq;
+       int ipte_lock_count;
+       struct mutex ipte_mutex;
        spinlock_t start_stop_lock;
        struct kvm_s390_crypto crypto;
 };
index 0f961a1c64b35e24d182375dbaac8c80d15e2e2d..c1424e8b7f0919184fb30b21efbc9d808828df8b 100644 (file)
@@ -207,8 +207,6 @@ union raddress {
        unsigned long pfra : 52; /* Page-Frame Real Address */
 };
 
-static int ipte_lock_count;
-static DEFINE_MUTEX(ipte_mutex);
 
 int ipte_lock_held(struct kvm_vcpu *vcpu)
 {
@@ -216,16 +214,16 @@ int ipte_lock_held(struct kvm_vcpu *vcpu)
 
        if (vcpu->arch.sie_block->eca & 1)
                return ic->kh != 0;
-       return ipte_lock_count != 0;
+       return vcpu->kvm->arch.ipte_lock_count != 0;
 }
 
 static void ipte_lock_simple(struct kvm_vcpu *vcpu)
 {
        union ipte_control old, new, *ic;
 
-       mutex_lock(&ipte_mutex);
-       ipte_lock_count++;
-       if (ipte_lock_count > 1)
+       mutex_lock(&vcpu->kvm->arch.ipte_mutex);
+       vcpu->kvm->arch.ipte_lock_count++;
+       if (vcpu->kvm->arch.ipte_lock_count > 1)
                goto out;
        ic = &vcpu->kvm->arch.sca->ipte_control;
        do {
@@ -238,16 +236,16 @@ static void ipte_lock_simple(struct kvm_vcpu *vcpu)
                new.k = 1;
        } while (cmpxchg(&ic->val, old.val, new.val) != old.val);
 out:
-       mutex_unlock(&ipte_mutex);
+       mutex_unlock(&vcpu->kvm->arch.ipte_mutex);
 }
 
 static void ipte_unlock_simple(struct kvm_vcpu *vcpu)
 {
        union ipte_control old, new, *ic;
 
-       mutex_lock(&ipte_mutex);
-       ipte_lock_count--;
-       if (ipte_lock_count)
+       mutex_lock(&vcpu->kvm->arch.ipte_mutex);
+       vcpu->kvm->arch.ipte_lock_count--;
+       if (vcpu->kvm->arch.ipte_lock_count)
                goto out;
        ic = &vcpu->kvm->arch.sca->ipte_control;
        do {
@@ -256,7 +254,7 @@ static void ipte_unlock_simple(struct kvm_vcpu *vcpu)
        } while (cmpxchg(&ic->val, old.val, new.val) != old.val);
        wake_up(&vcpu->kvm->arch.ipte_wq);
 out:
-       mutex_unlock(&ipte_mutex);
+       mutex_unlock(&vcpu->kvm->arch.ipte_mutex);
 }
 
 static void ipte_lock_siif(struct kvm_vcpu *vcpu)
index 55aade49b6d1164f1ecd01f14f5cdb841077df6d..3e83d4b357b914df6683818341222c0e65fd0d82 100644 (file)
@@ -453,6 +453,7 @@ int kvm_arch_init_vm(struct kvm *kvm, unsigned long type)
        spin_lock_init(&kvm->arch.float_int.lock);
        INIT_LIST_HEAD(&kvm->arch.float_int.list);
        init_waitqueue_head(&kvm->arch.ipte_wq);
+       mutex_init(&kvm->arch.ipte_mutex);
 
        debug_register_view(kvm->arch.dbf, &debug_sprintf_view);
        VM_EVENT(kvm, 3, "%s", "vm created");