rwlock patch to prefer writers and improve spinning.

Jeff Roberson jroberson at chesapeake.net
Mon Jan 28 21:08:23 PST 2008


http://people.freebsd.org/~jeff/rwlock.diff

Attilio and I have come up with a rwlock patch that prevents writer 
starvation by blocking readers whenever there are writers waiting on the 
turnstile.

To avoid deadlocks caused by recursive readers a new per-thread count of 
outstanding rw read locks is maintained.  When a thread is known to own 
read locks it will bypass the pending writers checks.  This could lead to 
writer starvation in pathological cases but will not deadlock.

In addition, I have added code to optimistically spin in the write lock 
path when there are readers.  The spin is limited by two counters.  One 
controls the number of spins while waiting for the lock state to change 
and another controls the number of lock state changes we'll observe before 
we give up.

To add these two features new flags were required.  I removed the 
recursion flag and instead there is an extra branch in the inlined code to 
check the recursion count before the atomic.  Another option would be to 
further increase the alignment of struct thread, however, I don't really 
think that is necessary.

This has been thoroughly tested with nokia's stack but it had to be 
forward ported to current.  Any rwlock users are encouraged to test before 
I commit.

Feedback is welcome.

Thanks,
Jeff


More information about the freebsd-arch mailing list