Lines Matching +full:blocking +full:- +full:io

1 /*-
2 * SPDX-License-Identifier: BSD-3-Clause
121 struct socket *so = fp->f_data; in soo_read()
137 struct socket *so = fp->f_data; in soo_write()
153 struct socket *so = fp->f_data; in soo_ioctl()
160 so->so_state |= SS_NBIO; in soo_ioctl()
162 so->so_state &= ~SS_NBIO; in soo_ioctl()
169 so->so_state |= SS_ASYNC; in soo_ioctl()
171 so->sol_sbrcv_flags |= SB_ASYNC; in soo_ioctl()
172 so->sol_sbsnd_flags |= SB_ASYNC; in soo_ioctl()
175 so->so_rcv.sb_flags |= SB_ASYNC; in soo_ioctl()
178 so->so_snd.sb_flags |= SB_ASYNC; in soo_ioctl()
184 so->so_state &= ~SS_ASYNC; in soo_ioctl()
186 so->sol_sbrcv_flags &= ~SB_ASYNC; in soo_ioctl()
187 so->sol_sbsnd_flags &= ~SB_ASYNC; in soo_ioctl()
190 so->so_rcv.sb_flags &= ~SB_ASYNC; in soo_ioctl()
193 so->so_snd.sb_flags &= ~SB_ASYNC; in soo_ioctl()
205 *(int *)data = sbavail(&so->so_rcv) - so->so_rcv.sb_ctl; in soo_ioctl()
215 *(int *)data = sbavail(&so->so_snd); in soo_ioctl()
224 if ((so->so_snd.sb_hiwat < sbused(&so->so_snd)) || in soo_ioctl()
225 (so->so_snd.sb_mbmax < so->so_snd.sb_mbcnt)) { in soo_ioctl()
228 *(int *)data = sbspace(&so->so_snd); in soo_ioctl()
234 error = fsetown(*(int *)data, &so->so_sigio); in soo_ioctl()
238 *(int *)data = fgetown(&so->so_sigio); in soo_ioctl()
242 error = fsetown(-(*(int *)data), &so->so_sigio); in soo_ioctl()
246 *(int *)data = -fgetown(&so->so_sigio); in soo_ioctl()
254 *(int *)data = (so->so_rcv.sb_state & SBS_RCVATMARK) != 0; in soo_ioctl()
266 CURVNET_SET(so->so_vnet); in soo_ioctl()
267 error = rtioctl_fib(cmd, data, so->so_fibnum); in soo_ioctl()
270 CURVNET_SET(so->so_vnet); in soo_ioctl()
271 error = so->so_proto->pr_control(so, cmd, data, 0, td); in soo_ioctl()
283 struct socket *so = fp->f_data; in soo_poll()
291 return (so->so_proto->pr_sopoll(so, events, td)); in soo_poll()
297 struct socket *so = fp->f_data; in soo_stat()
301 ub->st_mode = S_IFSOCK; in soo_stat()
315 sb = &so->so_rcv; in soo_stat()
317 if ((sb->sb_state & SBS_CANTRCVMORE) == 0 || sbavail(sb)) in soo_stat()
318 ub->st_mode |= S_IRUSR | S_IRGRP | S_IROTH; in soo_stat()
319 ub->st_size = sbavail(sb) - sb->sb_ctl; in soo_stat()
322 sb = &so->so_snd; in soo_stat()
324 if ((sb->sb_state & SBS_CANTSENDMORE) == 0) in soo_stat()
325 ub->st_mode |= S_IWUSR | S_IWGRP | S_IWOTH; in soo_stat()
328 ub->st_uid = so->so_cred->cr_uid; in soo_stat()
329 ub->st_gid = so->so_cred->cr_gid; in soo_stat()
330 if (so->so_proto->pr_sense) in soo_stat()
331 error = so->so_proto->pr_sense(so, ub); in soo_stat()
348 so = fp->f_data; in soo_close()
349 fp->f_ops = &badfileops; in soo_close()
350 fp->f_data = NULL; in soo_close()
363 so = fp->f_data; in soo_chmod()
364 if (so->so_proto->pr_chmod != NULL) in soo_chmod()
365 error = so->so_proto->pr_chmod(so, mode, cred, td); in soo_chmod()
379 kif->kf_type = KF_TYPE_SOCKET; in soo_fill_kinfo()
380 so = fp->f_data; in soo_fill_kinfo()
381 CURVNET_SET(so->so_vnet); in soo_fill_kinfo()
382 kif->kf_un.kf_sock.kf_sock_domain0 = in soo_fill_kinfo()
383 so->so_proto->pr_domain->dom_family; in soo_fill_kinfo()
384 kif->kf_un.kf_sock.kf_sock_type0 = so->so_type; in soo_fill_kinfo()
385 kif->kf_un.kf_sock.kf_sock_protocol0 = so->so_proto->pr_protocol; in soo_fill_kinfo()
386 kif->kf_un.kf_sock.kf_sock_pcb = (uintptr_t)so->so_pcb; in soo_fill_kinfo()
387 switch (kif->kf_un.kf_sock.kf_sock_domain0) { in soo_fill_kinfo()
391 kif->kf_un.kf_sock.kf_sock_inpcb = (uintptr_t)so->so_pcb; in soo_fill_kinfo()
392 kif->kf_un.kf_sock.kf_sock_rcv_sb_state = in soo_fill_kinfo()
393 so->so_rcv.sb_state; in soo_fill_kinfo()
394 kif->kf_un.kf_sock.kf_sock_snd_sb_state = in soo_fill_kinfo()
395 so->so_snd.sb_state; in soo_fill_kinfo()
396 kif->kf_un.kf_sock.kf_sock_sendq = in soo_fill_kinfo()
397 sbused(&so->so_snd); in soo_fill_kinfo()
398 kif->kf_un.kf_sock.kf_sock_recvq = in soo_fill_kinfo()
399 sbused(&so->so_rcv); in soo_fill_kinfo()
402 if (so->so_pcb != NULL) { in soo_fill_kinfo()
403 unpcb = (struct unpcb *)(so->so_pcb); in soo_fill_kinfo()
404 if (unpcb->unp_conn) { in soo_fill_kinfo()
405 kif->kf_un.kf_sock.kf_sock_unpconn = in soo_fill_kinfo()
406 (uintptr_t)unpcb->unp_conn; in soo_fill_kinfo()
407 kif->kf_un.kf_sock.kf_sock_rcv_sb_state = in soo_fill_kinfo()
408 so->so_rcv.sb_state; in soo_fill_kinfo()
409 kif->kf_un.kf_sock.kf_sock_snd_sb_state = in soo_fill_kinfo()
410 so->so_snd.sb_state; in soo_fill_kinfo()
411 kif->kf_un.kf_sock.kf_sock_sendq = in soo_fill_kinfo()
412 sbused(&so->so_snd); in soo_fill_kinfo()
413 kif->kf_un.kf_sock.kf_sock_recvq = in soo_fill_kinfo()
414 sbused(&so->so_rcv); in soo_fill_kinfo()
421 ss.ss_len <= sizeof(kif->kf_un.kf_sock.kf_sa_local)) { in soo_fill_kinfo()
422 bcopy(&ss, &kif->kf_un.kf_sock.kf_sa_local, ss.ss_len); in soo_fill_kinfo()
427 ss.ss_len <= sizeof(kif->kf_un.kf_sock.kf_sa_peer)) { in soo_fill_kinfo()
428 bcopy(&ss, &kif->kf_un.kf_sock.kf_sa_peer, ss.ss_len); in soo_fill_kinfo()
430 strncpy(kif->kf_path, so->so_proto->pr_domain->dom_name, in soo_fill_kinfo()
431 sizeof(kif->kf_path)); in soo_fill_kinfo()
450 "Maximum number of kernel processes to use for async socket IO");
454 "Number of active kernel processes for async socket IO");
459 "Preferred number of ready kernel processes for async socket IO");
485 soaio_starting--; in soaio_kproc_loop()
490 soaio_queued--; in soaio_kproc_loop()
491 pending = task->ta_pending; in soaio_kproc_loop()
492 task->ta_pending = 0; in soaio_kproc_loop()
495 task->ta_func(task->ta_context, pending); in soaio_kproc_loop()
501 if (p->p_vmspace != myvm) { in soaio_kproc_loop()
509 error = mtx_sleep(&soaio_idle, &soaio_jobs_lock, 0, "-", in soaio_kproc_loop()
511 soaio_idle--; in soaio_kproc_loop()
516 soaio_num_procs--; in soaio_kproc_loop()
554 soaio_starting--; in soaio_kproc_create()
569 MPASS(task->ta_pending == 0); in soaio_enqueue()
570 task->ta_pending++; in soaio_enqueue()
595 return (sb == &so->so_rcv ? soreadable(so) : sowriteable(so)); in soaio_ready()
605 struct file *fp = job->fd_file; in soaio_process_job()
615 td_savedcred = td->td_ucred; in soaio_process_job()
616 td->td_ucred = job->cred; in soaio_process_job()
618 job_total_nbytes = job->uiop->uio_resid + job->aio_done; in soaio_process_job()
619 done = job->aio_done; in soaio_process_job()
620 cnt = job->uiop->uio_resid; in soaio_process_job()
621 job->uiop->uio_offset = 0; in soaio_process_job()
622 job->uiop->uio_td = td; in soaio_process_job()
628 * sosend/soreceive on a blocking socket. in soaio_process_job()
631 if (sb == &so->so_rcv) { in soaio_process_job()
632 ru_before = td->td_ru.ru_msgrcv; in soaio_process_job()
634 error = mac_socket_check_receive(fp->f_cred, so); in soaio_process_job()
638 error = soreceive(so, NULL, job->uiop, NULL, NULL, in soaio_process_job()
640 if (td->td_ru.ru_msgrcv != ru_before) in soaio_process_job()
641 job->msgrcv = 1; in soaio_process_job()
643 if (!TAILQ_EMPTY(&sb->sb_aiojobq)) in soaio_process_job()
645 ru_before = td->td_ru.ru_msgsnd; in soaio_process_job()
647 error = mac_socket_check_send(fp->f_cred, so); in soaio_process_job()
650 error = sousrsend(so, NULL, job->uiop, NULL, flags, in soaio_process_job()
651 job->userproc); in soaio_process_job()
652 if (td->td_ru.ru_msgsnd != ru_before) in soaio_process_job()
653 job->msgsnd = 1; in soaio_process_job()
656 done += cnt - job->uiop->uio_resid; in soaio_process_job()
657 job->aio_done = done; in soaio_process_job()
658 td->td_ucred = td_savedcred; in soaio_process_job()
665 * non-blocking, return with any partial completion. in soaio_process_job()
666 * If the socket is blocking or if no progress has in soaio_process_job()
672 if (done == 0 || !(so->so_state & SS_NBIO)) { in soaio_process_job()
688 TAILQ_INSERT_HEAD(&sb->sb_aiojobq, job, list); in soaio_process_job()
698 aio_complete(job, -1, error); in soaio_process_job()
710 CURVNET_SET(so->so_vnet); in soaio_process_sb()
712 while (!TAILQ_EMPTY(&sb->sb_aiojobq) && soaio_ready(so, sb)) { in soaio_process_sb()
713 job = TAILQ_FIRST(&sb->sb_aiojobq); in soaio_process_sb()
714 TAILQ_REMOVE(&sb->sb_aiojobq, job, list); in soaio_process_sb()
726 if (!TAILQ_EMPTY(&sb->sb_aiojobq)) in soaio_process_sb()
727 sb->sb_flags |= SB_AIO; in soaio_process_sb()
728 sb->sb_flags &= ~SB_AIO_RUNNING; in soaio_process_sb()
760 sb->sb_flags &= ~SB_AIO; in sowakeup_aio()
761 if (sb->sb_flags & SB_AIO_RUNNING) in sowakeup_aio()
763 sb->sb_flags |= SB_AIO_RUNNING; in sowakeup_aio()
765 soaio_enqueue(&sb->sb_aiotask); in sowakeup_aio()
777 so = job->fd_file->f_data; in soo_aio_cancel()
778 opcode = job->uaiocb.aio_lio_opcode; in soo_aio_cancel()
780 sb = &so->so_rcv; in soo_aio_cancel()
784 sb = &so->so_snd; in soo_aio_cancel()
790 TAILQ_REMOVE(&sb->sb_aiojobq, job, list); in soo_aio_cancel()
791 if (TAILQ_EMPTY(&sb->sb_aiojobq)) in soo_aio_cancel()
792 sb->sb_flags &= ~SB_AIO; in soo_aio_cancel()
795 done = job->aio_done; in soo_aio_cancel()
805 struct socket *so = fp->f_data; in soo_aio_queue()
807 return (so->so_proto->pr_aio_queue(so, job)); in soo_aio_queue()
817 switch (job->uaiocb.aio_lio_opcode & (LIO_WRITE | LIO_READ)) { in soaio_queue_generic()
820 sb = &so->so_rcv; in soaio_queue_generic()
825 sb = &so->so_snd; in soaio_queue_generic()
839 TAILQ_INSERT_TAIL(&sb->sb_aiojobq, job, list); in soaio_queue_generic()
840 if (!(sb->sb_flags & SB_AIO_RUNNING)) { in soaio_queue_generic()
844 sb->sb_flags |= SB_AIO; in soaio_queue_generic()