diff options
-rw-r--r-- | kernel/locking/qspinlock_paravirt.h | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/kernel/locking/qspinlock_paravirt.h b/kernel/locking/qspinlock_paravirt.h index 04ab18151cc8..df19ae4debd0 100644 --- a/kernel/locking/qspinlock_paravirt.h +++ b/kernel/locking/qspinlock_paravirt.h | |||
@@ -4,6 +4,7 @@ | |||
4 | 4 | ||
5 | #include <linux/hash.h> | 5 | #include <linux/hash.h> |
6 | #include <linux/bootmem.h> | 6 | #include <linux/bootmem.h> |
7 | #include <linux/debug_locks.h> | ||
7 | 8 | ||
8 | /* | 9 | /* |
9 | * Implement paravirt qspinlocks; the general idea is to halt the vcpus instead | 10 | * Implement paravirt qspinlocks; the general idea is to halt the vcpus instead |
@@ -286,15 +287,23 @@ __visible void __pv_queued_spin_unlock(struct qspinlock *lock) | |||
286 | { | 287 | { |
287 | struct __qspinlock *l = (void *)lock; | 288 | struct __qspinlock *l = (void *)lock; |
288 | struct pv_node *node; | 289 | struct pv_node *node; |
290 | u8 lockval = cmpxchg(&l->locked, _Q_LOCKED_VAL, 0); | ||
289 | 291 | ||
290 | /* | 292 | /* |
291 | * We must not unlock if SLOW, because in that case we must first | 293 | * We must not unlock if SLOW, because in that case we must first |
292 | * unhash. Otherwise it would be possible to have multiple @lock | 294 | * unhash. Otherwise it would be possible to have multiple @lock |
293 | * entries, which would be BAD. | 295 | * entries, which would be BAD. |
294 | */ | 296 | */ |
295 | if (likely(cmpxchg(&l->locked, _Q_LOCKED_VAL, 0) == _Q_LOCKED_VAL)) | 297 | if (likely(lockval == _Q_LOCKED_VAL)) |
296 | return; | 298 | return; |
297 | 299 | ||
300 | if (unlikely(lockval != _Q_SLOW_VAL)) { | ||
301 | if (debug_locks_silent) | ||
302 | return; | ||
303 | WARN(1, "pvqspinlock: lock %p has corrupted value 0x%x!\n", lock, atomic_read(&lock->val)); | ||
304 | return; | ||
305 | } | ||
306 | |||
298 | /* | 307 | /* |
299 | * Since the above failed to release, this must be the SLOW path. | 308 | * Since the above failed to release, this must be the SLOW path. |
300 | * Therefore start by looking up the blocked node and unhashing it. | 309 | * Therefore start by looking up the blocked node and unhashing it. |