summaryrefslogtreecommitdiff
path: root/sys/netinet
diff options
context:
space:
mode:
authorVitaliy Makkoveev <mvs@cvs.openbsd.org>2024-07-20 17:26:20 +0000
committerVitaliy Makkoveev <mvs@cvs.openbsd.org>2024-07-20 17:26:20 +0000
commitd315ab526c7f9ea549df7384e58c3ce848892634 (patch)
tree56d284ebdaa2c6f88a06ecbdebbed7bc67a2e8da /sys/netinet
parent8e0aecedc0f5db86c589d5e919b2f8e8263fd593 (diff)
Unlock udp(4) somove().
Socket splicing belongs to sockets buffers. udp(4) sockets are fully switched to fine-grained buffers locks, so use them instead of exclusive solock(). Always schedule somove() thread to run as we do for tcp(4) case. This brings delay to packet processing, but it is comparable wit non splicing case where soreceive() threads are always scheduled. So, now spliced udp(4) sockets rely on sb_lock() of `so_rcv' buffer together with `sb_mtx' mutexes of both buffers. Shared solock() only required around pru_send() call, so the most of somove() thread runs simultaneously with network stack. Also document 'sosplice' structure locking. Feedback, tests and OK from bluhm.
Diffstat (limited to 'sys/netinet')
-rw-r--r--sys/netinet/udp_usrreq.c7
1 files changed, 6 insertions, 1 deletions
diff --git a/sys/netinet/udp_usrreq.c b/sys/netinet/udp_usrreq.c
index 0e4002a4c04..15a048e4067 100644
--- a/sys/netinet/udp_usrreq.c
+++ b/sys/netinet/udp_usrreq.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: udp_usrreq.c,v 1.322 2024/07/19 15:41:58 bluhm Exp $ */
+/* $OpenBSD: udp_usrreq.c,v 1.323 2024/07/20 17:26:19 mvs Exp $ */
/* $NetBSD: udp_usrreq.c,v 1.28 1996/03/16 23:54:03 christos Exp $ */
/*
@@ -1209,6 +1209,11 @@ udp_send(struct socket *so, struct mbuf *m, struct mbuf *addr,
soassertlocked_readonly(so);
+ if (inp == NULL) {
+ /* PCB could be destroyed, but socket still spliced. */
+ return (EINVAL);
+ }
+
#ifdef PIPEX
if (inp->inp_pipex) {
struct pipex_session *session;