s390/kvm: REPLACE barrier fixup with READ_ONCE
ACCESS_ONCE does not work reliably on non-scalar types. For
example gcc 4.6 and 4.7 might remove the volatile tag for such
accesses during the SRA (scalar replacement of aggregates) step
(https://gcc.gnu.org/bugzilla/show_bug.cgi?id=58145)
Commit 1365039d0c ("KVM: s390: Fix ipte locking") replace
ACCESS_ONCE with barriers. Lets use READ_ONCE instead.
Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
Acked-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
This commit is contained in:
@@ -229,12 +229,10 @@ static void ipte_lock_simple(struct kvm_vcpu *vcpu)
|
|||||||
goto out;
|
goto out;
|
||||||
ic = &vcpu->kvm->arch.sca->ipte_control;
|
ic = &vcpu->kvm->arch.sca->ipte_control;
|
||||||
do {
|
do {
|
||||||
old = *ic;
|
old = READ_ONCE(*ic);
|
||||||
barrier();
|
|
||||||
while (old.k) {
|
while (old.k) {
|
||||||
cond_resched();
|
cond_resched();
|
||||||
old = *ic;
|
old = READ_ONCE(*ic);
|
||||||
barrier();
|
|
||||||
}
|
}
|
||||||
new = old;
|
new = old;
|
||||||
new.k = 1;
|
new.k = 1;
|
||||||
@@ -253,8 +251,7 @@ static void ipte_unlock_simple(struct kvm_vcpu *vcpu)
|
|||||||
goto out;
|
goto out;
|
||||||
ic = &vcpu->kvm->arch.sca->ipte_control;
|
ic = &vcpu->kvm->arch.sca->ipte_control;
|
||||||
do {
|
do {
|
||||||
old = *ic;
|
old = READ_ONCE(*ic);
|
||||||
barrier();
|
|
||||||
new = old;
|
new = old;
|
||||||
new.k = 0;
|
new.k = 0;
|
||||||
} while (cmpxchg(&ic->val, old.val, new.val) != old.val);
|
} while (cmpxchg(&ic->val, old.val, new.val) != old.val);
|
||||||
@@ -269,12 +266,10 @@ static void ipte_lock_siif(struct kvm_vcpu *vcpu)
|
|||||||
|
|
||||||
ic = &vcpu->kvm->arch.sca->ipte_control;
|
ic = &vcpu->kvm->arch.sca->ipte_control;
|
||||||
do {
|
do {
|
||||||
old = *ic;
|
old = READ_ONCE(*ic);
|
||||||
barrier();
|
|
||||||
while (old.kg) {
|
while (old.kg) {
|
||||||
cond_resched();
|
cond_resched();
|
||||||
old = *ic;
|
old = READ_ONCE(*ic);
|
||||||
barrier();
|
|
||||||
}
|
}
|
||||||
new = old;
|
new = old;
|
||||||
new.k = 1;
|
new.k = 1;
|
||||||
@@ -288,8 +283,7 @@ static void ipte_unlock_siif(struct kvm_vcpu *vcpu)
|
|||||||
|
|
||||||
ic = &vcpu->kvm->arch.sca->ipte_control;
|
ic = &vcpu->kvm->arch.sca->ipte_control;
|
||||||
do {
|
do {
|
||||||
old = *ic;
|
old = READ_ONCE(*ic);
|
||||||
barrier();
|
|
||||||
new = old;
|
new = old;
|
||||||
new.kh--;
|
new.kh--;
|
||||||
if (!new.kh)
|
if (!new.kh)
|
||||||
|
|||||||
Reference in New Issue
Block a user