Module Name: src Committed By: ad Date: Fri Oct 13 18:50:39 UTC 2023
Modified Files: src/sys/kern: uipc_socket.c uipc_syscalls.c src/sys/sys: socketvar.h Log Message: Use cv_fdrestart() to implement fo_restart. To generate a diff of this commit: cvs rdiff -u -r1.305 -r1.306 src/sys/kern/uipc_socket.c cvs rdiff -u -r1.208 -r1.209 src/sys/kern/uipc_syscalls.c cvs rdiff -u -r1.165 -r1.166 src/sys/sys/socketvar.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/kern/uipc_socket.c diff -u src/sys/kern/uipc_socket.c:1.305 src/sys/kern/uipc_socket.c:1.306 --- src/sys/kern/uipc_socket.c:1.305 Wed Oct 4 22:17:09 2023 +++ src/sys/kern/uipc_socket.c Fri Oct 13 18:50:39 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: uipc_socket.c,v 1.305 2023/10/04 22:17:09 ad Exp $ */ +/* $NetBSD: uipc_socket.c,v 1.306 2023/10/13 18:50:39 ad Exp $ */ /* * Copyright (c) 2002, 2007, 2008, 2009, 2023 The NetBSD Foundation, Inc. @@ -71,7 +71,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: uipc_socket.c,v 1.305 2023/10/04 22:17:09 ad Exp $"); +__KERNEL_RCSID(0, "$NetBSD: uipc_socket.c,v 1.306 2023/10/13 18:50:39 ad Exp $"); #ifdef _KERNEL_OPT #include "opt_compat_netbsd.h" @@ -895,7 +895,6 @@ sosend(struct socket *so, struct sockadd struct mbuf **mp, *m; long space, len, resid, clen, mlen; int error, s, dontroute, atomic; - short wakeup_state = 0; clen = 0; @@ -968,17 +967,11 @@ sosend(struct socket *so, struct sockadd goto release; } sbunlock(&so->so_snd); - if (wakeup_state & SS_RESTARTSYS) { - error = ERESTART; - goto out; - } error = sbwait(&so->so_snd); if (error) goto out; - wakeup_state = so->so_state; goto restart; } - wakeup_state = 0; mp = ⊤ space -= clen; do { @@ -1160,7 +1153,6 @@ soreceive(struct socket *so, struct mbuf struct mbuf *nextrecord; int mbuf_removed = 0; const struct domain *dom; - short wakeup_state = 0; pr = so->so_proto; atomic = pr->pr_flags & PR_ATOMIC; @@ -1271,16 +1263,12 @@ restart: SBLASTRECORDCHK(&so->so_rcv, "soreceive sbwait 1"); SBLASTMBUFCHK(&so->so_rcv, "soreceive sbwait 1"); sbunlock(&so->so_rcv); - if (wakeup_state & SS_RESTARTSYS) - error = ERESTART; - else - error = sbwait(&so->so_rcv); + error = sbwait(&so->so_rcv); if (error != 0) { sounlock(so); splx(s); return error; } - wakeup_state = so->so_state; goto restart; } @@ -1457,7 +1445,6 @@ dontblock: #endif so->so_state &= ~SS_RCVATMARK; - wakeup_state = 0; len = uio->uio_resid; if (so->so_oobmark && len > so->so_oobmark - offset) len = so->so_oobmark - offset; @@ -1600,10 +1587,7 @@ dontblock: (*pr->pr_usrreqs->pr_rcvd)(so, flags, l); SBLASTRECORDCHK(&so->so_rcv, "soreceive sbwait 2"); SBLASTMBUFCHK(&so->so_rcv, "soreceive sbwait 2"); - if (wakeup_state & SS_RESTARTSYS) - error = ERESTART; - else - error = sbwait(&so->so_rcv); + error = sbwait(&so->so_rcv); if (error != 0) { sbunlock(&so->so_rcv); sounlock(so); @@ -1612,7 +1596,6 @@ dontblock: } if ((m = so->so_rcv.sb_mb) != NULL) nextrecord = m->m_nextpkt; - wakeup_state = so->so_state; } } @@ -1680,6 +1663,7 @@ soshutdown(struct socket *so, int how) void sorestart(struct socket *so) { + /* * An application has called close() on an fd on which another * of its threads has called a socket system call. @@ -1689,10 +1673,9 @@ sorestart(struct socket *so) * Any other fd will block again on the 2nd syscall. */ solock(so); - so->so_state |= SS_RESTARTSYS; - cv_broadcast(&so->so_cv); - cv_broadcast(&so->so_snd.sb_cv); - cv_broadcast(&so->so_rcv.sb_cv); + cv_fdrestart(&so->so_cv); + cv_fdrestart(&so->so_snd.sb_cv); + cv_fdrestart(&so->so_rcv.sb_cv); sounlock(so); } Index: src/sys/kern/uipc_syscalls.c diff -u src/sys/kern/uipc_syscalls.c:1.208 src/sys/kern/uipc_syscalls.c:1.209 --- src/sys/kern/uipc_syscalls.c:1.208 Wed Oct 4 22:17:09 2023 +++ src/sys/kern/uipc_syscalls.c Fri Oct 13 18:50:39 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: uipc_syscalls.c,v 1.208 2023/10/04 22:17:09 ad Exp $ */ +/* $NetBSD: uipc_syscalls.c,v 1.209 2023/10/13 18:50:39 ad Exp $ */ /*- * Copyright (c) 2008, 2009, 2023 The NetBSD Foundation, Inc. @@ -61,7 +61,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: uipc_syscalls.c,v 1.208 2023/10/04 22:17:09 ad Exp $"); +__KERNEL_RCSID(0, "$NetBSD: uipc_syscalls.c,v 1.209 2023/10/13 18:50:39 ad Exp $"); #ifdef _KERNEL_OPT #include "opt_pipe.h" @@ -175,7 +175,6 @@ do_sys_accept(struct lwp *l, int sock, s file_t *fp, *fp2; int error, fd; struct socket *so, *so2; - short wakeup_state = 0; if ((fp = fd_getfile(sock)) == NULL) return EBADF; @@ -211,15 +210,10 @@ do_sys_accept(struct lwp *l, int sock, s so->so_error = ECONNABORTED; break; } - if (wakeup_state & SS_RESTARTSYS) { - error = ERESTART; - goto bad; - } error = sowait(so, true, 0); if (error) { goto bad; } - wakeup_state = so->so_state; } if (so->so_error) { error = so->so_error; Index: src/sys/sys/socketvar.h diff -u src/sys/sys/socketvar.h:1.165 src/sys/sys/socketvar.h:1.166 --- src/sys/sys/socketvar.h:1.165 Sat Apr 9 23:52:23 2022 +++ src/sys/sys/socketvar.h Fri Oct 13 18:50:39 2023 @@ -1,7 +1,7 @@ -/* $NetBSD: socketvar.h,v 1.165 2022/04/09 23:52:23 riastradh Exp $ */ +/* $NetBSD: socketvar.h,v 1.166 2023/10/13 18:50:39 ad Exp $ */ /*- - * Copyright (c) 2008, 2009 The NetBSD Foundation, Inc. + * Copyright (c) 2008, 2009, 2023 The NetBSD Foundation, Inc. * All rights reserved. * * This code is derived from software contributed to The NetBSD Foundation @@ -197,7 +197,6 @@ struct socket { #define SS_CANTRCVMORE 0x020 /* can't receive more data from peer */ #define SS_RCVATMARK 0x040 /* at mark on input */ #define SS_ISABORTING 0x080 /* aborting fd references - close() */ -#define SS_RESTARTSYS 0x100 /* restart blocked system calls */ #define SS_POLLRDBAND 0x200 /* poll should return POLLRDBAND */ #define SS_MORETOCOME 0x400 /* * hint from sosend to lower layer;