Messages in this thread | | | Date | Sun, 11 Aug 2013 19:25:11 +0200 | From | Oleg Nesterov <> | Subject | Re: Patch for lost wakeups |
| |
On 08/09, Linus Torvalds wrote: > > I guess that instead of a "smp_wmb()", we could do another > "smp_mb__before_spinlock()" thing, like we already allow for other > architectures to do a weaker form of mb in case the spinlock is > already a full mb. That would allow avoiding extra synchronization. Do > a > > #ifndef smp_mb__before_spinlock > #define smp_mb__before_spinlock() smp_wmb() > #endif > > in <linux/spinlock.h> to not force everybody to implement it. Because > a wmb+acquire should be close enough to a full mb that nobody cares > (ok, so reads could move into the critical region from outside, but by > the time anybody has called "schedule()", I can't see it mattering, so > "close enough").
Yes, this is what I tried to suggest. And of course we should turn that wmb() in try_to_wake_up() into smp_mb__before_spinlock().
I event started the patch, but we already have smp_mb__after_lock(), so it should be smp_mb__before_lock() for consistency and we need to turn it to "define" too. Or change ARCH_HAS_SMP_MB_AFTER_LOCK, or add ARCH_HAS_SMP_MB_BEFORE_LOCK.
Oleg.
| |