Micro-optimize sleepq_broadcast().

- Avoid a conditional branch on the return value of sleepq_resume_thread()
  by ORing its return value into the boolean wakeup_swapper. This is
  consistent with other sleepqueue functions which just pass this return
  value to their caller.
- sleepq_resume_thread() unconditionally removes the thread from its queue,
  so there's no need to maintain a pointer to the next element in the queue.

MFC after:	2 weeks
This commit is contained in:
Mark Johnston 2016-05-18 03:50:21 +00:00
parent f9ce274675
commit d2f5f8db87
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=300109

View File

@ -865,7 +865,7 @@ int
sleepq_broadcast(void *wchan, int flags, int pri, int queue)
{
struct sleepqueue *sq;
struct thread *td, *tdn;
struct thread *td;
int wakeup_swapper;
CTR2(KTR_PROC, "sleepq_broadcast(%p, %d)", wchan, flags);
@ -879,10 +879,9 @@ sleepq_broadcast(void *wchan, int flags, int pri, int queue)
/* Resume all blocked threads on the sleep queue. */
wakeup_swapper = 0;
TAILQ_FOREACH_SAFE(td, &sq->sq_blocked[queue], td_slpq, tdn) {
while ((td = TAILQ_FIRST(&sq->sq_blocked[queue])) != NULL) {
thread_lock(td);
if (sleepq_resume_thread(sq, td, pri))
wakeup_swapper = 1;
wakeup_swapper |= sleepq_resume_thread(sq, td, pri);
thread_unlock(td);
}
return (wakeup_swapper);