Author: mav
Date: Thu Jan 23 00:26:24 2014
New Revision: 261056
URL: http://svnweb.freebsd.org/changeset/base/261056

Log:
  MFC r258132:
  Some minor tuning to rpc/svc.c:
   - close cosmetic race in svc_exit();
   - do not set wait timeout for idle threads if we have no use for wakeups;
   - create new requested thread sooner, not only after some another thread
  wakeup, that may happen later under constant load.

Modified:
  stable/9/sys/rpc/svc.c
Directory Properties:
  stable/9/   (props changed)
  stable/9/sys/   (props changed)

Modified: stable/9/sys/rpc/svc.c
==============================================================================
--- stable/9/sys/rpc/svc.c      Wed Jan 22 23:55:25 2014        (r261055)
+++ stable/9/sys/rpc/svc.c      Thu Jan 23 00:26:24 2014        (r261056)
@@ -1013,6 +1013,18 @@ svc_run_internal(SVCPOOL *pool, bool_t i
 
        while (pool->sp_state != SVCPOOL_CLOSING) {
                /*
+                * Create new thread if requested.
+                */
+               if (pool->sp_state == SVCPOOL_THREADWANTED) {
+                       pool->sp_state = SVCPOOL_THREADSTARTING;
+                       pool->sp_lastcreatetime = time_uptime;
+                       mtx_unlock(&pool->sp_lock);
+                       svc_new_thread(pool);
+                       mtx_lock(&pool->sp_lock);
+                       continue;
+               }
+
+               /*
                 * Check for idle transports once per second.
                 */
                if (time_uptime > pool->sp_lastidlecheck) {
@@ -1048,8 +1060,13 @@ svc_run_internal(SVCPOOL *pool, bool_t i
                                continue;
 
                        LIST_INSERT_HEAD(&pool->sp_idlethreads, st, st_ilink);
-                       error = cv_timedwait_sig(&st->st_cond, &pool->sp_lock,
-                               5 * hz);
+                       if (ismaster || (!ismaster &&
+                           pool->sp_threadcount > pool->sp_minthreads))
+                               error = cv_timedwait_sig(&st->st_cond,
+                                   &pool->sp_lock, 5 * hz);
+                       else
+                               error = cv_wait_sig(&st->st_cond,
+                                   &pool->sp_lock);
                        LIST_REMOVE(st, st_ilink);
 
                        /*
@@ -1062,24 +1079,11 @@ svc_run_internal(SVCPOOL *pool, bool_t i
                                        && !st->st_xprt
                                        && STAILQ_EMPTY(&st->st_reqs))
                                        break;
-                       }
-                       if (error == EWOULDBLOCK)
-                               continue;
-                       if (error) {
-                               if (pool->sp_state != SVCPOOL_CLOSING) {
-                                       mtx_unlock(&pool->sp_lock);
-                                       svc_exit(pool);
-                                       mtx_lock(&pool->sp_lock);
-                               }
-                               break;
-                       }
-
-                       if (pool->sp_state == SVCPOOL_THREADWANTED) {
-                               pool->sp_state = SVCPOOL_THREADSTARTING;
-                               pool->sp_lastcreatetime = time_uptime;
+                       } else if (error) {
                                mtx_unlock(&pool->sp_lock);
-                               svc_new_thread(pool);
+                               svc_exit(pool);
                                mtx_lock(&pool->sp_lock);
+                               break;
                        }
                        continue;
                }
@@ -1247,9 +1251,11 @@ svc_exit(SVCPOOL *pool)
 
        mtx_lock(&pool->sp_lock);
 
-       pool->sp_state = SVCPOOL_CLOSING;
-       LIST_FOREACH(st, &pool->sp_idlethreads, st_ilink)
-               cv_signal(&st->st_cond);
+       if (pool->sp_state != SVCPOOL_CLOSING) {
+               pool->sp_state = SVCPOOL_CLOSING;
+               LIST_FOREACH(st, &pool->sp_idlethreads, st_ilink)
+                       cv_signal(&st->st_cond);
+       }
 
        mtx_unlock(&pool->sp_lock);
 }
_______________________________________________
svn-src-stable-9@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-stable-9
To unsubscribe, send any mail to "svn-src-stable-9-unsubscr...@freebsd.org"

Reply via email to