svn commit: r261045 - stable/10/sys/rpc
Alexander Motin
mav at FreeBSD.org
Wed Jan 22 23:42:31 UTC 2014
Author: mav
Date: Wed Jan 22 23:42:30 2014
New Revision: 261045
URL: http://svnweb.freebsd.org/changeset/base/261045
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/10/sys/rpc/svc.c
Directory Properties:
stable/10/ (props changed)
Modified: stable/10/sys/rpc/svc.c
==============================================================================
--- stable/10/sys/rpc/svc.c Wed Jan 22 23:00:29 2014 (r261044)
+++ stable/10/sys/rpc/svc.c Wed Jan 22 23:42:30 2014 (r261045)
@@ -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);
}
More information about the svn-src-stable-10
mailing list