diff options
Diffstat (limited to 'net/ipv4/tcp_timer.c')
-rw-r--r-- | net/ipv4/tcp_timer.c | 25 |
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 | ||
711 | static 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 | |||
711 | void tcp_init_xmit_timers(struct sock *sk) | 732 | void 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 | } |