@@ -83,8 +83,9 @@ static int sca_inject_ext_call(struct kvm_vcpu *vcpu, int src_id)
83
83
struct esca_block * sca = vcpu -> kvm -> arch .sca ;
84
84
union esca_sigp_ctrl * sigp_ctrl =
85
85
& (sca -> cpu [vcpu -> vcpu_id ].sigp_ctrl );
86
- union esca_sigp_ctrl new_val = {0 }, old_val = * sigp_ctrl ;
86
+ union esca_sigp_ctrl new_val = {0 }, old_val ;
87
87
88
+ old_val = READ_ONCE (* sigp_ctrl );
88
89
new_val .scn = src_id ;
89
90
new_val .c = 1 ;
90
91
old_val .c = 0 ;
@@ -95,8 +96,9 @@ static int sca_inject_ext_call(struct kvm_vcpu *vcpu, int src_id)
95
96
struct bsca_block * sca = vcpu -> kvm -> arch .sca ;
96
97
union bsca_sigp_ctrl * sigp_ctrl =
97
98
& (sca -> cpu [vcpu -> vcpu_id ].sigp_ctrl );
98
- union bsca_sigp_ctrl new_val = {0 }, old_val = * sigp_ctrl ;
99
+ union bsca_sigp_ctrl new_val = {0 }, old_val ;
99
100
101
+ old_val = READ_ONCE (* sigp_ctrl );
100
102
new_val .scn = src_id ;
101
103
new_val .c = 1 ;
102
104
old_val .c = 0 ;
@@ -126,16 +128,18 @@ static void sca_clear_ext_call(struct kvm_vcpu *vcpu)
126
128
struct esca_block * sca = vcpu -> kvm -> arch .sca ;
127
129
union esca_sigp_ctrl * sigp_ctrl =
128
130
& (sca -> cpu [vcpu -> vcpu_id ].sigp_ctrl );
129
- union esca_sigp_ctrl old = * sigp_ctrl ;
131
+ union esca_sigp_ctrl old ;
130
132
133
+ old = READ_ONCE (* sigp_ctrl );
131
134
expect = old .value ;
132
135
rc = cmpxchg (& sigp_ctrl -> value , old .value , 0 );
133
136
} else {
134
137
struct bsca_block * sca = vcpu -> kvm -> arch .sca ;
135
138
union bsca_sigp_ctrl * sigp_ctrl =
136
139
& (sca -> cpu [vcpu -> vcpu_id ].sigp_ctrl );
137
- union bsca_sigp_ctrl old = * sigp_ctrl ;
140
+ union bsca_sigp_ctrl old ;
138
141
142
+ old = READ_ONCE (* sigp_ctrl );
139
143
expect = old .value ;
140
144
rc = cmpxchg (& sigp_ctrl -> value , old .value , 0 );
141
145
}
0 commit comments