@@ -597,12 +597,6 @@ static void tcp_keepalive_timer (unsigned long data)
if (!sock_flag(sk, SOCK_KEEPOPEN) || sk->sk_state == TCP_CLOSE)
goto out;
- elapsed = keepalive_time_when(tp);
-
- /* It is alive without keepalive 8) */
- if (tp->packets_out || tcp_send_head(sk))
- goto resched;
-
elapsed = keepalive_time_elapsed(tp);
if (elapsed >= keepalive_time_when(tp)) {
@@ -618,7 +612,9 @@ static void tcp_keepalive_timer (unsigned long data)
tcp_write_err(sk);
goto out;
}
- if (tcp_write_wakeup(sk) <= 0) {
+ if (tp->packets_out == 0 &&
+ tcp_send_head(sk) == NULL &&
+ tcp_write_wakeup(sk) <= 0) {
icsk->icsk_probes_out++;
elapsed = keepalive_intvl_when(tp);
} else {
@@ -634,7 +630,6 @@ static void tcp_keepalive_timer (unsigned long data)
sk_mem_reclaim(sk);
-resched:
inet_csk_reset_keepalive_timer (sk, elapsed);
goto out;
Other patch to extend effect of USER_TIMEOUT
@@ -303,7 +303,8 @@ static void tcp_probe_timer(struct sock *sk)
return;
}
- if (icsk->icsk_probes_out > max_probes) {
+ if (icsk->icsk_probes_out > max_probes ||
+ (icsk->icsk_user_timeout && icsk->icsk_user_timeout < keepalive_time_elapsed(tp))) {
tcp_write_err(sk);
} else {
/* Only send another probe if we didn't close things up. */