aboutsummaryrefslogtreecommitdiffstats
path: root/net/ipv4/tcp_ipv4.c
diff options
context:
space:
mode:
authorEric Dumazet <edumazet@google.com>2016-05-13 12:16:40 -0400
committerDavid S. Miller <davem@davemloft.net>2016-05-16 13:46:23 -0400
commitea1627c20c3462168a087ccecc69084b55b9c0b2 (patch)
treee0b21e3af57979d1f5b1faf718582aaa4a6566b0 /net/ipv4/tcp_ipv4.c
parent5022524308c64f2954ac206a8781b64a98cddf00 (diff)
tcp: minor optimizations around tcp_hdr() usage
tcp_hdr() is slightly more expensive than using skb->data in contexts where we know they point to the same byte. In receive path, tcp_v4_rcv() and tcp_v6_rcv() are in this situation, as tcp header has not been pulled yet. In output path, the same can be said when we just pushed the tcp header in the skb, in tcp_transmit_skb() and tcp_make_synack() Also factorize the two checks for tcb->tcp_flags & TCPHDR_SYN in tcp_transmit_skb() and pass tcp header pointer to tcp_ecn_send(), so that compiler can further optimize and avoid a reload. Signed-off-by: Eric Dumazet <edumazet@google.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv4/tcp_ipv4.c')
-rw-r--r--net/ipv4/tcp_ipv4.c6
1 files changed, 3 insertions, 3 deletions
diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c
index 8219d0d8dc83..3708de2a6683 100644
--- a/net/ipv4/tcp_ipv4.c
+++ b/net/ipv4/tcp_ipv4.c
@@ -1556,9 +1556,9 @@ int tcp_v4_rcv(struct sk_buff *skb)
1556 if (!pskb_may_pull(skb, sizeof(struct tcphdr))) 1556 if (!pskb_may_pull(skb, sizeof(struct tcphdr)))
1557 goto discard_it; 1557 goto discard_it;
1558 1558
1559 th = tcp_hdr(skb); 1559 th = (const struct tcphdr *)skb->data;
1560 1560
1561 if (th->doff < sizeof(struct tcphdr) / 4) 1561 if (unlikely(th->doff < sizeof(struct tcphdr) / 4))
1562 goto bad_packet; 1562 goto bad_packet;
1563 if (!pskb_may_pull(skb, th->doff * 4)) 1563 if (!pskb_may_pull(skb, th->doff * 4))
1564 goto discard_it; 1564 goto discard_it;
@@ -1571,7 +1571,7 @@ int tcp_v4_rcv(struct sk_buff *skb)
1571 if (skb_checksum_init(skb, IPPROTO_TCP, inet_compute_pseudo)) 1571 if (skb_checksum_init(skb, IPPROTO_TCP, inet_compute_pseudo))
1572 goto csum_error; 1572 goto csum_error;
1573 1573
1574 th = tcp_hdr(skb); 1574 th = (const struct tcphdr *)skb->data;
1575 iph = ip_hdr(skb); 1575 iph = ip_hdr(skb);
1576 /* This is tricky : We move IPCB at its correct location into TCP_SKB_CB() 1576 /* This is tricky : We move IPCB at its correct location into TCP_SKB_CB()
1577 * barrier() makes sure compiler wont play fool^Waliasing games. 1577 * barrier() makes sure compiler wont play fool^Waliasing games.