OSDN Git Service

Merge tag 'v4.4.214' into 10
[sagit-ice-cold/kernel_xiaomi_msm8998.git] / net / ipv4 / tcp.c
index 77e91ed..9b11b91 100644 (file)
@@ -302,6 +302,12 @@ EXPORT_SYMBOL(sysctl_tcp_wmem);
 atomic_long_t tcp_memory_allocated;    /* Current allocated memory. */
 EXPORT_SYMBOL(tcp_memory_allocated);
 
+int sysctl_tcp_delack_seg __read_mostly = TCP_DELACK_SEG;
+EXPORT_SYMBOL(sysctl_tcp_delack_seg);
+
+int sysctl_tcp_use_userconfig __read_mostly;
+EXPORT_SYMBOL(sysctl_tcp_use_userconfig);
+
 /*
  * Current number of TCP sockets.
  */
@@ -1407,8 +1413,11 @@ static void tcp_cleanup_rbuf(struct sock *sk, int copied)
                   /* Delayed ACKs frequently hit locked sockets during bulk
                    * receive. */
                if (icsk->icsk_ack.blocked ||
-                   /* Once-per-two-segments ACK was not sent by tcp_input.c */
-                   tp->rcv_nxt - tp->rcv_wup > icsk->icsk_ack.rcv_mss ||
+                   /* Once-per-sysctl_tcp_delack_seg segments
+                         * ACK was not sent by tcp_input.c
+                         */
+                   tp->rcv_nxt - tp->rcv_wup > (icsk->icsk_ack.rcv_mss) *
+                                               sysctl_tcp_delack_seg ||
                    /*
                     * If this read emptied read buffer, we send ACK, if
                     * connection is not bidirectional, user drained
@@ -2261,6 +2270,7 @@ int tcp_disconnect(struct sock *sk, int flags)
        tp->window_clamp = 0;
        tcp_set_ca_state(sk, TCP_CA_Open);
        tcp_clear_retrans(tp);
+       tp->total_retrans = 0;
        inet_csk_delack_init(sk);
        /* Initialize rcv_mss to TCP_MIN_MSS to avoid division by 0
         * issue in __tcp_select_window()
@@ -2272,6 +2282,8 @@ int tcp_disconnect(struct sock *sk, int flags)
        dst_release(sk->sk_rx_dst);
        sk->sk_rx_dst = NULL;
        tcp_saved_syn_free(tp);
+       tp->segs_in = 0;
+       tp->segs_out = 0;
        tp->bytes_acked = 0;
        tp->bytes_received = 0;
 
@@ -2739,6 +2751,14 @@ void tcp_get_info(struct sock *sk, struct tcp_info *info)
        rate64 = rate != ~0U ? rate : ~0ULL;
        put_unaligned(rate64, &info->tcpi_max_pacing_rate);
 
+       /* Expose reference count for socket */
+       if (sk->sk_socket) {
+               struct file *filep = sk->sk_socket->file;
+
+               if (filep)
+                       info->tcpi_count = file_count(filep);
+       }
+
        do {
                start = u64_stats_fetch_begin_irq(&tp->syncp);
                put_unaligned(tp->bytes_acked, &info->tcpi_bytes_acked);