tcp: fill shinfo->gso_type at last moment
Our goal is to touch skb_shinfo(skb) only when absolutely needed, to avoid two cache line misses in TCP output path for last skb that is considered but not sent because of various conditions (cwnd, tso defer, receiver window, TSQ...) A packet is GSO only when skb_shinfo(skb)->gso_size is not zero. We can set skb_shinfo(skb)->gso_type to sk->sk_gso_type even for non GSO packets. Signed-off-by: Eric Dumazet <edumazet@google.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
committed by
David S. Miller
parent
a7eea416cb
commit
51466a7545
@@ -412,7 +412,6 @@ static void tcp_init_nondata_skb(struct sk_buff *skb, u32 seq, u8 flags)
|
||||
|
||||
tcp_skb_pcount_set(skb, 1);
|
||||
shinfo->gso_size = 0;
|
||||
shinfo->gso_type = 0;
|
||||
|
||||
TCP_SKB_CB(skb)->seq = seq;
|
||||
if (flags & (TCPHDR_SYN | TCPHDR_FIN))
|
||||
@@ -1003,6 +1002,7 @@ static int tcp_transmit_skb(struct sock *sk, struct sk_buff *skb, int clone_it,
|
||||
}
|
||||
|
||||
tcp_options_write((__be32 *)(th + 1), tp, &opts);
|
||||
skb_shinfo(skb)->gso_type = sk->sk_gso_type;
|
||||
if (likely((tcb->tcp_flags & TCPHDR_SYN) == 0))
|
||||
tcp_ecn_send(sk, skb, tcp_header_size);
|
||||
|
||||
@@ -1080,11 +1080,9 @@ static void tcp_set_skb_tso_segs(const struct sock *sk, struct sk_buff *skb,
|
||||
*/
|
||||
tcp_skb_pcount_set(skb, 1);
|
||||
shinfo->gso_size = 0;
|
||||
shinfo->gso_type = 0;
|
||||
} else {
|
||||
tcp_skb_pcount_set(skb, DIV_ROUND_UP(skb->len, mss_now));
|
||||
shinfo->gso_size = mss_now;
|
||||
shinfo->gso_type = sk->sk_gso_type;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user