Lines Matching +full:- +full:grp
3 /*-
4 * SPDX-License-Identifier: BSD-3-Clause
11 * - Redistributions of source code must retain the above copyright notice,
13 * - Redistributions in binary form must reproduce the above copyright notice,
16 * - Neither the name of Sun Microsystems, Inc. nor the names of its
35 * svc.c, Server-side remote procedure call interface.
70 #define version_keepquiet(xp) (SVC_EXT(xp)->xp_flags & SVC_VERSQUIET)
74 static void svc_new_thread(SVCGROUP *grp);
90 SVCGROUP *grp; in svcpool_create() local
95 mtx_init(&pool->sp_lock, "sp_lock", NULL, MTX_DEF); in svcpool_create()
96 pool->sp_name = name; in svcpool_create()
97 pool->sp_state = SVCPOOL_INIT; in svcpool_create()
98 pool->sp_proc = NULL; in svcpool_create()
99 TAILQ_INIT(&pool->sp_callouts); in svcpool_create()
100 TAILQ_INIT(&pool->sp_lcallouts); in svcpool_create()
101 pool->sp_minthreads = 1; in svcpool_create()
102 pool->sp_maxthreads = 1; in svcpool_create()
103 pool->sp_groupcount = 1; in svcpool_create()
105 grp = &pool->sp_groups[g]; in svcpool_create()
106 mtx_init(&grp->sg_lock, "sg_lock", NULL, MTX_DEF); in svcpool_create()
107 grp->sg_pool = pool; in svcpool_create()
108 grp->sg_state = SVCPOOL_ACTIVE; in svcpool_create()
109 TAILQ_INIT(&grp->sg_xlist); in svcpool_create()
110 TAILQ_INIT(&grp->sg_active); in svcpool_create()
111 LIST_INIT(&grp->sg_idlethreads); in svcpool_create()
112 grp->sg_minthreads = 1; in svcpool_create()
113 grp->sg_maxthreads = 1; in svcpool_create()
123 pool->sp_space_high = (u_long)nmbclusters * MCLBYTES / 4; in svcpool_create()
124 pool->sp_space_low = (pool->sp_space_high / 3) * 2; in svcpool_create()
126 sysctl_ctx_init(&pool->sp_sysctl); in svcpool_create()
128 SYSCTL_ADD_PROC(&pool->sp_sysctl, sysctl_base, OID_AUTO, in svcpool_create()
132 SYSCTL_ADD_PROC(&pool->sp_sysctl, sysctl_base, OID_AUTO, in svcpool_create()
136 SYSCTL_ADD_PROC(&pool->sp_sysctl, sysctl_base, OID_AUTO, in svcpool_create()
140 SYSCTL_ADD_INT(&pool->sp_sysctl, sysctl_base, OID_AUTO, in svcpool_create()
141 "groups", CTLFLAG_RD, &pool->sp_groupcount, 0, in svcpool_create()
144 SYSCTL_ADD_ULONG(&pool->sp_sysctl, sysctl_base, OID_AUTO, in svcpool_create()
146 &pool->sp_space_used, in svcpool_create()
149 SYSCTL_ADD_ULONG(&pool->sp_sysctl, sysctl_base, OID_AUTO, in svcpool_create()
151 &pool->sp_space_used_highest, in svcpool_create()
154 SYSCTL_ADD_ULONG(&pool->sp_sysctl, sysctl_base, OID_AUTO, in svcpool_create()
156 &pool->sp_space_high, in svcpool_create()
159 SYSCTL_ADD_ULONG(&pool->sp_sysctl, sysctl_base, OID_AUTO, in svcpool_create()
161 &pool->sp_space_low, in svcpool_create()
164 SYSCTL_ADD_INT(&pool->sp_sysctl, sysctl_base, OID_AUTO, in svcpool_create()
166 &pool->sp_space_throttled, 0, in svcpool_create()
169 SYSCTL_ADD_INT(&pool->sp_sysctl, sysctl_base, OID_AUTO, in svcpool_create()
171 &pool->sp_space_throttle_count, 0, in svcpool_create()
185 SVCGROUP *grp; in svcpool_cleanup() local
195 grp = &pool->sp_groups[g]; in svcpool_cleanup()
196 mtx_lock(&grp->sg_lock); in svcpool_cleanup()
197 while ((xprt = TAILQ_FIRST(&grp->sg_xlist)) != NULL) { in svcpool_cleanup()
201 mtx_unlock(&grp->sg_lock); in svcpool_cleanup()
204 if (xprt->xp_socket != NULL) in svcpool_cleanup()
205 soshutdown(xprt->xp_socket, SHUT_WR); in svcpool_cleanup()
209 mtx_lock(&pool->sp_lock); in svcpool_cleanup()
210 while ((s = TAILQ_FIRST(&pool->sp_callouts)) != NULL) { in svcpool_cleanup()
211 mtx_unlock(&pool->sp_lock); in svcpool_cleanup()
212 svc_unreg(pool, s->sc_prog, s->sc_vers); in svcpool_cleanup()
213 mtx_lock(&pool->sp_lock); in svcpool_cleanup()
215 while ((sl = TAILQ_FIRST(&pool->sp_lcallouts)) != NULL) { in svcpool_cleanup()
216 mtx_unlock(&pool->sp_lock); in svcpool_cleanup()
217 svc_loss_unreg(pool, sl->slc_dispatch); in svcpool_cleanup()
218 mtx_lock(&pool->sp_lock); in svcpool_cleanup()
220 mtx_unlock(&pool->sp_lock); in svcpool_cleanup()
226 SVCGROUP *grp; in svcpool_destroy() local
232 grp = &pool->sp_groups[g]; in svcpool_destroy()
233 mtx_destroy(&grp->sg_lock); in svcpool_destroy()
235 mtx_destroy(&pool->sp_lock); in svcpool_destroy()
237 if (pool->sp_rcache) in svcpool_destroy()
238 replay_freecache(pool->sp_rcache); in svcpool_destroy()
240 sysctl_ctx_free(&pool->sp_sysctl); in svcpool_destroy()
251 SVCGROUP *grp; in svcpool_close() local
257 mtx_lock(&pool->sp_lock); in svcpool_close()
258 pool->sp_state = SVCPOOL_INIT; in svcpool_close()
259 mtx_unlock(&pool->sp_lock); in svcpool_close()
261 grp = &pool->sp_groups[g]; in svcpool_close()
262 mtx_lock(&grp->sg_lock); in svcpool_close()
263 grp->sg_state = SVCPOOL_ACTIVE; in svcpool_close()
264 mtx_unlock(&grp->sg_lock); in svcpool_close()
277 pool = oidp->oid_arg1; in svcpool_threads_sysctl()
279 mtx_lock(&pool->sp_lock); in svcpool_threads_sysctl()
280 for (g = 0; g < pool->sp_groupcount; g++) in svcpool_threads_sysctl()
281 threads += pool->sp_groups[g].sg_threadcount; in svcpool_threads_sysctl()
282 mtx_unlock(&pool->sp_lock); in svcpool_threads_sysctl()
296 pool = oidp->oid_arg1; in svcpool_minthread_sysctl()
297 newminthreads = pool->sp_minthreads; in svcpool_minthread_sysctl()
299 if (error == 0 && newminthreads != pool->sp_minthreads) { in svcpool_minthread_sysctl()
300 if (newminthreads > pool->sp_maxthreads) in svcpool_minthread_sysctl()
302 mtx_lock(&pool->sp_lock); in svcpool_minthread_sysctl()
303 pool->sp_minthreads = newminthreads; in svcpool_minthread_sysctl()
304 for (g = 0; g < pool->sp_groupcount; g++) { in svcpool_minthread_sysctl()
305 pool->sp_groups[g].sg_minthreads = max(1, in svcpool_minthread_sysctl()
306 pool->sp_minthreads / pool->sp_groupcount); in svcpool_minthread_sysctl()
308 mtx_unlock(&pool->sp_lock); in svcpool_minthread_sysctl()
322 pool = oidp->oid_arg1; in svcpool_maxthread_sysctl()
323 newmaxthreads = pool->sp_maxthreads; in svcpool_maxthread_sysctl()
325 if (error == 0 && newmaxthreads != pool->sp_maxthreads) { in svcpool_maxthread_sysctl()
326 if (newmaxthreads < pool->sp_minthreads) in svcpool_maxthread_sysctl()
328 mtx_lock(&pool->sp_lock); in svcpool_maxthread_sysctl()
329 pool->sp_maxthreads = newmaxthreads; in svcpool_maxthread_sysctl()
330 for (g = 0; g < pool->sp_groupcount; g++) { in svcpool_maxthread_sysctl()
331 pool->sp_groups[g].sg_maxthreads = max(1, in svcpool_maxthread_sysctl()
332 pool->sp_maxthreads / pool->sp_groupcount); in svcpool_maxthread_sysctl()
334 mtx_unlock(&pool->sp_lock); in svcpool_maxthread_sysctl()
345 SVCPOOL *pool = xprt->xp_pool; in xprt_register()
346 SVCGROUP *grp; in xprt_register() local
350 g = atomic_fetchadd_int(&pool->sp_nextgroup, 1) % pool->sp_groupcount; in xprt_register()
351 xprt->xp_group = grp = &pool->sp_groups[g]; in xprt_register()
352 mtx_lock(&grp->sg_lock); in xprt_register()
353 xprt->xp_registered = TRUE; in xprt_register()
354 xprt->xp_active = FALSE; in xprt_register()
355 TAILQ_INSERT_TAIL(&grp->sg_xlist, xprt, xp_link); in xprt_register()
356 mtx_unlock(&grp->sg_lock); in xprt_register()
360 * De-activate a transport handle. Note: the locked version doesn't
361 * release the transport - caller must do that after dropping the pool
367 SVCGROUP *grp = xprt->xp_group; in xprt_unregister_locked() local
369 mtx_assert(&grp->sg_lock, MA_OWNED); in xprt_unregister_locked()
370 KASSERT(xprt->xp_registered == TRUE, in xprt_unregister_locked()
373 TAILQ_REMOVE(&grp->sg_xlist, xprt, xp_link); in xprt_unregister_locked()
374 xprt->xp_registered = FALSE; in xprt_unregister_locked()
380 SVCGROUP *grp = xprt->xp_group; in xprt_unregister() local
382 mtx_lock(&grp->sg_lock); in xprt_unregister()
383 if (xprt->xp_registered == FALSE) { in xprt_unregister()
385 mtx_unlock(&grp->sg_lock); in xprt_unregister()
389 mtx_unlock(&grp->sg_lock); in xprt_unregister()
391 if (xprt->xp_socket != NULL) in xprt_unregister()
392 soshutdown(xprt->xp_socket, SHUT_WR); in xprt_unregister()
402 SVCGROUP *grp = xprt->xp_group; in xprt_assignthread() local
405 mtx_assert(&grp->sg_lock, MA_OWNED); in xprt_assignthread()
406 st = LIST_FIRST(&grp->sg_idlethreads); in xprt_assignthread()
410 xprt->xp_thread = st; in xprt_assignthread()
411 st->st_xprt = xprt; in xprt_assignthread()
412 cv_signal(&st->st_cond); in xprt_assignthread()
423 if (grp->sg_state == SVCPOOL_ACTIVE in xprt_assignthread()
424 && grp->sg_lastcreatetime < time_uptime in xprt_assignthread()
425 && grp->sg_threadcount < grp->sg_maxthreads) { in xprt_assignthread()
426 grp->sg_state = SVCPOOL_THREADWANTED; in xprt_assignthread()
435 SVCGROUP *grp = xprt->xp_group; in xprt_active() local
437 mtx_lock(&grp->sg_lock); in xprt_active()
439 if (!xprt->xp_registered) { in xprt_active()
441 * Race with xprt_unregister - we lose. in xprt_active()
443 mtx_unlock(&grp->sg_lock); in xprt_active()
447 if (!xprt->xp_active) { in xprt_active()
448 xprt->xp_active = TRUE; in xprt_active()
449 if (xprt->xp_thread == NULL) { in xprt_active()
450 if (!svc_request_space_available(xprt->xp_pool) || in xprt_active()
452 TAILQ_INSERT_TAIL(&grp->sg_active, xprt, in xprt_active()
457 mtx_unlock(&grp->sg_lock); in xprt_active()
463 SVCGROUP *grp = xprt->xp_group; in xprt_inactive_locked() local
465 mtx_assert(&grp->sg_lock, MA_OWNED); in xprt_inactive_locked()
466 if (xprt->xp_active) { in xprt_inactive_locked()
467 if (xprt->xp_thread == NULL) in xprt_inactive_locked()
468 TAILQ_REMOVE(&grp->sg_active, xprt, xp_alink); in xprt_inactive_locked()
469 xprt->xp_active = FALSE; in xprt_inactive_locked()
476 SVCGROUP *grp = xprt->xp_group; in xprt_inactive() local
478 mtx_lock(&grp->sg_lock); in xprt_inactive()
480 mtx_unlock(&grp->sg_lock); in xprt_inactive()
491 KASSERT(xprt->xp_thread != NULL, in xprt_inactive_self()
493 xprt->xp_active = FALSE; in xprt_inactive_self()
506 SVCPOOL *pool = xprt->xp_pool; in svc_reg()
513 if (xprt->xp_netid) { in svc_reg()
514 netid = strdup(xprt->xp_netid, M_RPC); in svc_reg()
516 } else if (nconf && nconf->nc_netid) { in svc_reg()
517 netid = strdup(nconf->nc_netid, M_RPC); in svc_reg()
524 mtx_lock(&pool->sp_lock); in svc_reg()
528 if (s->sc_dispatch == dispatch) in svc_reg()
530 mtx_unlock(&pool->sp_lock); in svc_reg()
537 mtx_unlock(&pool->sp_lock); in svc_reg()
541 s->sc_prog = prog; in svc_reg()
542 s->sc_vers = vers; in svc_reg()
543 s->sc_dispatch = dispatch; in svc_reg()
544 s->sc_netid = netid; in svc_reg()
545 TAILQ_INSERT_TAIL(&pool->sp_callouts, s, sc_link); in svc_reg()
547 if ((xprt->xp_netid == NULL) && (flag == 1) && netid) in svc_reg()
548 ((SVCXPRT *) xprt)->xp_netid = strdup(netid, M_RPC); in svc_reg()
551 mtx_unlock(&pool->sp_lock); in svc_reg()
558 nb.buf = &xprt->xp_ltaddr; in svc_reg()
559 nb.len = xprt->xp_ltaddr.ss_len; in svc_reg()
576 mtx_lock(&pool->sp_lock); in svc_unreg()
578 TAILQ_REMOVE(&pool->sp_callouts, s, sc_link); in svc_unreg()
579 if (s->sc_netid) in svc_unreg()
580 mem_free(s->sc_netid, sizeof (s->sc_netid) + 1); in svc_unreg()
583 mtx_unlock(&pool->sp_lock); in svc_unreg()
593 SVCPOOL *pool = xprt->xp_pool; in svc_loss_reg()
596 mtx_lock(&pool->sp_lock); in svc_loss_reg()
597 TAILQ_FOREACH(s, &pool->sp_lcallouts, slc_link) { in svc_loss_reg()
598 if (s->slc_dispatch == dispatch) in svc_loss_reg()
602 mtx_unlock(&pool->sp_lock); in svc_loss_reg()
607 mtx_unlock(&pool->sp_lock); in svc_loss_reg()
610 s->slc_dispatch = dispatch; in svc_loss_reg()
611 TAILQ_INSERT_TAIL(&pool->sp_lcallouts, s, slc_link); in svc_loss_reg()
612 mtx_unlock(&pool->sp_lock); in svc_loss_reg()
624 mtx_lock(&pool->sp_lock); in svc_loss_unreg()
625 TAILQ_FOREACH(s, &pool->sp_lcallouts, slc_link) { in svc_loss_unreg()
626 if (s->slc_dispatch == dispatch) { in svc_loss_unreg()
627 TAILQ_REMOVE(&pool->sp_lcallouts, s, slc_link); in svc_loss_unreg()
632 mtx_unlock(&pool->sp_lock); in svc_loss_unreg()
646 mtx_assert(&pool->sp_lock, MA_OWNED); in svc_find()
647 TAILQ_FOREACH(s, &pool->sp_callouts, sc_link) { in svc_find()
648 if (s->sc_prog == prog && s->sc_vers == vers in svc_find()
649 && (netid == NULL || s->sc_netid == NULL || in svc_find()
650 strcmp(netid, s->sc_netid) == 0)) in svc_find()
663 SVCXPRT *xprt = rqstp->rq_xprt; in svc_sendreply_common()
666 if (rqstp->rq_args) { in svc_sendreply_common()
667 m_freem(rqstp->rq_args); in svc_sendreply_common()
668 rqstp->rq_args = NULL; in svc_sendreply_common()
671 if (xprt->xp_pool->sp_rcache) in svc_sendreply_common()
672 replay_setreply(xprt->xp_pool->sp_rcache, in svc_sendreply_common()
675 if (!SVCAUTH_WRAP(&rqstp->rq_auth, &body)) in svc_sendreply_common()
678 ok = SVC_REPLY(xprt, rply, rqstp->rq_addr, body, &rqstp->rq_reply_seq); in svc_sendreply_common()
679 if (rqstp->rq_addr) { in svc_sendreply_common()
680 free(rqstp->rq_addr, M_SONAME); in svc_sendreply_common()
681 rqstp->rq_addr = NULL; in svc_sendreply_common()
698 rply.rm_xid = rqstp->rq_xid; in svc_sendreply()
701 rply.acpted_rply.ar_verf = rqstp->rq_verf; in svc_sendreply()
724 rply.rm_xid = rqstp->rq_xid; in svc_sendreply_mbuf()
727 rply.acpted_rply.ar_verf = rqstp->rq_verf; in svc_sendreply_mbuf()
741 SVCXPRT *xprt = rqstp->rq_xprt; in svcerr_noproc()
744 rply.rm_xid = rqstp->rq_xid; in svcerr_noproc()
747 rply.acpted_rply.ar_verf = rqstp->rq_verf; in svcerr_noproc()
750 if (xprt->xp_pool->sp_rcache) in svcerr_noproc()
751 replay_setreply(xprt->xp_pool->sp_rcache, in svcerr_noproc()
763 SVCXPRT *xprt = rqstp->rq_xprt; in svcerr_decode()
766 rply.rm_xid = rqstp->rq_xid; in svcerr_decode()
769 rply.acpted_rply.ar_verf = rqstp->rq_verf; in svcerr_decode()
772 if (xprt->xp_pool->sp_rcache) in svcerr_decode()
773 replay_setreply(xprt->xp_pool->sp_rcache, in svcerr_decode()
774 &rply, (struct sockaddr *) &xprt->xp_rtaddr, NULL); in svcerr_decode()
785 SVCXPRT *xprt = rqstp->rq_xprt; in svcerr_systemerr()
788 rply.rm_xid = rqstp->rq_xid; in svcerr_systemerr()
791 rply.acpted_rply.ar_verf = rqstp->rq_verf; in svcerr_systemerr()
794 if (xprt->xp_pool->sp_rcache) in svcerr_systemerr()
795 replay_setreply(xprt->xp_pool->sp_rcache, in svcerr_systemerr()
807 SVCXPRT *xprt = rqstp->rq_xprt; in svcerr_auth()
810 rply.rm_xid = rqstp->rq_xid; in svcerr_auth()
816 if (xprt->xp_pool->sp_rcache) in svcerr_auth()
817 replay_setreply(xprt->xp_pool->sp_rcache, in svcerr_auth()
839 SVCXPRT *xprt = rqstp->rq_xprt; in svcerr_noprog()
842 rply.rm_xid = rqstp->rq_xid; in svcerr_noprog()
845 rply.acpted_rply.ar_verf = rqstp->rq_verf; in svcerr_noprog()
848 if (xprt->xp_pool->sp_rcache) in svcerr_noprog()
849 replay_setreply(xprt->xp_pool->sp_rcache, in svcerr_noprog()
861 SVCXPRT *xprt = rqstp->rq_xprt; in svcerr_progvers()
864 rply.rm_xid = rqstp->rq_xid; in svcerr_progvers()
867 rply.acpted_rply.ar_verf = rqstp->rq_verf; in svcerr_progvers()
872 if (xprt->xp_pool->sp_rcache) in svcerr_progvers()
873 replay_setreply(xprt->xp_pool->sp_rcache, in svcerr_progvers()
893 xprt->xp_p3 = ext; in svc_xprt_alloc()
894 refcount_init(&xprt->xp_refs, 1); in svc_xprt_alloc()
906 mem_free(xprt->xp_p3, sizeof(SVCXPRT_EXT)); in svc_xprt_free()
908 mem_free(xprt->xp_gidp, 0); in svc_xprt_free()
922 SVCPOOL *pool = xprt->xp_pool; in svc_getreq()
932 msg.rm_call.cb_cred.oa_base = r->rq_credarea; in svc_getreq()
933 msg.rm_call.cb_verf.oa_base = &r->rq_credarea[MAX_AUTH_BYTES]; in svc_getreq()
934 r->rq_clntcred = &r->rq_credarea[2*MAX_AUTH_BYTES]; in svc_getreq()
935 if (SVC_RECV(xprt, &msg, &r->rq_addr, &args)) { in svc_getreq()
943 r->rq_xprt = xprt; in svc_getreq()
944 if (pool->sp_rcache) { in svc_getreq()
948 rs = replay_find(pool->sp_rcache, &msg, in svc_getreq()
954 SVC_REPLY(xprt, &repmsg, r->rq_addr, in svc_getreq()
955 repbody, &r->rq_reply_seq); in svc_getreq()
956 if (r->rq_addr) { in svc_getreq()
957 free(r->rq_addr, M_SONAME); in svc_getreq()
958 r->rq_addr = NULL; in svc_getreq()
969 r->rq_xid = msg.rm_xid; in svc_getreq()
970 r->rq_prog = msg.rm_call.cb_prog; in svc_getreq()
971 r->rq_vers = msg.rm_call.cb_vers; in svc_getreq()
972 r->rq_proc = msg.rm_call.cb_proc; in svc_getreq()
973 r->rq_size = sizeof(*r) + m_length(args, NULL); in svc_getreq()
974 r->rq_args = args; in svc_getreq()
988 if (!SVCAUTH_UNWRAP(&r->rq_auth, &r->rq_args)) { in svc_getreq()
994 * Defer enabling DDP until the first non-NULLPROC RPC in svc_getreq()
998 if (xprt->xp_doneddp == 0 && r->rq_proc != NULLPROC && in svc_getreq()
999 xprt->xp_socket != NULL && in svc_getreq()
1000 atomic_cmpset_int(&xprt->xp_doneddp, 0, 1)) { in svc_getreq()
1001 if (xprt->xp_socket->so_proto->pr_protocol == in svc_getreq()
1005 (void)so_setsockopt(xprt->xp_socket, in svc_getreq()
1023 TAILQ_FOREACH(s, &pool->sp_lcallouts, slc_link) in svc_getreq()
1024 (*s->slc_dispatch)(xprt); in svc_getreq()
1034 SVCXPRT *xprt = rqstp->rq_xprt; in svc_executereq()
1035 SVCPOOL *pool = xprt->xp_pool; in svc_executereq()
1043 low_vers = (rpcvers_t) -1L; in svc_executereq()
1045 TAILQ_FOREACH(s, &pool->sp_callouts, sc_link) { in svc_executereq()
1046 if (s->sc_prog == rqstp->rq_prog) { in svc_executereq()
1047 if (s->sc_vers == rqstp->rq_vers) { in svc_executereq()
1050 * dispatch method - they must call in svc_executereq()
1053 (*s->sc_dispatch)(rqstp, xprt); in svc_executereq()
1057 if (s->sc_vers < low_vers) in svc_executereq()
1058 low_vers = s->sc_vers; in svc_executereq()
1059 if (s->sc_vers > high_vers) in svc_executereq()
1060 high_vers = s->sc_vers; in svc_executereq()
1077 svc_checkidle(SVCGROUP *grp) in svc_checkidle() argument
1084 TAILQ_FOREACH_SAFE(xprt, &grp->sg_xlist, xp_link, nxprt) { in svc_checkidle()
1089 if (!xprt->xp_idletimeout || xprt->xp_thread) in svc_checkidle()
1092 timo = xprt->xp_lastactive + xprt->xp_idletimeout; in svc_checkidle()
1099 mtx_unlock(&grp->sg_lock); in svc_checkidle()
1101 soshutdown(xprt->xp_socket, SHUT_WR); in svc_checkidle()
1104 mtx_lock(&grp->sg_lock); in svc_checkidle()
1110 SVCGROUP *grp; in svc_assign_waiting_sockets() local
1114 for (g = 0; g < pool->sp_groupcount; g++) { in svc_assign_waiting_sockets()
1115 grp = &pool->sp_groups[g]; in svc_assign_waiting_sockets()
1116 mtx_lock(&grp->sg_lock); in svc_assign_waiting_sockets()
1117 while ((xprt = TAILQ_FIRST(&grp->sg_active)) != NULL) { in svc_assign_waiting_sockets()
1119 TAILQ_REMOVE(&grp->sg_active, xprt, xp_alink); in svc_assign_waiting_sockets()
1123 mtx_unlock(&grp->sg_lock); in svc_assign_waiting_sockets()
1132 value = atomic_fetchadd_long(&pool->sp_space_used, delta) + delta; in svc_change_space_used()
1134 if (value >= pool->sp_space_high && !pool->sp_space_throttled) { in svc_change_space_used()
1135 pool->sp_space_throttled = TRUE; in svc_change_space_used()
1136 pool->sp_space_throttle_count++; in svc_change_space_used()
1138 if (value > pool->sp_space_used_highest) in svc_change_space_used()
1139 pool->sp_space_used_highest = value; in svc_change_space_used()
1141 if (value < pool->sp_space_low && pool->sp_space_throttled) { in svc_change_space_used()
1142 pool->sp_space_throttled = FALSE; in svc_change_space_used()
1152 if (pool->sp_space_throttled) in svc_request_space_available()
1158 svc_run_internal(SVCGROUP *grp, bool_t ismaster) in svc_run_internal() argument
1160 SVCPOOL *pool = grp->sg_pool; in svc_run_internal()
1170 mtx_init(&st->st_lock, "st_lock", NULL, MTX_DEF); in svc_run_internal()
1171 st->st_pool = pool; in svc_run_internal()
1172 st->st_xprt = NULL; in svc_run_internal()
1173 STAILQ_INIT(&st->st_reqs); in svc_run_internal()
1174 cv_init(&st->st_cond, "rpcsvc"); in svc_run_internal()
1176 mtx_lock(&grp->sg_lock); in svc_run_internal()
1182 if (grp->sg_state == SVCPOOL_THREADSTARTING) in svc_run_internal()
1183 grp->sg_state = SVCPOOL_ACTIVE; in svc_run_internal()
1185 while (grp->sg_state != SVCPOOL_CLOSING) { in svc_run_internal()
1189 if (grp->sg_state == SVCPOOL_THREADWANTED) { in svc_run_internal()
1190 grp->sg_state = SVCPOOL_THREADSTARTING; in svc_run_internal()
1191 grp->sg_lastcreatetime = time_uptime; in svc_run_internal()
1192 mtx_unlock(&grp->sg_lock); in svc_run_internal()
1193 svc_new_thread(grp); in svc_run_internal()
1194 mtx_lock(&grp->sg_lock); in svc_run_internal()
1201 if (time_uptime > grp->sg_lastidlecheck) { in svc_run_internal()
1202 grp->sg_lastidlecheck = time_uptime; in svc_run_internal()
1203 svc_checkidle(grp); in svc_run_internal()
1206 xprt = st->st_xprt; in svc_run_internal()
1211 if (!ismaster && grp->sg_threadcount > in svc_run_internal()
1212 grp->sg_maxthreads) in svc_run_internal()
1221 (xprt = TAILQ_FIRST(&grp->sg_active)) != NULL) { in svc_run_internal()
1222 TAILQ_REMOVE(&grp->sg_active, xprt, xp_alink); in svc_run_internal()
1224 xprt->xp_thread = st; in svc_run_internal()
1225 st->st_xprt = xprt; in svc_run_internal()
1229 LIST_INSERT_HEAD(&grp->sg_idlethreads, st, st_ilink); in svc_run_internal()
1231 grp->sg_threadcount > grp->sg_minthreads)) in svc_run_internal()
1232 error = cv_timedwait_sig(&st->st_cond, in svc_run_internal()
1233 &grp->sg_lock, 5 * hz); in svc_run_internal()
1235 error = cv_wait_sig(&st->st_cond, in svc_run_internal()
1236 &grp->sg_lock); in svc_run_internal()
1237 if (st->st_xprt == NULL) in svc_run_internal()
1245 && (grp->sg_threadcount in svc_run_internal()
1246 > grp->sg_minthreads) in svc_run_internal()
1247 && !st->st_xprt) in svc_run_internal()
1251 ("non-signal error %d", error)); in svc_run_internal()
1252 mtx_unlock(&grp->sg_lock); in svc_run_internal()
1256 (p->p_flag & P_TOTAL_STOP) != 0) { in svc_run_internal()
1259 mtx_lock(&grp->sg_lock); in svc_run_internal()
1263 mtx_lock(&grp->sg_lock); in svc_run_internal()
1269 mtx_unlock(&grp->sg_lock); in svc_run_internal()
1274 xprt->xp_lastactive = time_uptime; in svc_run_internal()
1281 svc_change_space_used(pool, rqstp->rq_size); in svc_run_internal()
1286 if (pool->sp_assign) { in svc_run_internal()
1287 stpref = pool->sp_assign(st, rqstp); in svc_run_internal()
1288 rqstp->rq_thread = stpref; in svc_run_internal()
1289 STAILQ_INSERT_TAIL(&stpref->st_reqs, in svc_run_internal()
1291 mtx_unlock(&stpref->st_lock); in svc_run_internal()
1295 rqstp->rq_thread = st; in svc_run_internal()
1296 STAILQ_INSERT_TAIL(&st->st_reqs, in svc_run_internal()
1301 && grp->sg_state != SVCPOOL_CLOSING); in svc_run_internal()
1309 mtx_lock(&grp->sg_lock); in svc_run_internal()
1310 xprt->xp_thread = NULL; in svc_run_internal()
1311 st->st_xprt = NULL; in svc_run_internal()
1312 if (xprt->xp_active) { in svc_run_internal()
1315 TAILQ_INSERT_TAIL(&grp->sg_active, in svc_run_internal()
1318 mtx_unlock(&grp->sg_lock); in svc_run_internal()
1324 mtx_lock(&st->st_lock); in svc_run_internal()
1325 while ((rqstp = STAILQ_FIRST(&st->st_reqs)) != NULL) { in svc_run_internal()
1326 STAILQ_REMOVE_HEAD(&st->st_reqs, rq_link); in svc_run_internal()
1327 mtx_unlock(&st->st_lock); in svc_run_internal()
1328 sz = (long)rqstp->rq_size; in svc_run_internal()
1330 svc_change_space_used(pool, -sz); in svc_run_internal()
1331 mtx_lock(&st->st_lock); in svc_run_internal()
1333 mtx_unlock(&st->st_lock); in svc_run_internal()
1334 mtx_lock(&grp->sg_lock); in svc_run_internal()
1337 if (st->st_xprt) { in svc_run_internal()
1338 xprt = st->st_xprt; in svc_run_internal()
1339 st->st_xprt = NULL; in svc_run_internal()
1342 KASSERT(STAILQ_EMPTY(&st->st_reqs), ("stray reqs on exit")); in svc_run_internal()
1343 mtx_destroy(&st->st_lock); in svc_run_internal()
1344 cv_destroy(&st->st_cond); in svc_run_internal()
1347 grp->sg_threadcount--; in svc_run_internal()
1349 wakeup(grp); in svc_run_internal()
1350 mtx_unlock(&grp->sg_lock); in svc_run_internal()
1362 svc_new_thread(SVCGROUP *grp) in svc_new_thread() argument
1364 SVCPOOL *pool = grp->sg_pool; in svc_new_thread()
1367 mtx_lock(&grp->sg_lock); in svc_new_thread()
1368 grp->sg_threadcount++; in svc_new_thread()
1369 mtx_unlock(&grp->sg_lock); in svc_new_thread()
1370 kthread_add(svc_thread_start, grp, pool->sp_proc, &td, 0, 0, in svc_new_thread()
1371 "%s: service", pool->sp_name); in svc_new_thread()
1380 SVCGROUP *grp; in svc_run() local
1384 snprintf(td->td_name, sizeof(td->td_name), in svc_run()
1385 "%s: master", pool->sp_name); in svc_run()
1386 pool->sp_state = SVCPOOL_ACTIVE; in svc_run()
1387 pool->sp_proc = p; in svc_run()
1390 pool->sp_groupcount = max(1, min(SVC_MAXGROUPS, in svc_run()
1391 min(pool->sp_maxthreads / 2, mp_ncpus) / 6)); in svc_run()
1392 for (g = 0; g < pool->sp_groupcount; g++) { in svc_run()
1393 grp = &pool->sp_groups[g]; in svc_run()
1394 grp->sg_minthreads = max(1, in svc_run()
1395 pool->sp_minthreads / pool->sp_groupcount); in svc_run()
1396 grp->sg_maxthreads = max(1, in svc_run()
1397 pool->sp_maxthreads / pool->sp_groupcount); in svc_run()
1398 grp->sg_lastcreatetime = time_uptime; in svc_run()
1402 pool->sp_groups[0].sg_threadcount++; in svc_run()
1403 for (g = 0; g < pool->sp_groupcount; g++) { in svc_run()
1404 grp = &pool->sp_groups[g]; in svc_run()
1405 for (i = ((g == 0) ? 1 : 0); i < grp->sg_minthreads; i++) in svc_run()
1406 svc_new_thread(grp); in svc_run()
1408 svc_run_internal(&pool->sp_groups[0], TRUE); in svc_run()
1411 for (g = 0; g < pool->sp_groupcount; g++) { in svc_run()
1412 grp = &pool->sp_groups[g]; in svc_run()
1413 mtx_lock(&grp->sg_lock); in svc_run()
1414 while (grp->sg_threadcount > 0) in svc_run()
1415 msleep(grp, &grp->sg_lock, 0, "svcexit", 0); in svc_run()
1416 mtx_unlock(&grp->sg_lock); in svc_run()
1423 SVCGROUP *grp; in svc_exit() local
1427 pool->sp_state = SVCPOOL_CLOSING; in svc_exit()
1428 for (g = 0; g < pool->sp_groupcount; g++) { in svc_exit()
1429 grp = &pool->sp_groups[g]; in svc_exit()
1430 mtx_lock(&grp->sg_lock); in svc_exit()
1431 if (grp->sg_state != SVCPOOL_CLOSING) { in svc_exit()
1432 grp->sg_state = SVCPOOL_CLOSING; in svc_exit()
1433 LIST_FOREACH(st, &grp->sg_idlethreads, st_ilink) in svc_exit()
1434 cv_signal(&st->st_cond); in svc_exit()
1436 mtx_unlock(&grp->sg_lock); in svc_exit()
1447 m = rqstp->rq_args; in svc_getargs()
1448 rqstp->rq_args = NULL; in svc_getargs()
1462 if (rqstp->rq_addr) { in svc_freeargs()
1463 free(rqstp->rq_addr, M_SONAME); in svc_freeargs()
1464 rqstp->rq_addr = NULL; in svc_freeargs()
1477 st = rqstp->rq_thread; in svc_freereq()
1479 pool = st->st_pool; in svc_freereq()
1480 if (pool->sp_done) in svc_freereq()
1481 pool->sp_done(st, rqstp); in svc_freereq()
1484 if (rqstp->rq_auth.svc_ah_ops) in svc_freereq()
1485 SVCAUTH_RELEASE(&rqstp->rq_auth); in svc_freereq()
1487 if (rqstp->rq_xprt) { in svc_freereq()
1488 SVC_RELEASE(rqstp->rq_xprt); in svc_freereq()
1491 if (rqstp->rq_addr) in svc_freereq()
1492 free(rqstp->rq_addr, M_SONAME); in svc_freereq()
1494 if (rqstp->rq_args) in svc_freereq()
1495 m_freem(rqstp->rq_args); in svc_freereq()