Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 14 Nov 2013 13:51:54 +0000 (UTC)
From:      Alexander Motin <mav@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r258132 - head/sys/rpc
Message-ID:  <201311141351.rAEDpswE042416@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: mav
Date: Thu Nov 14 13:51:53 2013
New Revision: 258132
URL: http://svnweb.freebsd.org/changeset/base/258132

Log:
  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:
  head/sys/rpc/svc.c

Modified: head/sys/rpc/svc.c
==============================================================================
--- head/sys/rpc/svc.c	Thu Nov 14 13:33:22 2013	(r258131)
+++ head/sys/rpc/svc.c	Thu Nov 14 13:51:53 2013	(r258132)
@@ -1011,6 +1011,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) {
@@ -1046,8 +1058,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);
 
 			/*
@@ -1060,24 +1077,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;
 		}
@@ -1245,9 +1249,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);
 }



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201311141351.rAEDpswE042416>