On Wed, May 05, 2010 at 11:06:44AM +0100, David Howells wrote: > Michel Lespinasse <walken@xxxxxxxxxx> wrote: > > > and looks like it's doable with the x86 rwsem implementation as well in a > > way that would only involve changes to the rwsem spinlock-protected slow > > paths in lib/rwsem.c . > > It's not as easy as it seems. Once an XADD-based rwsem is contended, you > cannot necessarily tell without looking at the queue whether the rwsem is > currently write-locked or read-locked. I only said it was doable :) Not done with the implementation yet, but I can describe the general idea if that helps. The high part of the rwsem is decremented by two for each thread holding or trying to acquire a write lock; additionally the high part of the rwsem is decremented by one for the first thread getting queued. Since queuing is done under a spinlock, it is easy to decrement only for the first blocked thread there. In down_read_unfair(), the rwsem value is compared with RWSEM_WAITING_BIAS (== -1 << 16 or 32); if it's smaller then the rwsem might be write owned and we have to block; otherwise it only has waiters which we can decide to ignore. This is the idea in a nutshell. -- Michel "Walken" Lespinasse A program is never fully debugged until the last user dies. -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@xxxxxxxxxx For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@xxxxxxxxx"> email@xxxxxxxxx </a>