diff options
author | Christian Borntraeger <borntraeger@de.ibm.com> | 2015-09-11 10:09:56 -0400 |
---|---|---|
committer | Martin Schwidefsky <schwidefsky@de.ibm.com> | 2015-10-14 08:32:00 -0400 |
commit | e0af21c56ddd592b33f74f986a2cb4478b10786e (patch) | |
tree | c5dd2779855656d9fda7eb7d1b90218b2a3f4599 /arch/s390/lib | |
parent | 9a21268360f5438796fa935e0b2e9317187ef8f4 (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.c | 4 |
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) |