summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorvisa <visa@openbsd.org>2018-11-19 13:15:37 +0000
committervisa <visa@openbsd.org>2018-11-19 13:15:37 +0000
commite22141d5ca3312610ade1c4dcf8713b7639f70a5 (patch)
tree95218622361e86ec53a7b81ec0755f5c1ee302e2
parentAdd regress tests for sockets with sigio. (diff)
downloadwireguard-openbsd-e22141d5ca3312610ade1c4dcf8713b7639f70a5.tar.xz
wireguard-openbsd-e22141d5ca3312610ade1c4dcf8713b7639f70a5.zip
Utilize sigio with sockets.
OK mpi@
-rw-r--r--sys/kern/sys_socket.c10
-rw-r--r--sys/kern/uipc_socket.c12
-rw-r--r--sys/kern/uipc_socket2.c11
-rw-r--r--sys/sys/socketvar.h9
-rw-r--r--usr.bin/netstat/inet.c6
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);