Index | Thread | Search

From:
Vitaliy Makkoveev <mvs@openbsd.org>
Subject:
Use sorflush() instead of direct unp_scan() to discard dead unix(4) sockets
To:
tech@openbsd.org
Date:
Tue, 19 Mar 2024 17:51:48 +0300

Download raw body.

Thread
This is the part of making `so_rcv' sockbuf of unix(4) socket protected
by `sb_mtx' mutex(9) only. This work will remove relocking from the most
of send/receive path and make possible simultaneous send/receive on one
socket in the most cases.

I need this because the `so_rcv' sockbuf will be protected by `sb_mtx'
mutex(9), but unp_scan() does M_WAITOK memory allocation.

Actually, this is the same unp_scan(..., unp_discard) call, but with
the significant difference. The mbuf(9) chain is unlinked from the
receive socket. It is much safer because currently the buffers of
discarded sockets still contains addresses of file descriptors.

Index: sys/kern/uipc_socket.c
===================================================================
RCS file: /cvs/src/sys/kern/uipc_socket.c,v
retrieving revision 1.320
diff -u -p -r1.320 uipc_socket.c
--- sys/kern/uipc_socket.c	12 Feb 2024 22:48:27 -0000	1.320
+++ sys/kern/uipc_socket.c	19 Mar 2024 14:33:25 -0000
@@ -65,7 +65,6 @@ void	sotask(void *);
 void	soreaper(void *);
 void	soput(void *);
 int	somove(struct socket *, int);
-void	sorflush(struct socket *);
 
 void	filt_sordetach(struct knote *kn);
 int	filt_soread(struct knote *kn, long hint);
Index: sys/kern/uipc_usrreq.c
===================================================================
RCS file: /cvs/src/sys/kern/uipc_usrreq.c,v
retrieving revision 1.201
diff -u -p -r1.201 uipc_usrreq.c
--- sys/kern/uipc_usrreq.c	17 Mar 2024 19:47:08 -0000	1.201
+++ sys/kern/uipc_usrreq.c	19 Mar 2024 14:33:26 -0000
@@ -1438,7 +1438,7 @@ unp_gc(void *arg __unused)
 				 */
 				so = unp->unp_socket;
 				solock(so);
-				unp_scan(so->so_rcv.sb_mb, unp_discard);
+				sorflush(so);
 				sounlock(so);
 			}
 		}
Index: sys/sys/socketvar.h
===================================================================
RCS file: /cvs/src/sys/sys/socketvar.h,v
retrieving revision 1.124
diff -u -p -r1.124 socketvar.h
--- sys/sys/socketvar.h	12 Feb 2024 22:48:27 -0000	1.124
+++ sys/sys/socketvar.h	19 Mar 2024 14:33:26 -0000
@@ -394,6 +394,7 @@ int	sosend(struct socket *, struct mbuf 
 	    struct mbuf *, struct mbuf *, int);
 int	sosetopt(struct socket *, int, int, struct mbuf *);
 int	soshutdown(struct socket *, int);
+void	sorflush(struct socket *);
 void	sowakeup(struct socket *, struct sockbuf *);
 void	sorwakeup(struct socket *);
 void	sowwakeup(struct socket *);