aboutsummaryrefslogtreecommitdiffstats
path: root/arch/s390/lib
diff options
context:
space:
mode:
authorChristian Borntraeger <borntraeger@de.ibm.com>2015-09-11 10:09:56 -0400
committerMartin Schwidefsky <schwidefsky@de.ibm.com>2015-10-14 08:32:00 -0400
commite0af21c56ddd592b33f74f986a2cb4478b10786e (patch)
treec5dd2779855656d9fda7eb7d1b90218b2a3f4599 /arch/s390/lib
parent9a21268360f5438796fa935e0b2e9317187ef8f4 (diff)
s390/spinlock: use correct barriers
_raw_write_lock_wait first sets the high order bit to indicate a pending writer and then waits for the reader to drop to zero. smp_rmb by definition only orders reads against reads. Let's use a full smp_mb instead. As right now smp_rmb is implemented as full serialization, this needs no stable backport, but this patch will be necessary if we reimplement smp_rmb. Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com> Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
Diffstat (limited to 'arch/s390/lib')
-rw-r--r--arch/s390/lib/spinlock.c4
1 files changed, 2 insertions, 2 deletions
diff --git a/arch/s390/lib/spinlock.c b/arch/s390/lib/spinlock.c
index d6c9991f7797..427aa44b3505 100644
--- a/arch/s390/lib/spinlock.c
+++ b/arch/s390/lib/spinlock.c
@@ -197,7 +197,7 @@ void _raw_write_lock_wait(arch_rwlock_t *rw, unsigned int prev)
197 } 197 }
198 old = ACCESS_ONCE(rw->lock); 198 old = ACCESS_ONCE(rw->lock);
199 owner = ACCESS_ONCE(rw->owner); 199 owner = ACCESS_ONCE(rw->owner);
200 smp_rmb(); 200 smp_mb();
201 if ((int) old >= 0) { 201 if ((int) old >= 0) {
202 prev = __RAW_LOCK(&rw->lock, 0x80000000, __RAW_OP_OR); 202 prev = __RAW_LOCK(&rw->lock, 0x80000000, __RAW_OP_OR);
203 old = prev; 203 old = prev;
@@ -231,7 +231,7 @@ void _raw_write_lock_wait(arch_rwlock_t *rw)
231 _raw_compare_and_swap(&rw->lock, old, old | 0x80000000)) 231 _raw_compare_and_swap(&rw->lock, old, old | 0x80000000))
232 prev = old; 232 prev = old;
233 else 233 else
234 smp_rmb(); 234 smp_mb();
235 if ((old & 0x7fffffff) == 0 && (int) prev >= 0) 235 if ((old & 0x7fffffff) == 0 && (int) prev >= 0)
236 break; 236 break;
237 if (MACHINE_HAS_CAD) 237 if (MACHINE_HAS_CAD)