|
@@ -252,7 +252,8 @@ static void tcp_delack_timer(unsigned long data)
|
|
inet_csk(sk)->icsk_ack.blocked = 1;
|
|
inet_csk(sk)->icsk_ack.blocked = 1;
|
|
NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_DELAYEDACKLOCKED);
|
|
NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_DELAYEDACKLOCKED);
|
|
/* deleguate our work to tcp_release_cb() */
|
|
/* deleguate our work to tcp_release_cb() */
|
|
- set_bit(TCP_WRITE_TIMER_DEFERRED, &tcp_sk(sk)->tsq_flags);
|
|
|
|
|
|
+ if (!test_and_set_bit(TCP_DELACK_TIMER_DEFERRED, &tcp_sk(sk)->tsq_flags))
|
|
|
|
+ sock_hold(sk);
|
|
}
|
|
}
|
|
bh_unlock_sock(sk);
|
|
bh_unlock_sock(sk);
|
|
sock_put(sk);
|
|
sock_put(sk);
|
|
@@ -481,7 +482,8 @@ static void tcp_write_timer(unsigned long data)
|
|
tcp_write_timer_handler(sk);
|
|
tcp_write_timer_handler(sk);
|
|
} else {
|
|
} else {
|
|
/* deleguate our work to tcp_release_cb() */
|
|
/* deleguate our work to tcp_release_cb() */
|
|
- set_bit(TCP_WRITE_TIMER_DEFERRED, &tcp_sk(sk)->tsq_flags);
|
|
|
|
|
|
+ if (!test_and_set_bit(TCP_WRITE_TIMER_DEFERRED, &tcp_sk(sk)->tsq_flags))
|
|
|
|
+ sock_hold(sk);
|
|
}
|
|
}
|
|
bh_unlock_sock(sk);
|
|
bh_unlock_sock(sk);
|
|
sock_put(sk);
|
|
sock_put(sk);
|