aboutsummaryrefslogtreecommitdiffstats
path: root/net/ipv4/tcp_timer.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/ipv4/tcp_timer.c')
-rw-r--r--net/ipv4/tcp_timer.c25
1 files changed, 25 insertions, 0 deletions
diff --git a/net/ipv4/tcp_timer.c b/net/ipv4/tcp_timer.c
index 92bdf64fffae..3b3611729928 100644
--- a/net/ipv4/tcp_timer.c
+++ b/net/ipv4/tcp_timer.c
@@ -708,6 +708,27 @@ out:
708 sock_put(sk); 708 sock_put(sk);
709} 709}
710 710
711static enum hrtimer_restart tcp_compressed_ack_kick(struct hrtimer *timer)
712{
713 struct tcp_sock *tp = container_of(timer, struct tcp_sock, compressed_ack_timer);
714 struct sock *sk = (struct sock *)tp;
715
716 bh_lock_sock(sk);
717 if (!sock_owned_by_user(sk)) {
718 if (tp->compressed_ack)
719 tcp_send_ack(sk);
720 } else {
721 if (!test_and_set_bit(TCP_DELACK_TIMER_DEFERRED,
722 &sk->sk_tsq_flags))
723 sock_hold(sk);
724 }
725 bh_unlock_sock(sk);
726
727 sock_put(sk);
728
729 return HRTIMER_NORESTART;
730}
731
711void tcp_init_xmit_timers(struct sock *sk) 732void tcp_init_xmit_timers(struct sock *sk)
712{ 733{
713 inet_csk_init_xmit_timers(sk, &tcp_write_timer, &tcp_delack_timer, 734 inet_csk_init_xmit_timers(sk, &tcp_write_timer, &tcp_delack_timer,
@@ -715,4 +736,8 @@ void tcp_init_xmit_timers(struct sock *sk)
715 hrtimer_init(&tcp_sk(sk)->pacing_timer, CLOCK_MONOTONIC, 736 hrtimer_init(&tcp_sk(sk)->pacing_timer, CLOCK_MONOTONIC,
716 HRTIMER_MODE_ABS_PINNED_SOFT); 737 HRTIMER_MODE_ABS_PINNED_SOFT);
717 tcp_sk(sk)->pacing_timer.function = tcp_pace_kick; 738 tcp_sk(sk)->pacing_timer.function = tcp_pace_kick;
739
740 hrtimer_init(&tcp_sk(sk)->compressed_ack_timer, CLOCK_MONOTONIC,
741 HRTIMER_MODE_REL_PINNED_SOFT);
742 tcp_sk(sk)->compressed_ack_timer.function = tcp_compressed_ack_kick;
718} 743}