Our read/write lock implementation was not fair to writers. When
authorbluhm <bluhm@openbsd.org>
Tue, 10 May 2022 16:56:16 +0000 (16:56 +0000)
committerbluhm <bluhm@openbsd.org>
Tue, 10 May 2022 16:56:16 +0000 (16:56 +0000)
commitbde00a1f8f93d7f3c588055d3885cd7997949575
tree4a68b08eacf1bf3ed4391d1c6fbab9dd04e20861
parentb8680ecf6a053ff988e47d3641a924930be1befa
Our read/write lock implementation was not fair to writers.  When
multiple IP forwarding threads were processing packets and holding
the shared net lock, the exclusive net lock was blocked permanently.
This could result in ping times well above 10 seconds.
Add the RWLOCK_WRWANT bit to the check mask of readers.  Then they
cannot grab the lock if a writer is also waiting.  This logic was
already present in revision 1.3, but got lost during refactoring.
When exiting the lock, there exists a race when the RWLOCK_WRWANT
bit gets deleted.  Add a comment that was present until revision
1.8 to document it.  The race itself is not easy to fix and had no
impact during testing.
OK sashan@
sys/kern/kern_rwlock.c