Download raw body.
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
remove inpcb mutex