Index | Thread | Search

From:
Alexander Bluhm <bluhm@openbsd.org>
Subject:
remove inpcb mutex
To:
tech@openbsd.org
Date:
Fri, 12 Jul 2024 19:05:54 +0200

Download raw body.

Thread
  • Alexander Bluhm:

    remove inpcb mutex

Hi,

mvs@ has converted all the incpb locking into socket receive buffer
mutex.  So we don't need per PCB mutex inp_mtx anymore.  Also delete
related locking functions.  A flag PR_MPSOCKET indicates whether
protocol functions support parallel access with per socket rw-lock.

TCP is the only protocol that is not MP capable and needs exclusive
netlock.

Also IPv4 GRE does not have the flag, but it may be added.  Next
diff.

ok?

bluhm

Index: kern/uipc_socket2.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/kern/uipc_socket2.c,v
diff -u -p -r1.156 uipc_socket2.c
--- kern/uipc_socket2.c	28 Jun 2024 21:30:24 -0000	1.156
+++ kern/uipc_socket2.c	12 Jul 2024 15:21:16 -0000
@@ -365,7 +365,7 @@ solock_shared(struct socket *so)
 	switch (so->so_proto->pr_domain->dom_family) {
 	case PF_INET:
 	case PF_INET6:
-		if (so->so_proto->pr_usrreqs->pru_lock != NULL) {
+		if (ISSET(so->so_proto->pr_flags, PR_MPSOCKET)) {
 			NET_LOCK_SHARED();
 			rw_enter_write(&so->so_lock);
 		} else
@@ -425,7 +425,7 @@ sounlock_shared(struct socket *so)
 	switch (so->so_proto->pr_domain->dom_family) {
 	case PF_INET:
 	case PF_INET6:
-		if (so->so_proto->pr_usrreqs->pru_unlock != NULL) {
+		if (ISSET(so->so_proto->pr_flags, PR_MPSOCKET)) {
 			rw_exit_write(&so->so_lock);
 			NET_UNLOCK_SHARED();
 		} else
@@ -460,7 +460,7 @@ soassertlocked(struct socket *so)
 		if (rw_status(&netlock) == RW_READ) {
 			NET_ASSERT_LOCKED();
 
-			if (splassert_ctl > 0 && pru_locked(so) == 0 &&
+			if (splassert_ctl > 0 &&
 			    rw_status(&so->so_lock) != RW_WRITE)
 				splassert_fail(0, RW_WRITE, __func__);
 		} else
@@ -481,12 +481,12 @@ sosleep_nsec(struct socket *so, void *id
 	switch (so->so_proto->pr_domain->dom_family) {
 	case PF_INET:
 	case PF_INET6:
-		if (so->so_proto->pr_usrreqs->pru_unlock != NULL &&
+		if (ISSET(so->so_proto->pr_flags, PR_MPSOCKET) &&
 		    rw_status(&netlock) == RW_READ) {
 			rw_exit_write(&so->so_lock);
 		}
 		ret = rwsleep_nsec(ident, &netlock, prio, wmesg, nsecs);
-		if (so->so_proto->pr_usrreqs->pru_lock != NULL &&
+		if (ISSET(so->so_proto->pr_flags, PR_MPSOCKET) &&
 		    rw_status(&netlock) == RW_READ) {
 			rw_enter_write(&so->so_lock);
 		}
Index: netinet/in_pcb.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/netinet/in_pcb.c,v
diff -u -p -r1.302 in_pcb.c
--- netinet/in_pcb.c	19 Apr 2024 10:13:58 -0000	1.302
+++ netinet/in_pcb.c	12 Jul 2024 15:05:18 -0000
@@ -239,7 +239,6 @@ in_pcballoc(struct socket *so, struct in
 	inp->inp_table = table;
 	inp->inp_socket = so;
 	refcnt_init_trace(&inp->inp_refcnt, DT_REFCNT_IDX_INPCB);
-	mtx_init(&inp->inp_mtx, IPL_SOFTNET);
 	inp->inp_seclevel.sl_auth = IPSEC_AUTH_LEVEL_DEFAULT;
 	inp->inp_seclevel.sl_esp_trans = IPSEC_ESP_TRANS_LEVEL_DEFAULT;
 	inp->inp_seclevel.sl_esp_network = IPSEC_ESP_NETWORK_LEVEL_DEFAULT;
Index: netinet/in_pcb.h
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/netinet/in_pcb.h,v
diff -u -p -r1.157 in_pcb.h
--- netinet/in_pcb.h	19 Apr 2024 10:13:58 -0000	1.157
+++ netinet/in_pcb.h	12 Jul 2024 15:31:46 -0000
@@ -80,7 +80,6 @@
  *	N	net lock
  *	t	inpt_mtx		pcb table mutex
  *	y	inpt_notify		pcb table rwlock for notify
- *	p	inpcb_mtx		pcb mutex
  *	L	pf_inp_mtx		link pf to inp mutex
  *	s	so_lock			socket rwlock
  */
@@ -94,8 +93,8 @@
  * needed, so that socket layer input have a consistent view at these
  * values.
  *
- * In soconnect() and sosend() pcb mutex cannot be used.  They eventually
- * can call IP output which takes pf lock which is a sleeping lock.
+ * In soconnect() and sosend() a per pcb mutex cannot be used.  They
+ * eventually call IP output which takes pf lock which is a sleeping lock.
  * Also connect(2) does a route lookup for source selection.  There
  * route resolve happens, which creates a route, which sends a route
  * message, which needs route lock, which is a rw-lock.
@@ -106,15 +105,9 @@
  *
  * So there are three locks.  Table mutex is for writing inp_[lf]addr/port
  * and lookup, socket rw-lock to separate sockets in system calls, and
- * pcb mutex to protect socket receive buffer.  Changing inp_[lf]addr/port
- * takes both per socket rw-lock and global table mutex.  Protocol
- * input only reads inp_[lf]addr/port during lookup and is safe.  System
- * call only reads when holding socket rw-lock and is safe.  The socket
- * layer needs pcb mutex only in soreceive().
- *
- * Function pru_lock() grabs the pcb mutex and its existence indicates
- * that a protocol is MP safe.  Otherwise the exclusive net lock is
- * used.
+ * socket buffer mutex to protect socket receive buffer.  Changing
+ * inp_[lf]addr/port takes both per socket rw-lock and global table mutex.
+ * Protocol input only reads inp_[lf]addr/port during lookup and is safe.
  */
 
 struct pf_state_key;
@@ -149,7 +142,6 @@ struct inpcb {
 	caddr_t	  inp_ppcb;		/* pointer to per-protocol pcb */
 	struct    route inp_route;	/* cached route */
 	struct    refcnt inp_refcnt;	/* refcount PCB, delay memory free */
-	struct	  mutex inp_mtx;	/* protect PCB and socket members */
 	int	  inp_flags;		/* generic IP/datagram flags */
 	union {				/* Header prototype. */
 		struct ip hu_ip;
Index: netinet/in_proto.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/netinet/in_proto.c,v
diff -u -p -r1.104 in_proto.c
--- netinet/in_proto.c	14 Apr 2024 20:46:27 -0000	1.104
+++ netinet/in_proto.c	12 Jul 2024 15:26:38 -0000
@@ -185,7 +185,7 @@ const struct protosw inetsw[] = {
   .pr_type	= SOCK_DGRAM,
   .pr_domain	= &inetdomain,
   .pr_protocol	= IPPROTO_UDP,
-  .pr_flags	= PR_ATOMIC|PR_ADDR|PR_SPLICE,
+  .pr_flags	= PR_ATOMIC|PR_ADDR|PR_SPLICE|PR_MPSOCKET,
   .pr_input	= udp_input,
   .pr_ctlinput	= udp_ctlinput,
   .pr_ctloutput	= ip_ctloutput,
@@ -210,7 +210,7 @@ const struct protosw inetsw[] = {
   .pr_type	= SOCK_RAW,
   .pr_domain	= &inetdomain,
   .pr_protocol	= IPPROTO_RAW,
-  .pr_flags	= PR_ATOMIC|PR_ADDR|PR_MPINPUT,
+  .pr_flags	= PR_ATOMIC|PR_ADDR|PR_MPINPUT|PR_MPSOCKET,
   .pr_input	= rip_input,
   .pr_ctloutput	= rip_ctloutput,
   .pr_usrreqs	= &rip_usrreqs,
@@ -219,7 +219,7 @@ const struct protosw inetsw[] = {
   .pr_type	= SOCK_RAW,
   .pr_domain	= &inetdomain,
   .pr_protocol	= IPPROTO_ICMP,
-  .pr_flags	= PR_ATOMIC|PR_ADDR,
+  .pr_flags	= PR_ATOMIC|PR_ADDR|PR_MPSOCKET,
   .pr_input	= icmp_input,
   .pr_ctloutput	= rip_ctloutput,
   .pr_usrreqs	= &rip_usrreqs,
@@ -230,7 +230,7 @@ const struct protosw inetsw[] = {
   .pr_type	= SOCK_RAW,
   .pr_domain	= &inetdomain,
   .pr_protocol	= IPPROTO_IPV4,
-  .pr_flags	= PR_ATOMIC|PR_ADDR,
+  .pr_flags	= PR_ATOMIC|PR_ADDR|PR_MPSOCKET,
 #if NGIF > 0
   .pr_input	= in_gif_input,
 #else
@@ -246,7 +246,7 @@ const struct protosw inetsw[] = {
   .pr_type	= SOCK_RAW,
   .pr_domain	= &inetdomain,
   .pr_protocol	= IPPROTO_IPV6,
-  .pr_flags	= PR_ATOMIC|PR_ADDR,
+  .pr_flags	= PR_ATOMIC|PR_ADDR|PR_MPSOCKET,
 #if NGIF > 0
   .pr_input	= in_gif_input,
 #else
@@ -261,7 +261,7 @@ const struct protosw inetsw[] = {
   .pr_type	= SOCK_RAW,
   .pr_domain	= &inetdomain,
   .pr_protocol	= IPPROTO_MPLS,
-  .pr_flags	= PR_ATOMIC|PR_ADDR,
+  .pr_flags	= PR_ATOMIC|PR_ADDR|PR_MPSOCKET,
   .pr_input	= in_gif_input,
   .pr_usrreqs	= &rip_usrreqs,
 },
@@ -270,7 +270,7 @@ const struct protosw inetsw[] = {
   .pr_type	= SOCK_RAW,
   .pr_domain	= &inetdomain,
   .pr_protocol	= IPPROTO_IGMP,
-  .pr_flags	= PR_ATOMIC|PR_ADDR,
+  .pr_flags	= PR_ATOMIC|PR_ADDR|PR_MPSOCKET,
   .pr_input	= igmp_input,
   .pr_ctloutput	= rip_ctloutput,
   .pr_usrreqs	= &rip_usrreqs,
@@ -284,7 +284,7 @@ const struct protosw inetsw[] = {
   .pr_type	= SOCK_RAW,
   .pr_domain	= &inetdomain,
   .pr_protocol	= IPPROTO_AH,
-  .pr_flags	= PR_ATOMIC|PR_ADDR,
+  .pr_flags	= PR_ATOMIC|PR_ADDR|PR_MPSOCKET,
   .pr_input	= ah46_input,
   .pr_ctlinput	= ah4_ctlinput,
   .pr_ctloutput	= rip_ctloutput,
@@ -295,7 +295,7 @@ const struct protosw inetsw[] = {
   .pr_type	= SOCK_RAW,
   .pr_domain	= &inetdomain,
   .pr_protocol	= IPPROTO_ESP,
-  .pr_flags	= PR_ATOMIC|PR_ADDR,
+  .pr_flags	= PR_ATOMIC|PR_ADDR|PR_MPSOCKET,
   .pr_input	= esp46_input,
   .pr_ctlinput	= esp4_ctlinput,
   .pr_ctloutput	= rip_ctloutput,
@@ -306,7 +306,7 @@ const struct protosw inetsw[] = {
   .pr_type	= SOCK_RAW,
   .pr_domain	= &inetdomain,
   .pr_protocol	= IPPROTO_IPCOMP,
-  .pr_flags	= PR_ATOMIC|PR_ADDR,
+  .pr_flags	= PR_ATOMIC|PR_ADDR|PR_MPSOCKET,
   .pr_input	= ipcomp46_input,
   .pr_ctloutput	= rip_ctloutput,
   .pr_usrreqs	= &rip_usrreqs,
@@ -330,7 +330,7 @@ const struct protosw inetsw[] = {
   .pr_type	= SOCK_RAW,
   .pr_domain	= &inetdomain,
   .pr_protocol	= IPPROTO_CARP,
-  .pr_flags	= PR_ATOMIC|PR_ADDR,
+  .pr_flags	= PR_ATOMIC|PR_ADDR|PR_MPSOCKET,
   .pr_input	= carp_proto_input,
   .pr_ctloutput	= rip_ctloutput,
   .pr_usrreqs	= &rip_usrreqs,
@@ -342,7 +342,7 @@ const struct protosw inetsw[] = {
   .pr_type	= SOCK_RAW,
   .pr_domain	= &inetdomain,
   .pr_protocol	= IPPROTO_PFSYNC,
-  .pr_flags	= PR_ATOMIC|PR_ADDR,
+  .pr_flags	= PR_ATOMIC|PR_ADDR|PR_MPSOCKET,
   .pr_input	= pfsync_input4,
   .pr_ctloutput	= rip_ctloutput,
   .pr_usrreqs	= &rip_usrreqs,
@@ -354,7 +354,7 @@ const struct protosw inetsw[] = {
   .pr_type	= SOCK_RAW,
   .pr_domain	= &inetdomain,
   .pr_protocol	= IPPROTO_DIVERT,
-  .pr_flags	= PR_ATOMIC|PR_ADDR,
+  .pr_flags	= PR_ATOMIC|PR_ADDR|PR_MPSOCKET,
   .pr_ctloutput	= rip_ctloutput,
   .pr_usrreqs	= &divert_usrreqs,
   .pr_init	= divert_init,
@@ -366,7 +366,7 @@ const struct protosw inetsw[] = {
   .pr_type	= SOCK_RAW,
   .pr_domain	= &inetdomain,
   .pr_protocol	= IPPROTO_ETHERIP,
-  .pr_flags	= PR_ATOMIC|PR_ADDR,
+  .pr_flags	= PR_ATOMIC|PR_ADDR|PR_MPSOCKET,
   .pr_input	= ip_etherip_input,
   .pr_ctloutput	= rip_ctloutput,
   .pr_usrreqs	= &rip_usrreqs,
@@ -377,7 +377,7 @@ const struct protosw inetsw[] = {
   /* raw wildcard */
   .pr_type	= SOCK_RAW,
   .pr_domain	= &inetdomain,
-  .pr_flags	= PR_ATOMIC|PR_ADDR|PR_MPINPUT,
+  .pr_flags	= PR_ATOMIC|PR_ADDR|PR_MPINPUT|PR_MPSOCKET,
   .pr_input	= rip_input,
   .pr_ctloutput	= rip_ctloutput,
   .pr_usrreqs	= &rip_usrreqs,
Index: netinet/ip_divert.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/netinet/ip_divert.c,v
diff -u -p -r1.95 ip_divert.c
--- netinet/ip_divert.c	5 Mar 2024 09:45:13 -0000	1.95
+++ netinet/ip_divert.c	12 Jul 2024 15:12:30 -0000
@@ -65,9 +65,6 @@ const struct sysctl_bounded_args divertc
 const struct pr_usrreqs divert_usrreqs = {
 	.pru_attach	= divert_attach,
 	.pru_detach	= divert_detach,
-	.pru_lock	= divert_lock,
-	.pru_unlock	= divert_unlock,
-	.pru_locked	= divert_locked,
 	.pru_bind	= divert_bind,
 	.pru_shutdown	= divert_shutdown,
 	.pru_send	= divert_send,
@@ -294,32 +291,6 @@ divert_detach(struct socket *so)
 
 	in_pcbdetach(inp);
 	return (0);
-}
-
-void
-divert_lock(struct socket *so)
-{
-	struct inpcb *inp = sotoinpcb(so);
-
-	NET_ASSERT_LOCKED();
-	mtx_enter(&inp->inp_mtx);
-}
-
-void
-divert_unlock(struct socket *so)
-{
-	struct inpcb *inp = sotoinpcb(so);
-
-	NET_ASSERT_LOCKED();
-	mtx_leave(&inp->inp_mtx);
-}
-
-int
-divert_locked(struct socket *so)
-{
-	struct inpcb *inp = sotoinpcb(so);
-
-	return mtx_owned(&inp->inp_mtx);
 }
 
 int
Index: netinet/ip_divert.h
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/netinet/ip_divert.h,v
diff -u -p -r1.25 ip_divert.h
--- netinet/ip_divert.h	3 Feb 2024 22:50:09 -0000	1.25
+++ netinet/ip_divert.h	12 Jul 2024 16:56:44 -0000
@@ -72,9 +72,6 @@ void	 divert_packet(struct mbuf *, int, 
 int	 divert_sysctl(int *, u_int, void *, size_t *, void *, size_t);
 int	 divert_attach(struct socket *, int, int);
 int	 divert_detach(struct socket *);
-void	 divert_lock(struct socket *);
-void	 divert_unlock(struct socket *);
-int	 divert_locked(struct socket *);
 int	 divert_bind(struct socket *, struct mbuf *, struct proc *);
 int	 divert_shutdown(struct socket *);
 int	 divert_send(struct socket *, struct mbuf *, struct mbuf *,
Index: netinet/ip_var.h
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/netinet/ip_var.h,v
diff -u -p -r1.119 ip_var.h
--- netinet/ip_var.h	2 Jul 2024 18:33:47 -0000	1.119
+++ netinet/ip_var.h	12 Jul 2024 16:58:57 -0000
@@ -274,9 +274,6 @@ struct mbuf *
 	 rip_chkhdr(struct mbuf *, struct mbuf *);
 int	 rip_attach(struct socket *, int, int);
 int	 rip_detach(struct socket *);
-void	 rip_lock(struct socket *);
-void	 rip_unlock(struct socket *);
-int	 rip_locked(struct socket *);
 int	 rip_bind(struct socket *, struct mbuf *, struct proc *);
 int	 rip_connect(struct socket *, struct mbuf *);
 int	 rip_disconnect(struct socket *);
Index: netinet/raw_ip.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/netinet/raw_ip.c,v
diff -u -p -r1.159 raw_ip.c
--- netinet/raw_ip.c	17 Apr 2024 20:48:51 -0000	1.159
+++ netinet/raw_ip.c	12 Jul 2024 15:21:27 -0000
@@ -106,9 +106,6 @@ struct inpcbtable rawcbtable;
 const struct pr_usrreqs rip_usrreqs = {
 	.pru_attach	= rip_attach,
 	.pru_detach	= rip_detach,
-	.pru_lock	= rip_lock,
-	.pru_unlock	= rip_unlock,
-	.pru_locked	= rip_locked,
 	.pru_bind	= rip_bind,
 	.pru_connect	= rip_connect,
 	.pru_disconnect	= rip_disconnect,
@@ -512,32 +509,6 @@ rip_detach(struct socket *so)
 	in_pcbdetach(inp);
 
 	return (0);
-}
-
-void
-rip_lock(struct socket *so)
-{
-	struct inpcb *inp = sotoinpcb(so);
-
-	NET_ASSERT_LOCKED();
-	mtx_enter(&inp->inp_mtx);
-}
-
-void
-rip_unlock(struct socket *so)
-{
-	struct inpcb *inp = sotoinpcb(so);
-
-	NET_ASSERT_LOCKED();
-	mtx_leave(&inp->inp_mtx);
-}
-
-int
-rip_locked(struct socket *so)
-{
-	struct inpcb *inp = sotoinpcb(so);
-
-	return mtx_owned(&inp->inp_mtx);
 }
 
 int
Index: netinet/udp_usrreq.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/netinet/udp_usrreq.c,v
diff -u -p -r1.320 udp_usrreq.c
--- netinet/udp_usrreq.c	17 Apr 2024 20:48:51 -0000	1.320
+++ netinet/udp_usrreq.c	12 Jul 2024 15:22:07 -0000
@@ -125,9 +125,6 @@ u_int	udp_recvspace = 40 * (1024 + sizeo
 const struct pr_usrreqs udp_usrreqs = {
 	.pru_attach	= udp_attach,
 	.pru_detach	= udp_detach,
-	.pru_lock	= udp_lock,
-	.pru_unlock	= udp_unlock,
-	.pru_locked	= udp_locked,
 	.pru_bind	= udp_bind,
 	.pru_connect	= udp_connect,
 	.pru_disconnect	= udp_disconnect,
@@ -142,9 +139,6 @@ const struct pr_usrreqs udp_usrreqs = {
 const struct pr_usrreqs udp6_usrreqs = {
 	.pru_attach	= udp_attach,
 	.pru_detach	= udp_detach,
-	.pru_lock	= udp_lock,
-	.pru_unlock	= udp_unlock,
-	.pru_locked	= udp_locked,
 	.pru_bind	= udp_bind,
 	.pru_connect	= udp_connect,
 	.pru_disconnect	= udp_disconnect,
@@ -1138,32 +1132,6 @@ udp_detach(struct socket *so)
 
 	in_pcbdetach(inp);
 	return (0);
-}
-
-void
-udp_lock(struct socket *so)
-{
-	struct inpcb *inp = sotoinpcb(so);
-
-	NET_ASSERT_LOCKED();
-	mtx_enter(&inp->inp_mtx);
-}
-
-void
-udp_unlock(struct socket *so)
-{
-	struct inpcb *inp = sotoinpcb(so);
-
-	NET_ASSERT_LOCKED();
-	mtx_leave(&inp->inp_mtx);
-}
-
-int
-udp_locked(struct socket *so)
-{
-	struct inpcb *inp = sotoinpcb(so);
-
-	return mtx_owned(&inp->inp_mtx);
 }
 
 int
Index: netinet/udp_var.h
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/netinet/udp_var.h,v
diff -u -p -r1.51 udp_var.h
--- netinet/udp_var.h	3 Feb 2024 22:50:09 -0000	1.51
+++ netinet/udp_var.h	12 Jul 2024 16:57:41 -0000
@@ -145,9 +145,6 @@ int	 udp6_output(struct inpcb *, struct 
 int	 udp_sysctl(int *, u_int, void *, size_t *, void *, size_t);
 int	 udp_attach(struct socket *, int, int);
 int	 udp_detach(struct socket *);
-void	 udp_lock(struct socket *);
-void	 udp_unlock(struct socket *);
-int	 udp_locked(struct socket *);
 int	 udp_bind(struct socket *, struct mbuf *, struct proc *);
 int	 udp_connect(struct socket *, struct mbuf *);
 int	 udp_disconnect(struct socket *);
Index: netinet6/in6_proto.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/netinet6/in6_proto.c,v
diff -u -p -r1.114 in6_proto.c
--- netinet6/in6_proto.c	16 Apr 2024 12:40:40 -0000	1.114
+++ netinet6/in6_proto.c	12 Jul 2024 16:55:40 -0000
@@ -136,7 +136,7 @@ const struct protosw inet6sw[] = {
   .pr_type	= SOCK_DGRAM,
   .pr_domain	= &inet6domain,
   .pr_protocol	= IPPROTO_UDP,
-  .pr_flags	= PR_ATOMIC|PR_ADDR|PR_SPLICE,
+  .pr_flags	= PR_ATOMIC|PR_ADDR|PR_SPLICE|PR_MPSOCKET,
   .pr_input	= udp_input,
   .pr_ctlinput	= udp6_ctlinput,
   .pr_ctloutput	= ip6_ctloutput,
@@ -158,7 +158,7 @@ const struct protosw inet6sw[] = {
   .pr_type	= SOCK_RAW,
   .pr_domain	= &inet6domain,
   .pr_protocol	= IPPROTO_RAW,
-  .pr_flags	= PR_ATOMIC|PR_ADDR|PR_MPINPUT,
+  .pr_flags	= PR_ATOMIC|PR_ADDR|PR_MPINPUT|PR_MPSOCKET,
   .pr_input	= rip6_input,
   .pr_ctlinput	= rip6_ctlinput,
   .pr_ctloutput	= rip6_ctloutput,
@@ -169,7 +169,7 @@ const struct protosw inet6sw[] = {
   .pr_type	= SOCK_RAW,
   .pr_domain	= &inet6domain,
   .pr_protocol	= IPPROTO_ICMPV6,
-  .pr_flags	= PR_ATOMIC|PR_ADDR,
+  .pr_flags	= PR_ATOMIC|PR_ADDR|PR_MPSOCKET,
   .pr_input	= icmp6_input,
   .pr_ctlinput	= rip6_ctlinput,
   .pr_ctloutput	= rip6_ctloutput,
@@ -204,7 +204,7 @@ const struct protosw inet6sw[] = {
   .pr_type	= SOCK_RAW,
   .pr_domain	= &inet6domain,
   .pr_protocol	= IPPROTO_AH,
-  .pr_flags	= PR_ATOMIC|PR_ADDR,
+  .pr_flags	= PR_ATOMIC|PR_ADDR|PR_MPSOCKET,
   .pr_input	= ah46_input,
   .pr_ctloutput	= rip6_ctloutput,
   .pr_usrreqs	= &rip6_usrreqs,
@@ -214,7 +214,7 @@ const struct protosw inet6sw[] = {
   .pr_type	= SOCK_RAW,
   .pr_domain	= &inet6domain,
   .pr_protocol	= IPPROTO_ESP,
-  .pr_flags	= PR_ATOMIC|PR_ADDR,
+  .pr_flags	= PR_ATOMIC|PR_ADDR|PR_MPSOCKET,
   .pr_input	= esp46_input,
   .pr_ctloutput	= rip6_ctloutput,
   .pr_usrreqs	= &rip6_usrreqs,
@@ -224,7 +224,7 @@ const struct protosw inet6sw[] = {
   .pr_type	= SOCK_RAW,
   .pr_domain	= &inet6domain,
   .pr_protocol	= IPPROTO_IPCOMP,
-  .pr_flags	= PR_ATOMIC|PR_ADDR,
+  .pr_flags	= PR_ATOMIC|PR_ADDR|PR_MPSOCKET,
   .pr_input	= ipcomp46_input,
   .pr_ctloutput	= rip6_ctloutput,
   .pr_usrreqs	= &rip6_usrreqs,
@@ -235,7 +235,7 @@ const struct protosw inet6sw[] = {
   .pr_type	= SOCK_RAW,
   .pr_domain	= &inet6domain,
   .pr_protocol	= IPPROTO_IPV4,
-  .pr_flags	= PR_ATOMIC|PR_ADDR,
+  .pr_flags	= PR_ATOMIC|PR_ADDR|PR_MPSOCKET,
 #if NGIF > 0
   .pr_input	= in6_gif_input,
 #else
@@ -248,7 +248,7 @@ const struct protosw inet6sw[] = {
   .pr_type	= SOCK_RAW,
   .pr_domain	= &inet6domain,
   .pr_protocol	= IPPROTO_IPV6,
-  .pr_flags	= PR_ATOMIC|PR_ADDR,
+  .pr_flags	= PR_ATOMIC|PR_ADDR|PR_MPSOCKET,
 #if NGIF > 0
   .pr_input	= in6_gif_input,
 #else
@@ -262,7 +262,7 @@ const struct protosw inet6sw[] = {
   .pr_type	= SOCK_RAW,
   .pr_domain	= &inet6domain,
   .pr_protocol	= IPPROTO_MPLS,
-  .pr_flags	= PR_ATOMIC|PR_ADDR,
+  .pr_flags	= PR_ATOMIC|PR_ADDR|PR_MPSOCKET,
 #if NGIF > 0
   .pr_input	= in6_gif_input,
 #else
@@ -277,7 +277,7 @@ const struct protosw inet6sw[] = {
   .pr_type	= SOCK_RAW,
   .pr_domain	= &inet6domain,
   .pr_protocol	= IPPROTO_CARP,
-  .pr_flags	= PR_ATOMIC|PR_ADDR,
+  .pr_flags	= PR_ATOMIC|PR_ADDR|PR_MPSOCKET,
   .pr_input	= carp6_proto_input,
   .pr_ctloutput = rip6_ctloutput,
   .pr_usrreqs	= &rip6_usrreqs,
@@ -289,7 +289,7 @@ const struct protosw inet6sw[] = {
   .pr_type	= SOCK_RAW,
   .pr_domain	= &inet6domain,
   .pr_protocol	= IPPROTO_DIVERT,
-  .pr_flags	= PR_ATOMIC|PR_ADDR,
+  .pr_flags	= PR_ATOMIC|PR_ADDR|PR_MPSOCKET,
   .pr_ctloutput	= rip6_ctloutput,
   .pr_usrreqs	= &divert6_usrreqs,
   .pr_init	= divert6_init,
@@ -301,7 +301,7 @@ const struct protosw inet6sw[] = {
   .pr_type	= SOCK_RAW,
   .pr_domain	= &inet6domain,
   .pr_protocol	= IPPROTO_ETHERIP,
-  .pr_flags	= PR_ATOMIC|PR_ADDR,
+  .pr_flags	= PR_ATOMIC|PR_ADDR|PR_MPSOCKET,
   .pr_input	= ip6_etherip_input,
   .pr_ctloutput	= rip6_ctloutput,
   .pr_usrreqs	= &rip6_usrreqs,
@@ -312,7 +312,7 @@ const struct protosw inet6sw[] = {
   .pr_type	= SOCK_RAW,
   .pr_domain	= &inet6domain,
   .pr_protocol	= IPPROTO_GRE,
-  .pr_flags	= PR_ATOMIC|PR_ADDR,
+  .pr_flags	= PR_ATOMIC|PR_ADDR|PR_MPSOCKET,
   .pr_input	= gre_input6,
   .pr_ctloutput	= rip6_ctloutput,
   .pr_usrreqs	= &rip6_usrreqs,
@@ -322,7 +322,7 @@ const struct protosw inet6sw[] = {
   /* raw wildcard */
   .pr_type	= SOCK_RAW,
   .pr_domain	= &inet6domain,
-  .pr_flags	= PR_ATOMIC|PR_ADDR|PR_MPINPUT,
+  .pr_flags	= PR_ATOMIC|PR_ADDR|PR_MPINPUT|PR_MPSOCKET,
   .pr_input	= rip6_input,
   .pr_ctloutput	= rip6_ctloutput,
   .pr_usrreqs	= &rip6_usrreqs,
Index: netinet6/ip6_divert.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/netinet6/ip6_divert.c,v
diff -u -p -r1.95 ip6_divert.c
--- netinet6/ip6_divert.c	13 Feb 2024 12:22:09 -0000	1.95
+++ netinet6/ip6_divert.c	12 Jul 2024 15:25:30 -0000
@@ -68,9 +68,6 @@ const struct sysctl_bounded_args divert6
 const struct pr_usrreqs divert6_usrreqs = {
 	.pru_attach	= divert6_attach,
 	.pru_detach	= divert_detach,
-	.pru_lock	= divert_lock,
-	.pru_unlock	= divert_unlock,
-	.pru_locked	= divert_locked,
 	.pru_bind	= divert_bind,
 	.pru_shutdown	= divert_shutdown,
 	.pru_send	= divert6_send,
Index: netinet6/ip6_var.h
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/netinet6/ip6_var.h,v
diff -u -p -r1.119 ip6_var.h
--- netinet6/ip6_var.h	4 Jul 2024 12:50:08 -0000	1.119
+++ netinet6/ip6_var.h	12 Jul 2024 16:58:52 -0000
@@ -354,9 +354,6 @@ int	rip6_output(struct mbuf *, struct so
 	    struct mbuf *);
 int	rip6_attach(struct socket *, int, int);
 int	rip6_detach(struct socket *);
-void	rip6_lock(struct socket *);
-void	rip6_unlock(struct socket *);
-int	rip6_locked(struct socket *);
 int	rip6_bind(struct socket *, struct mbuf *, struct proc *);
 int	rip6_connect(struct socket *, struct mbuf *);
 int	rip6_disconnect(struct socket *);
Index: netinet6/raw_ip6.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/netinet6/raw_ip6.c,v
diff -u -p -r1.184 raw_ip6.c
--- netinet6/raw_ip6.c	17 Apr 2024 20:48:51 -0000	1.184
+++ netinet6/raw_ip6.c	12 Jul 2024 15:23:34 -0000
@@ -108,9 +108,6 @@ struct cpumem *rip6counters;
 const struct pr_usrreqs rip6_usrreqs = {
 	.pru_attach	= rip6_attach,
 	.pru_detach	= rip6_detach,
-	.pru_lock	= rip6_lock,
-	.pru_unlock	= rip6_unlock,
-	.pru_locked	= rip6_locked,
 	.pru_bind	= rip6_bind,
 	.pru_connect	= rip6_connect,
 	.pru_disconnect	= rip6_disconnect,
@@ -642,32 +639,6 @@ rip6_detach(struct socket *so)
 	in_pcbdetach(inp);
 
 	return (0);
-}
-
-void
-rip6_lock(struct socket *so)
-{
-	struct inpcb *inp = sotoinpcb(so);
-
-	NET_ASSERT_LOCKED();
-	mtx_enter(&inp->inp_mtx);
-}
-
-void
-rip6_unlock(struct socket *so)
-{
-	struct inpcb *inp = sotoinpcb(so);
-
-	NET_ASSERT_LOCKED();
-	mtx_leave(&inp->inp_mtx);
-}
-
-int
-rip6_locked(struct socket *so)
-{
-	struct inpcb *inp = sotoinpcb(so);
-
-	return mtx_owned(&inp->inp_mtx);
 }
 
 int
Index: sys/protosw.h
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sys/sys/protosw.h,v
diff -u -p -r1.66 protosw.h
--- sys/protosw.h	14 Apr 2024 20:46:27 -0000	1.66
+++ sys/protosw.h	12 Jul 2024 15:26:18 -0000
@@ -67,9 +67,6 @@ struct ifnet;
 struct pr_usrreqs {
 	int	(*pru_attach)(struct socket *, int, int);
 	int	(*pru_detach)(struct socket *);
-	void	(*pru_lock)(struct socket *);
-	void	(*pru_unlock)(struct socket *);
-	int	(*pru_locked)(struct socket *so);
 	int	(*pru_bind)(struct socket *, struct mbuf *, struct proc *);
 	int	(*pru_listen)(struct socket *);
 	int	(*pru_connect)(struct socket *, struct mbuf *);
@@ -133,6 +130,7 @@ struct protosw {
 					   socket */
 #define PR_SPLICE	0x0040		/* socket splicing is possible */
 #define PR_MPINPUT	0x0080		/* input runs with shared netlock */
+#define PR_MPSOCKET	0x0100		/* socket uses shared netlock */
 
 /*
  * The arguments to usrreq are:
@@ -282,28 +280,6 @@ static inline int
 pru_detach(struct socket *so)
 {
 	return (*so->so_proto->pr_usrreqs->pru_detach)(so);
-}
-
-static inline void
-pru_lock(struct socket *so)
-{
-	if (so->so_proto->pr_usrreqs->pru_lock)
-		(*so->so_proto->pr_usrreqs->pru_lock)(so);
-}
-
-static inline void
-pru_unlock(struct socket *so)
-{
-	if (so->so_proto->pr_usrreqs->pru_unlock)
-		(*so->so_proto->pr_usrreqs->pru_unlock)(so);
-}
-
-static inline int
-pru_locked(struct socket *so)
-{
-	if (so->so_proto->pr_usrreqs->pru_locked)
-		return (*so->so_proto->pr_usrreqs->pru_locked)(so);
-	return (0);
 }
 
 static inline int