svn commit: r310423 - head/sys/kern
John Baldwin
jhb at freebsd.org
Thu Dec 22 18:39:18 UTC 2016
On Thursday, December 22, 2016 05:51:44 PM Mark Johnston wrote:
> Author: markj
> Date: Thu Dec 22 17:51:44 2016
> New Revision: 310423
> URL: https://svnweb.freebsd.org/changeset/base/310423
>
> Log:
> Revert part of r300109.
>
> The removal of TAILQ_FOREACH_SAFE introduced a small race: when the last
> thread on a sleepqueue is awoken, it reclaims the sleepqueue and may begin
> executing on a different CPU before sleepq_resume_thread() returns. This
> leaves a window during which it may go back to sleep and incorrectly be
> awoken again by the caller of sleepq_broadcast().
This is very subtle. The issue is that the last sleepq_resume_thread transfers
ownership of 'sq' from the wait channel that the sleepq_broadcast has locked,
to the thread being resumed. I thought about using a local TAILQ_HEAD and
using TAILQ_CONCAT to move the list of threads out of the sleep queue and then
walking that list. However, a comment explaining this transfer of ownership
(and that we can't safely access 'sq' after the last thread is resumed) is
probably sufficient (but necessary I think). Do you feel like adding one?
--
John Baldwin
More information about the svn-src-all
mailing list