[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: rwlock changes
> This diff does the following:
> - Use atomic ops directly, since rwlocks work the same way on all platforms.
> - Try to make it a bit more cache efficient, and use branch hints.
> - Fix a bug in rw_downgrade() where the turnstile lock was not released.
> - Remove a couple of redundant assertions.
> - Use atomic_swap instead of atomic_cas in one place where it's safe.
> - After acquiring turnstile lock in rw_vector_enter, check if owner is
> running again and spin if so.
> It also changes the handoff/release algorithm to work like this:
> * If we are releasing a write lock, then prefer to wake all
> * outstanding readers. Otherwise, wake one writer if there
> * are outstanding readers, or all writers if there are no
> * pending readers. If waking one specific writer, the writer
> * is handed the lock here. If waking multiple writers, we
> * set WRITE_WANTED to block out new readers, and let them
> * do the work of acquring the lock in rw_vector_enter().
> So, direct handoff is only done when there are readers involved (wakeing
> readers, or readers pending on the lock). Otherwise threads being awoken
> must acquire the lock themselves, making it work like an adaptive mutex in
> that case. It weakens the defence against starvation slightly but I'm
> fairly confident that it shouldn't be a problem.
> The sum of these changes is a reduction of 4% in build time on an 8-core
> machine. There is less idle time during the build because the windows where
> a rwlock can be held but the owner is not running is reduced.
- please keep the rw_owner bitfield comment.
- rw_swap needs RW_INHERITDEBUG.
Main Index |
Thread Index |