KVM: s390x: fix SCK locking
[platform/kernel/linux-rpi.git] / arch / s390 / kvm / kvm-s390.c
index 402597f..b456aa1 100644 (file)
@@ -3913,14 +3913,12 @@ retry:
        return 0;
 }
 
-void kvm_s390_set_tod_clock(struct kvm *kvm,
-                           const struct kvm_s390_vm_tod_clock *gtod)
+static void __kvm_s390_set_tod_clock(struct kvm *kvm, const struct kvm_s390_vm_tod_clock *gtod)
 {
        struct kvm_vcpu *vcpu;
        union tod_clock clk;
        int i;
 
-       mutex_lock(&kvm->lock);
        preempt_disable();
 
        store_tod_clock_ext(&clk);
@@ -3941,7 +3939,22 @@ void kvm_s390_set_tod_clock(struct kvm *kvm,
 
        kvm_s390_vcpu_unblock_all(kvm);
        preempt_enable();
+}
+
+void kvm_s390_set_tod_clock(struct kvm *kvm, const struct kvm_s390_vm_tod_clock *gtod)
+{
+       mutex_lock(&kvm->lock);
+       __kvm_s390_set_tod_clock(kvm, gtod);
+       mutex_unlock(&kvm->lock);
+}
+
+int kvm_s390_try_set_tod_clock(struct kvm *kvm, const struct kvm_s390_vm_tod_clock *gtod)
+{
+       if (!mutex_trylock(&kvm->lock))
+               return 0;
+       __kvm_s390_set_tod_clock(kvm, gtod);
        mutex_unlock(&kvm->lock);
+       return 1;
 }
 
 /**