summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sys/kern/uipc_socket.c11
1 files changed, 8 insertions, 3 deletions
diff --git a/sys/kern/uipc_socket.c b/sys/kern/uipc_socket.c
index 3c8d08b774a..0c3b5bb52a5 100644
--- a/sys/kern/uipc_socket.c
+++ b/sys/kern/uipc_socket.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: uipc_socket.c,v 1.302 2023/04/24 09:20:09 mvs Exp $ */
+/* $OpenBSD: uipc_socket.c,v 1.303 2023/04/28 12:53:42 bluhm Exp $ */
/* $NetBSD: uipc_socket.c,v 1.21 1996/02/04 02:17:52 christos Exp $ */
/*
@@ -1258,14 +1258,19 @@ sosplice(struct socket *so, int fd, off_t max, struct timeval *tv)
if (sosplice_taskq == NULL) {
tq = taskq_create("sosplice", 1, IPL_SOFTNET,
TASKQ_MPSAFE);
+ if (tq == NULL) {
+ rw_exit_write(&sosplice_lock);
+ return (ENOMEM);
+ }
/* Ensure the taskq is fully visible to other CPUs. */
membar_producer();
sosplice_taskq = tq;
}
rw_exit_write(&sosplice_lock);
+ } else {
+ /* Ensure the taskq is fully visible on this CPU. */
+ membar_consumer();
}
- if (sosplice_taskq == NULL)
- return (ENOMEM);
if ((so->so_proto->pr_flags & PR_SPLICE) == 0)
return (EPROTONOSUPPORT);