Commit c092dd5f authored by Eric Dumazet's avatar Eric Dumazet Committed by David S. Miller

tcp: switch tcp_internal_pacing() to tcp_wstamp_ns

Now TCP keeps track of tcp_wstamp_ns, recording the earliest
departure time of next packet, we can remove duplicate code
from tcp_internal_pacing()

This removes one ktime_get_tai_ns() call, and a divide.
Signed-off-by: default avatarEric Dumazet <edumazet@google.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent ab408b6d
...@@ -993,21 +993,12 @@ enum hrtimer_restart tcp_pace_kick(struct hrtimer *timer) ...@@ -993,21 +993,12 @@ enum hrtimer_restart tcp_pace_kick(struct hrtimer *timer)
return HRTIMER_NORESTART; return HRTIMER_NORESTART;
} }
static void tcp_internal_pacing(struct sock *sk, const struct sk_buff *skb) static void tcp_internal_pacing(struct sock *sk)
{ {
u64 len_ns;
u32 rate;
if (!tcp_needs_internal_pacing(sk)) if (!tcp_needs_internal_pacing(sk))
return; return;
rate = sk->sk_pacing_rate;
if (!rate || rate == ~0U)
return;
len_ns = (u64)skb->len * NSEC_PER_SEC;
do_div(len_ns, rate);
hrtimer_start(&tcp_sk(sk)->pacing_timer, hrtimer_start(&tcp_sk(sk)->pacing_timer,
ktime_add_ns(ktime_get_tai_ns(), len_ns), ns_to_ktime(tcp_sk(sk)->tcp_wstamp_ns),
HRTIMER_MODE_ABS_PINNED_SOFT); HRTIMER_MODE_ABS_PINNED_SOFT);
sock_hold(sk); sock_hold(sk);
} }
...@@ -1026,7 +1017,8 @@ static void tcp_update_skb_after_send(struct sock *sk, struct sk_buff *skb) ...@@ -1026,7 +1017,8 @@ static void tcp_update_skb_after_send(struct sock *sk, struct sk_buff *skb)
*/ */
if (rate != ~0U && rate && tp->data_segs_out >= 10) { if (rate != ~0U && rate && tp->data_segs_out >= 10) {
tp->tcp_wstamp_ns += div_u64((u64)skb->len * NSEC_PER_SEC, rate); tp->tcp_wstamp_ns += div_u64((u64)skb->len * NSEC_PER_SEC, rate);
/* TODO: update internal pacing here */
tcp_internal_pacing(sk);
} }
} }
list_move_tail(&skb->tcp_tsorted_anchor, &tp->tsorted_sent_queue); list_move_tail(&skb->tcp_tsorted_anchor, &tp->tsorted_sent_queue);
...@@ -1167,7 +1159,6 @@ static int __tcp_transmit_skb(struct sock *sk, struct sk_buff *skb, ...@@ -1167,7 +1159,6 @@ static int __tcp_transmit_skb(struct sock *sk, struct sk_buff *skb,
tcp_event_data_sent(tp, sk); tcp_event_data_sent(tp, sk);
tp->data_segs_out += tcp_skb_pcount(skb); tp->data_segs_out += tcp_skb_pcount(skb);
tp->bytes_sent += skb->len - tcp_header_size; tp->bytes_sent += skb->len - tcp_header_size;
tcp_internal_pacing(sk, skb);
} }
if (after(tcb->end_seq, tp->snd_nxt) || tcb->seq == tcb->end_seq) if (after(tcb->end_seq, tp->snd_nxt) || tcb->seq == tcb->end_seq)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment