summaryrefslogtreecommitdiff
path: root/usr/src/uts/common/inet/tcp/tcp.c
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/uts/common/inet/tcp/tcp.c')
-rw-r--r--usr/src/uts/common/inet/tcp/tcp.c10
1 files changed, 10 insertions, 0 deletions
diff --git a/usr/src/uts/common/inet/tcp/tcp.c b/usr/src/uts/common/inet/tcp/tcp.c
index 5c34200c3f..e4aff1d002 100644
--- a/usr/src/uts/common/inet/tcp/tcp.c
+++ b/usr/src/uts/common/inet/tcp/tcp.c
@@ -2405,6 +2405,16 @@ tcp_accept_swap(tcp_t *listener, tcp_t *acceptor, tcp_t *eager)
eager->tcp_rq->q_ptr = econnp;
eager->tcp_wq->q_ptr = econnp;
+
+ /*
+ * In the TLI/XTI loopback case, we are inside the listener's squeue,
+ * which might be a different squeue from our peer TCP instance.
+ * For TCP Fusion, the peer expects that whenever tcp_detached is
+ * clear, our TCP queues point to the acceptor's queues. Thus, use
+ * membar_producer() to ensure that the assignments of tcp_rq/tcp_wq
+ * above reach global visibility prior to the clearing of tcp_detached.
+ */
+ membar_producer();
eager->tcp_detached = B_FALSE;
ASSERT(eager->tcp_ack_tid == 0);