Lines Matching refs:spc

148 waitresp(struct spclient *spc, struct respwait *rw)  in waitresp()  argument
153 pthread_mutex_lock(&spc->spc_mtx); in waitresp()
154 sendunlockl(spc); in waitresp()
155 while (!rw->rw_done && spc->spc_state != SPCSTATE_DYING) { in waitresp()
156 pthread_cond_wait(&rw->rw_cv, &spc->spc_mtx); in waitresp()
158 TAILQ_REMOVE(&spc->spc_respwait, rw, rw_entries); in waitresp()
159 spcstate = spc->spc_state; in waitresp()
160 pthread_mutex_unlock(&spc->spc_mtx); in waitresp()
195 lwproc_rfork(struct spclient *spc, int flags, const char *comm) in lwproc_rfork() argument
200 rv = rumpuser__hyp.hyp_lwproc_rfork(spc, flags, comm); in lwproc_rfork()
276 nextreq(struct spclient *spc) in nextreq() argument
280 pthread_mutex_lock(&spc->spc_mtx); in nextreq()
281 nw = spc->spc_nextreq++; in nextreq()
282 pthread_mutex_unlock(&spc->spc_mtx); in nextreq()
293 send_error_resp(struct spclient *spc, uint64_t reqno, enum rumpsp_err error) in send_error_resp() argument
306 sendlock(spc); in send_error_resp()
307 (void)SENDIOV(spc, iov); in send_error_resp()
308 sendunlock(spc); in send_error_resp()
312 send_handshake_resp(struct spclient *spc, uint64_t reqno, int error) in send_handshake_resp() argument
327 sendlock(spc); in send_handshake_resp()
328 rv = SENDIOV(spc, iov); in send_handshake_resp()
329 sendunlock(spc); in send_handshake_resp()
335 send_syscall_resp(struct spclient *spc, uint64_t reqno, int error, in send_syscall_resp() argument
355 sendlock(spc); in send_syscall_resp()
356 rv = SENDIOV(spc, iov); in send_syscall_resp()
357 sendunlock(spc); in send_syscall_resp()
363 send_prefork_resp(struct spclient *spc, uint64_t reqno, uint32_t *auth) in send_prefork_resp() argument
378 sendlock(spc); in send_prefork_resp()
379 rv = SENDIOV(spc, iov); in send_prefork_resp()
380 sendunlock(spc); in send_prefork_resp()
386 copyin_req(struct spclient *spc, const void *remaddr, size_t *dlen, in copyin_req() argument
411 putwait(spc, &rw, &rhdr); in copyin_req()
412 rv = SENDIOV(spc, iov); in copyin_req()
414 unputwait(spc, &rw); in copyin_req()
418 rv = waitresp(spc, &rw); in copyin_req()
431 send_copyout_req(struct spclient *spc, const void *remaddr, in send_copyout_req() argument
442 rhdr.rsp_reqno = nextreq(spc); in send_copyout_req()
454 sendlock(spc); in send_copyout_req()
455 rv = SENDIOV(spc, iov); in send_copyout_req()
456 sendunlock(spc); in send_copyout_req()
462 anonmmap_req(struct spclient *spc, size_t howmuch, void **resp) in anonmmap_req() argument
479 putwait(spc, &rw, &rhdr); in anonmmap_req()
480 rv = SENDIOV(spc, iov); in anonmmap_req()
482 unputwait(spc, &rw); in anonmmap_req()
486 rv = waitresp(spc, &rw); in anonmmap_req()
496 send_raise_req(struct spclient *spc, int signo) in send_raise_req() argument
509 sendlock(spc); in send_raise_req()
510 rv = SENDIOV(spc, iov); in send_raise_req()
511 sendunlock(spc); in send_raise_req()
517 spcref(struct spclient *spc) in spcref() argument
520 pthread_mutex_lock(&spc->spc_mtx); in spcref()
521 spc->spc_refcnt++; in spcref()
522 pthread_mutex_unlock(&spc->spc_mtx); in spcref()
526 spcrelease(struct spclient *spc) in spcrelease() argument
530 pthread_mutex_lock(&spc->spc_mtx); in spcrelease()
531 ref = --spc->spc_refcnt; in spcrelease()
532 if (__predict_false(spc->spc_inexec && ref <= 2)) in spcrelease()
533 pthread_cond_broadcast(&spc->spc_cv); in spcrelease()
534 pthread_mutex_unlock(&spc->spc_mtx); in spcrelease()
539 DPRINTF(("rump_sp: spcrelease: spc %p fd %d\n", spc, spc->spc_fd)); in spcrelease()
541 _DIAGASSERT(TAILQ_EMPTY(&spc->spc_respwait)); in spcrelease()
542 _DIAGASSERT(spc->spc_buf == NULL); in spcrelease()
544 if (spc->spc_mainlwp) { in spcrelease()
545 lwproc_switch(spc->spc_mainlwp); in spcrelease()
548 spc->spc_mainlwp = NULL; in spcrelease()
550 close(spc->spc_fd); in spcrelease()
551 spc->spc_fd = -1; in spcrelease()
552 spc->spc_state = SPCSTATE_NEW; in spcrelease()
560 struct spclient *spc = &spclist[idx]; in serv_handledisco() local
567 pthread_mutex_lock(&spc->spc_mtx); in serv_handledisco()
568 spc->spc_state = SPCSTATE_DYING; in serv_handledisco()
569 kickall(spc); in serv_handledisco()
570 sendunlockl(spc); in serv_handledisco()
572 dolwpexit = !spc->spc_inexec; in serv_handledisco()
573 pthread_mutex_unlock(&spc->spc_mtx); in serv_handledisco()
575 if (dolwpexit && spc->spc_mainlwp) { in serv_handledisco()
576 lwproc_switch(spc->spc_mainlwp); in serv_handledisco()
586 memset((char *)spc + SPC_ZEROFF, 0, sizeof(*spc) - SPC_ZEROFF); in serv_handledisco()
588 spcrelease(spc); in serv_handledisco()
594 struct spclient *spc; in serv_shutdown() local
598 spc = &spclist[i]; in serv_shutdown()
599 if (spc->spc_fd == -1) in serv_shutdown()
602 shutdown(spc->spc_fd, SHUT_RDWR); in serv_shutdown()
605 spcrelease(spc); in serv_shutdown()
675 serv_handlesyscall(struct spclient *spc, struct rsp_hdr *rhdr, uint8_t *data) in serv_handlesyscall() argument
682 sysnum, spc->spc_pid)); in serv_handlesyscall()
684 if (__predict_false((rv = lwproc_newlwp(spc->spc_pid)) != 0)) { in serv_handlesyscall()
686 send_syscall_resp(spc, rhdr->rsp_reqno, rv, retval); in serv_handlesyscall()
689 spc->spc_syscallreq = rhdr->rsp_reqno; in serv_handlesyscall()
691 spc->spc_syscallreq = 0; in serv_handlesyscall()
698 send_syscall_resp(spc, rhdr->rsp_reqno, rv, retval); in serv_handlesyscall()
702 serv_handleexec(struct spclient *spc, struct rsp_hdr *rhdr, const char *comm) in serv_handleexec() argument
704 pthread_mutex_lock(&spc->spc_mtx); in serv_handleexec()
706 while (spc->spc_refcnt > 2) in serv_handleexec()
707 pthread_cond_wait(&spc->spc_cv, &spc->spc_mtx); in serv_handleexec()
708 pthread_mutex_unlock(&spc->spc_mtx); in serv_handleexec()
716 lwproc_switch(spc->spc_mainlwp); in serv_handleexec()
720 pthread_mutex_lock(&spc->spc_mtx); in serv_handleexec()
721 spc->spc_inexec = 0; in serv_handleexec()
722 pthread_mutex_unlock(&spc->spc_mtx); in serv_handleexec()
723 send_handshake_resp(spc, rhdr->rsp_reqno, 0); in serv_handleexec()
785 struct spclient *spc = arg; in sp_copyin() local
791 rv = copyin_req(spc, raddr, len, wantstr, &rdata); in sp_copyin()
826 struct spclient *spc = arg; in sp_copyout() local
830 rv = send_copyout_req(spc, raddr, laddr, dlen); in sp_copyout()
859 struct spclient *spc = arg; in rumpuser_sp_anonmmap() local
865 rv = anonmmap_req(spc, howmuch, &rdata); in rumpuser_sp_anonmmap()
888 struct spclient *spc = arg; in rumpuser_sp_raise() local
892 rv = send_raise_req(spc, signo); in rumpuser_sp_raise()
900 schedulework(struct spclient *spc, enum sbatype sba_type) in schedulework() argument
907 reqno = spc->spc_hdr.rsp_reqno; in schedulework()
910 send_error_resp(spc, reqno, RUMPSP_ERR_TRYAGAIN); in schedulework()
911 spcfreebuf(spc); in schedulework()
918 sba->sba_spc = spc; in schedulework()
920 sba->sba_hdr = spc->spc_hdr; in schedulework()
921 sba->sba_data = spc->spc_buf; in schedulework()
922 spcresetbuf(spc); in schedulework()
924 spcref(spc); in schedulework()
958 handlereq(struct spclient *spc) in handlereq() argument
963 reqno = spc->spc_hdr.rsp_reqno; in handlereq()
964 if (__predict_false(spc->spc_state == SPCSTATE_NEW)) { in handlereq()
965 if (spc->spc_hdr.rsp_type != RUMPSP_HANDSHAKE) { in handlereq()
966 send_error_resp(spc, reqno, RUMPSP_ERR_AUTH); in handlereq()
967 shutdown(spc->spc_fd, SHUT_RDWR); in handlereq()
968 spcfreebuf(spc); in handlereq()
972 if (spc->spc_hdr.rsp_handshake == HANDSHAKE_GUEST) { in handlereq()
976 if ((error = lwproc_rfork(spc, RUMP_RFFD_CLEAR, in handlereq()
977 (const char *)spc->spc_buf)) != 0) { in handlereq()
978 shutdown(spc->spc_fd, SHUT_RDWR); in handlereq()
981 spcfreebuf(spc); in handlereq()
985 spc->spc_mainlwp = lwproc_curlwp(); in handlereq()
987 send_handshake_resp(spc, reqno, 0); in handlereq()
988 } else if (spc->spc_hdr.rsp_handshake == HANDSHAKE_FORK) { in handlereq()
994 if (spc->spc_off-HDRSZ != sizeof(*rfp)) { in handlereq()
995 send_error_resp(spc, reqno, in handlereq()
997 shutdown(spc->spc_fd, SHUT_RDWR); in handlereq()
998 spcfreebuf(spc); in handlereq()
1003 rfp = (void *)spc->spc_buf; in handlereq()
1016 spcfreebuf(spc); in handlereq()
1019 send_error_resp(spc, reqno, in handlereq()
1021 shutdown(spc->spc_fd, SHUT_RDWR); in handlereq()
1030 shutdown(spc->spc_fd, SHUT_RDWR); in handlereq()
1042 if ((error = lwproc_rfork(spc, in handlereq()
1044 send_error_resp(spc, reqno, in handlereq()
1046 shutdown(spc->spc_fd, SHUT_RDWR); in handlereq()
1050 spc->spc_mainlwp = lwproc_curlwp(); in handlereq()
1053 lwproc_switch(spc->spc_mainlwp); in handlereq()
1055 send_handshake_resp(spc, reqno, 0); in handlereq()
1057 send_error_resp(spc, reqno, RUMPSP_ERR_AUTH); in handlereq()
1058 shutdown(spc->spc_fd, SHUT_RDWR); in handlereq()
1059 spcfreebuf(spc); in handlereq()
1063 spc->spc_pid = lwproc_getpid(); in handlereq()
1066 spc, spc->spc_pid)); in handlereq()
1069 spc->spc_state = SPCSTATE_RUNNING; in handlereq()
1073 if (__predict_false(spc->spc_hdr.rsp_type == RUMPSP_PREFORK)) { in handlereq()
1079 DPRINTF(("rump_sp: prefork handler executing for %p\n", spc)); in handlereq()
1080 spcfreebuf(spc); in handlereq()
1082 pthread_mutex_lock(&spc->spc_mtx); in handlereq()
1083 inexec = spc->spc_inexec; in handlereq()
1084 pthread_mutex_unlock(&spc->spc_mtx); in handlereq()
1086 send_error_resp(spc, reqno, RUMPSP_ERR_INEXEC); in handlereq()
1087 shutdown(spc->spc_fd, SHUT_RDWR); in handlereq()
1093 send_error_resp(spc, reqno, RUMPSP_ERR_NOMEM); in handlereq()
1102 lwproc_switch(spc->spc_mainlwp); in handlereq()
1103 if ((error = lwproc_rfork(spc, RUMP_RFFD_COPY, NULL)) != 0) { in handlereq()
1104 DPRINTF(("rump_sp: fork failed: %d (%p)\n",error, spc)); in handlereq()
1105 send_error_resp(spc, reqno, RUMPSP_ERR_RFORK_FAILED); in handlereq()
1119 LIST_INSERT_HEAD(&spc->spc_pflist, pf, pf_spcentries); in handlereq()
1122 DPRINTF(("rump_sp: prefork handler success %p\n", spc)); in handlereq()
1124 send_prefork_resp(spc, reqno, auth); in handlereq()
1128 if (__predict_false(spc->spc_hdr.rsp_type == RUMPSP_HANDSHAKE)) { in handlereq()
1131 if (spc->spc_hdr.rsp_handshake != HANDSHAKE_EXEC) { in handlereq()
1132 send_error_resp(spc, reqno, in handlereq()
1134 shutdown(spc->spc_fd, SHUT_RDWR); in handlereq()
1135 spcfreebuf(spc); in handlereq()
1139 pthread_mutex_lock(&spc->spc_mtx); in handlereq()
1140 inexec = spc->spc_inexec; in handlereq()
1141 pthread_mutex_unlock(&spc->spc_mtx); in handlereq()
1143 send_error_resp(spc, reqno, RUMPSP_ERR_INEXEC); in handlereq()
1144 shutdown(spc->spc_fd, SHUT_RDWR); in handlereq()
1145 spcfreebuf(spc); in handlereq()
1149 pthread_mutex_lock(&spc->spc_mtx); in handlereq()
1150 spc->spc_inexec = 1; in handlereq()
1151 pthread_mutex_unlock(&spc->spc_mtx); in handlereq()
1157 lwproc_switch(spc->spc_mainlwp); in handlereq()
1165 schedulework(spc, SBA_EXEC); in handlereq()
1169 if (__predict_false(spc->spc_hdr.rsp_type != RUMPSP_SYSCALL)) { in handlereq()
1170 send_error_resp(spc, reqno, RUMPSP_ERR_MALFORMED_REQUEST); in handlereq()
1171 spcfreebuf(spc); in handlereq()
1175 schedulework(spc, SBA_SYSCALL); in handlereq()
1182 struct spclient *spc; in spserver() local
1192 spc = &spclist[idx]; in spserver()
1193 pthread_mutex_init(&spc->spc_mtx, NULL); in spserver()
1194 pthread_cond_init(&spc->spc_cv, NULL); in spserver()
1195 spc->spc_fd = -1; in spserver()
1253 spc = &spclist[idx]; in spserver()
1255 switch (readframe(spc)) { in spserver()
1262 switch (spc->spc_hdr.rsp_class) { in spserver()
1264 kickwaiter(spc); in spserver()
1267 handlereq(spc); in spserver()
1270 send_error_resp(spc, in spserver()
1271 spc->spc_hdr.rsp_reqno, in spserver()
1273 spcfreebuf(spc); in spserver()
1375 struct spclient *spc = arg; in rumpuser_sp_fini() local
1386 if (spc && spc->spc_syscallreq) in rumpuser_sp_fini()
1387 send_syscall_resp(spc, spc->spc_syscallreq, 0, retval); in rumpuser_sp_fini()