diff options
| author | 2018-11-19 13:15:37 +0000 | |
|---|---|---|
| committer | 2018-11-19 13:15:37 +0000 | |
| commit | e22141d5ca3312610ade1c4dcf8713b7639f70a5 (patch) | |
| tree | 95218622361e86ec53a7b81ec0755f5c1ee302e2 | |
| parent | Add regress tests for sockets with sigio. (diff) | |
| download | wireguard-openbsd-e22141d5ca3312610ade1c4dcf8713b7639f70a5.tar.xz wireguard-openbsd-e22141d5ca3312610ade1c4dcf8713b7639f70a5.zip | |
Utilize sigio with sockets.
OK mpi@
| -rw-r--r-- | sys/kern/sys_socket.c | 10 | ||||
| -rw-r--r-- | sys/kern/uipc_socket.c | 12 | ||||
| -rw-r--r-- | sys/kern/uipc_socket2.c | 11 | ||||
| -rw-r--r-- | sys/sys/socketvar.h | 9 | ||||
| -rw-r--r-- | usr.bin/netstat/inet.c | 6 |
5 files changed, 23 insertions, 25 deletions
diff --git a/sys/kern/sys_socket.c b/sys/kern/sys_socket.c index 22b3e266654..0676d907f32 100644 --- a/sys/kern/sys_socket.c +++ b/sys/kern/sys_socket.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sys_socket.c,v 1.41 2018/08/20 16:00:22 mpi Exp $ */ +/* $OpenBSD: sys_socket.c,v 1.42 2018/11/19 13:15:37 visa Exp $ */ /* $NetBSD: sys_socket.c,v 1.13 1995/08/12 23:59:09 mycroft Exp $ */ /* @@ -114,17 +114,15 @@ soo_ioctl(struct file *fp, u_long cmd, caddr_t data, struct proc *p) case TIOCSPGRP: /* FALLTHROUGH */ case SIOCSPGRP: - so->so_pgid = *(int *)data; - so->so_siguid = p->p_ucred->cr_ruid; - so->so_sigeuid = p->p_ucred->cr_uid; + error = sigio_setown(&so->so_sigio, *(int *)data); break; case TIOCGPGRP: - *(int *)data = -so->so_pgid; + *(int *)data = -sigio_getown(&so->so_sigio); break; case SIOCGPGRP: - *(int *)data = so->so_pgid; + *(int *)data = sigio_getown(&so->so_sigio); break; case SIOCATMARK: diff --git a/sys/kern/uipc_socket.c b/sys/kern/uipc_socket.c index d50b6dd1914..94d5afafe73 100644 --- a/sys/kern/uipc_socket.c +++ b/sys/kern/uipc_socket.c @@ -1,4 +1,4 @@ -/* $OpenBSD: uipc_socket.c,v 1.227 2018/08/21 12:34:11 bluhm Exp $ */ +/* $OpenBSD: uipc_socket.c,v 1.228 2018/11/19 13:15:37 visa Exp $ */ /* $NetBSD: uipc_socket.c,v 1.21 1996/02/04 02:17:52 christos Exp $ */ /* @@ -129,6 +129,7 @@ socreate(int dom, struct socket **aso, int type, int proto) if (prp->pr_type != type) return (EPROTOTYPE); so = pool_get(&socket_pool, PR_WAITOK | PR_ZERO); + sigio_init(&so->so_sigio); TAILQ_INIT(&so->so_q0); TAILQ_INIT(&so->so_q); so->so_type = type; @@ -214,6 +215,7 @@ sofree(struct socket *so, int s) return; } } + sigio_free(&so->so_sigio); #ifdef SOCKET_SPLICE if (so->so_sp) { if (issplicedback(so)) @@ -250,6 +252,8 @@ soclose(struct socket *so, int flags) int s, error = 0; s = solock(so); + /* Revoke async IO early. There is a final revocation in sofree(). */ + sigio_free(&so->so_sigio); if (so->so_options & SO_ACCEPTCONN) { while ((so2 = TAILQ_FIRST(&so->so_q0)) != NULL) { (void) soqremque(so2, 0); @@ -1921,7 +1925,7 @@ void sohasoutofband(struct socket *so) { KERNEL_LOCK(); - csignal(so->so_pgid, SIGURG, so->so_siguid, so->so_sigeuid); + pgsigio(&so->so_sigio, SIGURG, 0); selwakeup(&so->so_rcv.sb_sel); KERNEL_UNLOCK(); } @@ -2080,6 +2084,7 @@ so_print(void *v, (*pr)("so_state: 0x%04x\n", so->so_state); (*pr)("so_pcb: %p\n", so->so_pcb); (*pr)("so_proto: %p\n", so->so_proto); + (*pr)("so_sigio: %p\n", so->so_sigio.sir_sigio); (*pr)("so_head: %p\n", so->so_head); (*pr)("so_onq: %p\n", so->so_onq); @@ -2090,9 +2095,6 @@ so_print(void *v, (*pr)("so_qlen: %i\n", so->so_qlen); (*pr)("so_qlimit: %i\n", so->so_qlimit); (*pr)("so_timeo: %i\n", so->so_timeo); - (*pr)("so_pgid: %i\n", so->so_pgid); - (*pr)("so_siguid: %i\n", so->so_siguid); - (*pr)("so_sigeuid: %i\n", so->so_sigeuid); (*pr)("so_obmark: %lu\n", so->so_oobmark); (*pr)("so_sp: %p\n", so->so_sp); diff --git a/sys/kern/uipc_socket2.c b/sys/kern/uipc_socket2.c index fcd93f8f26c..cb6dedcb1a8 100644 --- a/sys/kern/uipc_socket2.c +++ b/sys/kern/uipc_socket2.c @@ -1,4 +1,4 @@ -/* $OpenBSD: uipc_socket2.c,v 1.98 2018/11/09 14:14:31 claudio Exp $ */ +/* $OpenBSD: uipc_socket2.c,v 1.99 2018/11/19 13:15:37 visa Exp $ */ /* $NetBSD: uipc_socket2.c,v 1.11 1996/02/04 02:17:55 christos Exp $ */ /* @@ -166,14 +166,11 @@ sonewconn(struct socket *head, int connstatus) so->so_state = head->so_state | SS_NOFDREF; so->so_proto = head->so_proto; so->so_timeo = head->so_timeo; - so->so_pgid = head->so_pgid; so->so_euid = head->so_euid; so->so_ruid = head->so_ruid; so->so_egid = head->so_egid; so->so_rgid = head->so_rgid; so->so_cpid = head->so_cpid; - so->so_siguid = head->so_siguid; - so->so_sigeuid = head->so_sigeuid; /* * Inherit watermarks but those may get clamped in low mem situations. @@ -189,9 +186,13 @@ sonewconn(struct socket *head, int connstatus) so->so_rcv.sb_lowat = head->so_rcv.sb_lowat; so->so_rcv.sb_timeo = head->so_rcv.sb_timeo; + sigio_init(&so->so_sigio); + sigio_copy(&so->so_sigio, &head->so_sigio); + soqinsque(head, so, soqueue); if ((*so->so_proto->pr_attach)(so, 0)) { (void) soqremque(so, soqueue); + sigio_free(&so->so_sigio); pool_put(&socket_pool, so); return (NULL); } @@ -408,7 +409,7 @@ sowakeup(struct socket *so, struct sockbuf *sb) } KERNEL_LOCK(); if (so->so_state & SS_ASYNC) - csignal(so->so_pgid, SIGIO, so->so_siguid, so->so_sigeuid); + pgsigio(&so->so_sigio, SIGIO, 0); selwakeup(&sb->sb_sel); KERNEL_UNLOCK(); } diff --git a/sys/sys/socketvar.h b/sys/sys/socketvar.h index 3c42c697e2d..c9e0cf2ef8f 100644 --- a/sys/sys/socketvar.h +++ b/sys/sys/socketvar.h @@ -1,4 +1,4 @@ -/* $OpenBSD: socketvar.h,v 1.87 2018/08/20 16:00:22 mpi Exp $ */ +/* $OpenBSD: socketvar.h,v 1.88 2018/11/19 13:15:37 visa Exp $ */ /* $NetBSD: socketvar.h,v 1.18 1996/02/09 18:25:38 christos Exp $ */ /*- @@ -34,6 +34,7 @@ #include <sys/selinfo.h> /* for struct selinfo */ #include <sys/queue.h> +#include <sys/sigio.h> /* for struct sigio_ref */ #include <sys/task.h> #include <sys/timeout.h> @@ -72,16 +73,14 @@ struct socket { struct soqhead *so_onq; /* queue (q or q0) that we're on */ struct soqhead so_q0; /* queue of partial connections */ struct soqhead so_q; /* queue of incoming connections */ + struct sigio_ref so_sigio; /* async I/O registration */ TAILQ_ENTRY(socket) so_qe; /* our queue entry (q or q0) */ short so_q0len; /* partials on so_q0 */ short so_qlen; /* number of connections on so_q */ short so_qlimit; /* max number queued connections */ short so_timeo; /* connection timeout */ - u_int so_error; /* error affecting connection */ - pid_t so_pgid; /* pgid for signals */ - uid_t so_siguid; /* uid of process who set so_pgid */ - uid_t so_sigeuid; /* euid of process who set so_pgid */ u_long so_oobmark; /* chars to oob mark */ + u_int so_error; /* error affecting connection */ /* * Variables for socket splicing, allocated only when needed. */ diff --git a/usr.bin/netstat/inet.c b/usr.bin/netstat/inet.c index 8e490540955..e8e2a4dcd4f 100644 --- a/usr.bin/netstat/inet.c +++ b/usr.bin/netstat/inet.c @@ -1,4 +1,4 @@ -/* $OpenBSD: inet.c,v 1.163 2018/08/13 14:36:54 mpi Exp $ */ +/* $OpenBSD: inet.c,v 1.164 2018/11/19 13:15:37 visa Exp $ */ /* $NetBSD: inet.c,v 1.14 1995/10/03 21:42:37 thorpej Exp $ */ /* @@ -1311,9 +1311,7 @@ socket_dump(u_long off) p("%d", so_qlimit, "\n "); p("%d", so_timeo, "\n "); p("%u", so_error, "\n "); - p("%d", so_pgid, ", "); - p("%u", so_siguid, ", "); - p("%u", so_sigeuid, "\n "); + p("%p", so_sigio.sir_sigio, "\n "); p("%lu", so_oobmark, "\n "); if (so.so_sp) sosplice_dump((u_long)so.so_sp); |
