On Fri, Jul 10, 2015 at 09:27:45PM -0400, Waiman Long wrote: > Anyway, I have an alternative fix that should better capture the problem: > > ------------------------------- > diff --git a/kernel/locking/qspinlock_paravirt.h > b/kernel/locking/qspinlock_paravirt.h > index 04ab181..92fc54f 100644 > --- a/kernel/locking/qspinlock_paravirt.h > +++ b/kernel/locking/qspinlock_paravirt.h > @@ -286,15 +286,24 @@ __visible void __pv_queued_spin_unlock(struct > qspinlock *lock) > { > struct __qspinlock *l = (void *)lock; > struct pv_node *node; > + u8 lockval = cmpxchg(&l->locked, _Q_LOCKED_VAL, 0); > > /* > * We must not unlock if SLOW, because in that case we must first > * unhash. Otherwise it would be possible to have multiple @lock > * entries, which would be BAD. > */ > - if (likely(cmpxchg(&l->locked, _Q_LOCKED_VAL, 0) == _Q_LOCKED_VAL)) > + if (likely(lockval == _Q_LOCKED_VAL)) > return; > > + if (unlikely(lockval != _Q_SLOW_VAL)) { > + printk(KERN_WARNING > + "pvqspinlock: lock 0x%lx has corrupted value 0x%x!\n", > + (unsigned long)lock, atomic_read(&lock->val)); > + WARN_ON_ONCE(1);
WARN_ONCE(1, "foo"); > + return; > + } Right, so since this should not ever happen in 'sane' code, its a shame to have to put in this condition. But yes, this works too. -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/