about summary refs log tree commit homepage
diff options
context:
space:
mode:
authorEric Wong <normalperson@yhbt.net>2013-08-31 03:14:40 +0000
committerEric Wong <normalperson@yhbt.net>2013-08-31 03:19:15 +0000
commit3a9a1c5cada0630c499fcf42dfb5b38d11694844 (patch)
tree0f991e75b6528d00064e8965eb3c453c65a7abf2
parent3d55af133e1da342a7eb52c3dc099daf4ed6acf6 (diff)
downloadcmogstored-3a9a1c5cada0630c499fcf42dfb5b38d11694844.tar.gz
Otherwise, reenqueue-ing only one mfd at-a-time is pointless
and prevents cmogstored from utilizing new threads.
-rw-r--r--ioq.c29
1 files changed, 26 insertions, 3 deletions
diff --git a/ioq.c b/ioq.c
index f7af1ab..154a84e 100644
--- a/ioq.c
+++ b/ioq.c
@@ -176,14 +176,37 @@ bool mog_ioq_contended(void)
  */
 void mog_ioq_adjust(struct mog_ioq *ioq, unsigned value)
 {
+        struct mog_fd *mfd = NULL;
+        unsigned prev;
+
         assert(value > 0 && "mog_ioq_adjust value must be non-zero");
         CHECK(int, 0, pthread_mutex_lock(&ioq->mtx));
+        prev = ioq->max;
         ioq->max = value;
 
-        /* capacity reduced, get some threads to yield themselves */
-        if (ioq->cur > ioq->max)
+        if (ioq->cur > ioq->max) {
+                /* capacity reduced, get some threads to yield themselves */
                 ioq_set_contended(ioq);
-
+        } else {
+                unsigned diff = value - prev;
+
+                ioq->cur += diff;
+
+                /*
+                 * wake up all sleepers we made capacity for.
+                 * unlike mog_ioq_next, we do not release ioq->mtx here
+                 * to avoid infinite looping
+                 */
+                while (diff--) {
+                        mfd = SIMPLEQ_FIRST(&ioq->ioq_head);
+                        if (!mfd)
+                                break;
+
+                        SIMPLEQ_REMOVE_HEAD(&ioq->ioq_head, ioqent);
+                        TRACE(CMOGSTORED_IOQ_RESCHEDULE(mfd->fd));
+                        mog_activeq_push(ioq->svc->queue, mfd);
+                }
+        }
         CHECK(int, 0, pthread_mutex_unlock(&ioq->mtx));
 }