]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
KVM: s390: Remove one byte cmpxchg() usage
authorHeiko Carstens <hca@linux.ibm.com>
Tue, 26 Nov 2024 10:25:14 +0000 (11:25 +0100)
committerHeiko Carstens <hca@linux.ibm.com>
Wed, 27 Nov 2024 11:55:15 +0000 (12:55 +0100)
Within sca_clear_ext_call() cmpxchg() is used to clear one or two bytes
(depending on sca format). The cmpxchg() calls are not supposed to fail; if
so that would be a bug. Given that cmpxchg() usage on one and two byte
areas generates very inefficient code, replace them with block concurrent
WRITE_ONCE() calls, and remove the WARN_ON().

Acked-by: Claudio Imbrenda <imbrenda@linux.ibm.com>
Acked-by: Janosch Frank <frankja@linux.ibm.com>
Link: https://lore.kernel.org/r/20241126102515.3178914-3-hca@linux.ibm.com
Signed-off-by: Heiko Carstens <hca@linux.ibm.com>
arch/s390/kvm/interrupt.c

index eff69018cbebfa5acc36a5ae6513fa0df87bccbd..ea8dce299954a3ce2d291b6ca7c803e34bef5a6d 100644 (file)
@@ -118,8 +118,6 @@ static int sca_inject_ext_call(struct kvm_vcpu *vcpu, int src_id)
 
 static void sca_clear_ext_call(struct kvm_vcpu *vcpu)
 {
-       int rc, expect;
-
        if (!kvm_s390_use_sca_entries())
                return;
        kvm_s390_clear_cpuflags(vcpu, CPUSTAT_ECALL_PEND);
@@ -128,23 +126,16 @@ static void sca_clear_ext_call(struct kvm_vcpu *vcpu)
                struct esca_block *sca = vcpu->kvm->arch.sca;
                union esca_sigp_ctrl *sigp_ctrl =
                        &(sca->cpu[vcpu->vcpu_id].sigp_ctrl);
-               union esca_sigp_ctrl old;
 
-               old = READ_ONCE(*sigp_ctrl);
-               expect = old.value;
-               rc = cmpxchg(&sigp_ctrl->value, old.value, 0);
+               WRITE_ONCE(sigp_ctrl->value, 0);
        } else {
                struct bsca_block *sca = vcpu->kvm->arch.sca;
                union bsca_sigp_ctrl *sigp_ctrl =
                        &(sca->cpu[vcpu->vcpu_id].sigp_ctrl);
-               union bsca_sigp_ctrl old;
 
-               old = READ_ONCE(*sigp_ctrl);
-               expect = old.value;
-               rc = cmpxchg(&sigp_ctrl->value, old.value, 0);
+               WRITE_ONCE(sigp_ctrl->value, 0);
        }
        read_unlock(&vcpu->kvm->arch.sca_lock);
-       WARN_ON(rc != expect); /* cannot clear? */
 }
 
 int psw_extint_disabled(struct kvm_vcpu *vcpu)