diff options
author | mav <mav@FreeBSD.org> | 2014-01-22 23:42:30 +0000 |
---|---|---|
committer | mav <mav@FreeBSD.org> | 2014-01-22 23:42:30 +0000 |
commit | 096adafbe7f50ace9832ec8a705490ed1e29aa1f (patch) | |
tree | 3e2a4d3f970f0b402921df9f9f7c485f1dcc77b6 /sys/rpc/svc.c | |
parent | dfcbb7ef75f257e2d70d17554430df04b19b2618 (diff) | |
download | FreeBSD-src-096adafbe7f50ace9832ec8a705490ed1e29aa1f.zip FreeBSD-src-096adafbe7f50ace9832ec8a705490ed1e29aa1f.tar.gz |
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.
Diffstat (limited to 'sys/rpc/svc.c')
-rw-r--r-- | sys/rpc/svc.c | 48 |
1 files changed, 27 insertions, 21 deletions
diff --git a/sys/rpc/svc.c b/sys/rpc/svc.c index bbc6f6d..fbea16b 100644 --- a/sys/rpc/svc.c +++ b/sys/rpc/svc.c @@ -1011,6 +1011,18 @@ svc_run_internal(SVCPOOL *pool, bool_t ismaster) 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 ismaster) 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 ismaster) && !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); } |