Author: trociny
Date: Tue Dec 10 20:06:41 2013
New Revision: 259195
URL: http://svnweb.freebsd.org/changeset/base/259195

Log:
  Send wakeup to threads waiting on empty queue before releasing the
  lock to decrease spurious wakeups.
  
  Submitted by: davidxu
  MFC after:    2 weeks

Modified:
  head/sbin/hastd/primary.c
  head/sbin/hastd/secondary.c

Modified: head/sbin/hastd/primary.c
==============================================================================
--- head/sbin/hastd/primary.c   Tue Dec 10 20:05:07 2013        (r259194)
+++ head/sbin/hastd/primary.c   Tue Dec 10 20:06:41 2013        (r259195)
@@ -180,27 +180,21 @@ static pthread_mutex_t metadata_lock;
        ((res)->hr_remotein != NULL && (res)->hr_remoteout != NULL)
 
 #define        QUEUE_INSERT1(hio, name, ncomp) do {                            
\
-       bool _wakeup;                                                   \
-                                                                       \
        mtx_lock(&hio_##name##_list_lock[(ncomp)]);                     \
-       _wakeup = TAILQ_EMPTY(&hio_##name##_list[(ncomp)]);             \
+       if (TAILQ_EMPTY(&hio_##name##_list[(ncomp)]))                   \
+               cv_broadcast(&hio_##name##_list_cond[(ncomp)]);         \
        TAILQ_INSERT_TAIL(&hio_##name##_list[(ncomp)], (hio),           \
            hio_next[(ncomp)]);                                         \
        hio_##name##_list_size[(ncomp)]++;                              \
-       mtx_unlock(&hio_##name##_list_lock[ncomp]);                     \
-       if (_wakeup)                                                    \
-               cv_broadcast(&hio_##name##_list_cond[(ncomp)]);         \
+       mtx_unlock(&hio_##name##_list_lock[(ncomp)]);                   \
 } while (0)
 #define        QUEUE_INSERT2(hio, name)        do {                            
\
-       bool _wakeup;                                                   \
-                                                                       \
        mtx_lock(&hio_##name##_list_lock);                              \
-       _wakeup = TAILQ_EMPTY(&hio_##name##_list);                      \
+       if (TAILQ_EMPTY(&hio_##name##_list))                            \
+               cv_broadcast(&hio_##name##_list_cond);                  \
        TAILQ_INSERT_TAIL(&hio_##name##_list, (hio), hio_##name##_next);\
        hio_##name##_list_size++;                                       \
        mtx_unlock(&hio_##name##_list_lock);                            \
-       if (_wakeup)                                                    \
-               cv_broadcast(&hio_##name##_list_cond);                  \
 } while (0)
 #define        QUEUE_TAKE1(hio, name, ncomp, timeout)  do {                    
\
        bool _last;                                                     \

Modified: head/sbin/hastd/secondary.c
==============================================================================
--- head/sbin/hastd/secondary.c Tue Dec 10 20:05:07 2013        (r259194)
+++ head/sbin/hastd/secondary.c Tue Dec 10 20:06:41 2013        (r259195)
@@ -110,15 +110,12 @@ static void *disk_thread(void *arg);
 static void *send_thread(void *arg);
 
 #define        QUEUE_INSERT(name, hio) do {                                    
\
-       bool _wakeup;                                                   \
-                                                                       \
        mtx_lock(&hio_##name##_list_lock);                              \
-       _wakeup = TAILQ_EMPTY(&hio_##name##_list);                      \
+       if (TAILQ_EMPTY(&hio_##name##_list))                            \
+               cv_broadcast(&hio_##name##_list_cond);                  \
        TAILQ_INSERT_TAIL(&hio_##name##_list, (hio), hio_next);         \
        hio_##name##_list_size++;                                       \
        mtx_unlock(&hio_##name##_list_lock);                            \
-       if (_wakeup)                                                    \
-               cv_broadcast(&hio_##name##_list_cond);                  \
 } while (0)
 #define        QUEUE_TAKE(name, hio)   do {                                    
\
        mtx_lock(&hio_##name##_list_lock);                              \
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to