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 = &top;
 		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;

Reply via email to