svn commit: r300109 - head/sys/kern

Mark Johnston markj at FreeBSD.org
Wed May 18 03:50:22 UTC 2016


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);


More information about the svn-src-head mailing list