{
        struct sk_buff *skb;
 
+       tcp_chrono_stop(sk, TCP_CHRONO_BUSY);
        while ((skb = __skb_dequeue(&sk->sk_write_queue)) != NULL)
                sk_wmem_free_skb(sk, skb);
        sk_mem_reclaim(sk);
 
 static inline void tcp_check_send_head(struct sock *sk, struct sk_buff *skb_unlinked)
 {
-       if (sk->sk_send_head == skb_unlinked)
+       if (sk->sk_send_head == skb_unlinked) {
                sk->sk_send_head = NULL;
+               tcp_chrono_stop(sk, TCP_CHRONO_BUSY);
+       }
        if (tcp_sk(sk)->highest_sack == skb_unlinked)
                tcp_sk(sk)->highest_sack = NULL;
 }
        /* Queue it, remembering where we must start sending. */
        if (sk->sk_send_head == NULL) {
                sk->sk_send_head = skb;
+               tcp_chrono_start(sk, TCP_CHRONO_BUSY);
 
                if (tcp_sk(sk)->highest_sack == NULL)
                        tcp_sk(sk)->highest_sack = skb;
 
        struct tcp_sock *tp = tcp_sk(sk);
 
        /* If there are multiple conditions worthy of tracking in a
-        * chronograph then the highest priority enum takes precedence over
-        * the other conditions. So that if something "more interesting"
+        * chronograph then the highest priority enum takes precedence
+        * over the other conditions. So that if something "more interesting"
         * starts happening, stop the previous chrono and start a new one.
         */
        if (type > tp->chrono_type)
 {
        struct tcp_sock *tp = tcp_sk(sk);
 
-       tcp_chrono_set(tp, TCP_CHRONO_UNSPEC);
+
+       /* There are multiple conditions worthy of tracking in a
+        * chronograph, so that the highest priority enum takes
+        * precedence over the other conditions (see tcp_chrono_start).
+        * If a condition stops, we only stop chrono tracking if
+        * it's the "most interesting" or current chrono we are
+        * tracking and starts busy chrono if we have pending data.
+        */
+       if (tcp_write_queue_empty(sk))
+               tcp_chrono_set(tp, TCP_CHRONO_UNSPEC);
+       else if (type == tp->chrono_type)
+               tcp_chrono_set(tp, TCP_CHRONO_BUSY);
 }
 
 /* This routine writes packets to the network.  It advances the
        fo->copied = space;
 
        tcp_connect_queue_skb(sk, syn_data);
+       if (syn_data->len)
+               tcp_chrono_start(sk, TCP_CHRONO_BUSY);
 
        err = tcp_transmit_skb(sk, syn_data, 1, sk->sk_allocation);