summaryrefslogtreecommitdiff
path: root/usr/src/uts/common
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src/uts/common')
-rw-r--r--usr/src/uts/common/inet/tcp/tcp_time_wait.c15
-rw-r--r--usr/src/uts/common/inet/tcp_impl.h7
2 files changed, 20 insertions, 2 deletions
diff --git a/usr/src/uts/common/inet/tcp/tcp_time_wait.c b/usr/src/uts/common/inet/tcp/tcp_time_wait.c
index 4cfe13bb30..eb058a1c5f 100644
--- a/usr/src/uts/common/inet/tcp/tcp_time_wait.c
+++ b/usr/src/uts/common/inet/tcp/tcp_time_wait.c
@@ -171,14 +171,19 @@ tcp_time_wait_append(tcp_t *tcp)
CALLOUT_FLAG_ROUNDUP);
}
} else {
+ /*
+ * The list is not empty, so a timer must be running. If not,
+ * tcp_time_wait_collector() must be running on this
+ * tcp_time_wait list at the same time.
+ */
+ ASSERT(tcp_time_wait->tcp_time_wait_tid != 0 ||
+ tcp_time_wait->tcp_time_wait_running);
ASSERT(tcp_time_wait->tcp_time_wait_tail != NULL);
ASSERT(tcp_time_wait->tcp_time_wait_tail->tcp_state ==
TCPS_TIME_WAIT);
tcp_time_wait->tcp_time_wait_tail->tcp_time_wait_next = tcp;
tcp->tcp_time_wait_prev = tcp_time_wait->tcp_time_wait_tail;
- /* The list is not empty, so a timer must be running. */
- ASSERT(tcp_time_wait->tcp_time_wait_tid != 0);
}
tcp_time_wait->tcp_time_wait_tail = tcp;
mutex_exit(&tcp_time_wait->tcp_time_wait_lock);
@@ -241,6 +246,9 @@ tcp_time_wait_collector(void *arg)
mutex_enter(&tcp_time_wait->tcp_time_wait_lock);
tcp_time_wait->tcp_time_wait_tid = 0;
+#ifdef DEBUG
+ tcp_time_wait->tcp_time_wait_running = B_TRUE;
+#endif
if (tcp_time_wait->tcp_free_list != NULL &&
tcp_time_wait->tcp_free_list->tcp_in_free_list == B_TRUE) {
@@ -415,6 +423,9 @@ tcp_time_wait_collector(void *arg)
sqp, firetime, CALLOUT_TCP_RESOLUTION,
CALLOUT_FLAG_ROUNDUP);
}
+#ifdef DEBUG
+ tcp_time_wait->tcp_time_wait_running = B_FALSE;
+#endif
mutex_exit(&tcp_time_wait->tcp_time_wait_lock);
}
diff --git a/usr/src/uts/common/inet/tcp_impl.h b/usr/src/uts/common/inet/tcp_impl.h
index f2f70777e7..9d99d933bd 100644
--- a/usr/src/uts/common/inet/tcp_impl.h
+++ b/usr/src/uts/common/inet/tcp_impl.h
@@ -153,6 +153,13 @@ typedef struct tcp_squeue_priv_s {
tcp_t *tcp_time_wait_tail;
tcp_t *tcp_free_list;
uint_t tcp_free_list_cnt;
+#ifdef DEBUG
+ /*
+ * For debugging purpose, true when tcp_time_wait_collector() is
+ * running.
+ */
+ boolean_t tcp_time_wait_running;
+#endif
} tcp_squeue_priv_t;
/*