Author: markj
Date: Wed May 18 03:50:21 2016
New Revision: 300109
URL: https://svnweb.freebsd.org/changeset/base/300109

Log:
  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

Modified:
  head/sys/kern/subr_sleepqueue.c

Modified: head/sys/kern/subr_sleepqueue.c
==============================================================================
--- head/sys/kern/subr_sleepqueue.c     Wed May 18 03:50:18 2016        
(r300108)
+++ head/sys/kern/subr_sleepqueue.c     Wed May 18 03:50:21 2016        
(r300109)
@@ -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,
 
        /* 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);
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to