svn commit: r282971 - in head/sys: kern sys
John Baldwin
jhb at freebsd.org
Fri May 15 15:34:02 UTC 2015
On Friday, May 15, 2015 01:50:38 PM John Baldwin wrote:
> Author: jhb
> Date: Fri May 15 13:50:37 2015
> New Revision: 282971
> URL: https://svnweb.freebsd.org/changeset/base/282971
>
> Log:
> Previously, cv_waiters was only updated by cv_signal or cv_wait. If a
> thread awakened due to a time out, then cv_waiters was not decremented.
> If INT_MAX threads timed out on a cv without an intervening cv_broadcast,
> then cv_waiters could overflow. To fix this, have each sleeping thread
> decrement cv_waiters when it resumes.
>
> Note that previously cv_waiters was protected by the sleepq chain lock.
> However, that lock is not held when threads resume from sleep. In
> addition, the interlock is also not always reacquired after resuming
> (cv_wait_unlock), nor is it always held by callers of cv_signal() or
> cv_broadcast(). Instead, use atomic ops to update cv_waiters. Since
> the sleepq chain lock is still held on every increment, it should
> still be safe to compare cv_waiters against zero while holding the
> lock in the wakeup routines as the only way the race should be lost
> would result in extra calls to sleepq_signal() or sleepq_broadcast().
>
> Differential Revision: https://reviews.freebsd.org/D2427
> Reviewed by: benno
> Reported by: benno (wrap of cv_waiters in the field)
> MFC after: 2 weeks
With the additional overhead of the atomic ops it might be worth running
some benchmarks to compare this with removing cv_waiters entirely. The
theoretical gain from cv_waiters is avoiding looking in the hash table for
a matching sleepqueue when there are no waiters. When cv_waiters was
a simple integer the cost of having it around was very small, so even a
tiny gain was worth having. (It is worth noting that in pre-SMPng code it
was fairly common practice to keep a "WANTED" flag around that was set by
waiters and would result in wakeup() being skipped if it wasn't set. These
flags were maintained by each caller, not centrally. cv_waiters makes this
sort of thing centrally maintained rather than something that each caller
has to do.) Now that cv_waiters is updated with atomics, the cost is not
quite as small.
--
John Baldwin
More information about the svn-src-all
mailing list