diff options
Diffstat (limited to 'arch/s390/kvm/interrupt.c')
| -rw-r--r-- | arch/s390/kvm/interrupt.c | 12 | 
1 files changed, 8 insertions, 4 deletions
| diff --git a/arch/s390/kvm/interrupt.c b/arch/s390/kvm/interrupt.c index 1dae78deddf2..ab26aa53ee37 100644 --- a/arch/s390/kvm/interrupt.c +++ b/arch/s390/kvm/interrupt.c @@ -83,8 +83,9 @@ static int sca_inject_ext_call(struct kvm_vcpu *vcpu, int src_id)  		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 new_val = {0}, old_val = *sigp_ctrl; +		union esca_sigp_ctrl new_val = {0}, old_val; +		old_val = READ_ONCE(*sigp_ctrl);  		new_val.scn = src_id;  		new_val.c = 1;  		old_val.c = 0; @@ -95,8 +96,9 @@ static int sca_inject_ext_call(struct kvm_vcpu *vcpu, int src_id)  		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 new_val = {0}, old_val = *sigp_ctrl; +		union bsca_sigp_ctrl new_val = {0}, old_val; +		old_val = READ_ONCE(*sigp_ctrl);  		new_val.scn = src_id;  		new_val.c = 1;  		old_val.c = 0; @@ -126,16 +128,18 @@ 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 = *sigp_ctrl; +		union esca_sigp_ctrl old; +		old = READ_ONCE(*sigp_ctrl);  		expect = old.value;  		rc = cmpxchg(&sigp_ctrl->value, old.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 = *sigp_ctrl; +		union bsca_sigp_ctrl old; +		old = READ_ONCE(*sigp_ctrl);  		expect = old.value;  		rc = cmpxchg(&sigp_ctrl->value, old.value, 0);  	} |