Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+4 −13
Original line number Diff line number Diff line
@@ -993,21 +993,12 @@ enum hrtimer_restart tcp_pace_kick(struct hrtimer *timer)
	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))
		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,
		      ktime_add_ns(ktime_get_tai_ns(), len_ns),
		      ns_to_ktime(tcp_sk(sk)->tcp_wstamp_ns),
		      HRTIMER_MODE_ABS_PINNED_SOFT);
	sock_hold(sk);
}
@@ -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) {
			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);
@@ -1167,7 +1159,6 @@ static int __tcp_transmit_skb(struct sock *sk, struct sk_buff *skb,
		tcp_event_data_sent(tp, sk);
		tp->data_segs_out += tcp_skb_pcount(skb);
		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)