tcp: remove SKBTX_ACK_TSTAMP since it is redundant
authorSoheil Hassas Yeganeh <soheil@google.com>
Thu, 28 Apr 2016 03:39:01 +0000 (23:39 -0400)
committerDavid S. Miller <davem@davemloft.net>
Thu, 28 Apr 2016 20:06:10 +0000 (16:06 -0400)
The SKBTX_ACK_TSTAMP flag is set in skb_shinfo->tx_flags when
the timestamp of the TCP acknowledgement should be reported on
error queue. Since accessing skb_shinfo is likely to incur a
cache-line miss at the time of receiving the ack, the
txstamp_ack bit was added in tcp_skb_cb, which is set iff
the SKBTX_ACK_TSTAMP flag is set for an skb. This makes
SKBTX_ACK_TSTAMP flag redundant.

Remove the SKBTX_ACK_TSTAMP and instead use the txstamp_ack bit
everywhere.

Note that this frees one bit in shinfo->tx_flags.

Signed-off-by: Soheil Hassas Yeganeh <soheil@google.com>
Acked-by: Martin KaFai Lau <kafai@fb.com>
Suggested-by: Willem de Bruijn <willemb@google.com>
Acked-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/linux/skbuff.h
net/ipv4/tcp.c
net/ipv4/tcp_input.c
net/ipv4/tcp_output.c
net/socket.c

index a1ce63979ad8873fb8309196acbd2590e9d7cecf..c84a5a1078c5528bf6fc84573f63f3c6f470ce8f 100644 (file)
@@ -382,14 +382,10 @@ enum {
 
        /* generate software time stamp when entering packet scheduling */
        SKBTX_SCHED_TSTAMP = 1 << 6,
-
-       /* generate software timestamp on peer data acknowledgment */
-       SKBTX_ACK_TSTAMP = 1 << 7,
 };
 
 #define SKBTX_ANY_SW_TSTAMP    (SKBTX_SW_TSTAMP    | \
-                                SKBTX_SCHED_TSTAMP | \
-                                SKBTX_ACK_TSTAMP)
+                                SKBTX_SCHED_TSTAMP)
 #define SKBTX_ANY_TSTAMP       (SKBTX_HW_TSTAMP | SKBTX_ANY_SW_TSTAMP)
 
 /*
index 53890a730ff43a84fbd5866fdf2ab390a2dbeb5c..91993782a94797f820f81160dd3b799c78ac398f 100644 (file)
@@ -435,9 +435,10 @@ static void tcp_tx_timestamp(struct sock *sk, u16 tsflags, struct sk_buff *skb)
                struct tcp_skb_cb *tcb = TCP_SKB_CB(skb);
 
                sock_tx_timestamp(sk, tsflags, &shinfo->tx_flags);
-               if (shinfo->tx_flags & SKBTX_ANY_TSTAMP)
+               if (tsflags & SOF_TIMESTAMPING_TX_ACK)
+                       tcb->txstamp_ack = 1;
+               if (tsflags & SOF_TIMESTAMPING_TX_RECORD_MASK)
                        shinfo->tskey = TCP_SKB_CB(skb)->seq + skb->len - 1;
-               tcb->txstamp_ack = !!(shinfo->tx_flags & SKBTX_ACK_TSTAMP);
        }
 }
 
index 0d5239c283cb5eae97ef645ecd1640e1bad41839..70c370b937621b4e5144fe3fd47bb1bddc9fa6bd 100644 (file)
@@ -3087,8 +3087,7 @@ static void tcp_ack_tstamp(struct sock *sk, struct sk_buff *skb,
                return;
 
        shinfo = skb_shinfo(skb);
-       if ((shinfo->tx_flags & SKBTX_ACK_TSTAMP) &&
-           !before(shinfo->tskey, prior_snd_una) &&
+       if (!before(shinfo->tskey, prior_snd_una) &&
            before(shinfo->tskey, tcp_sk(sk)->snd_una))
                __skb_tstamp_tx(skb, NULL, sk, SCM_TSTAMP_ACK);
 }
index b1b2045ac3a96507015bd79a2164c93691769f21..b3a31b4df57c6c2e5f325c6c3e99440986070444 100644 (file)
@@ -1111,11 +1111,17 @@ static void tcp_adjust_pcount(struct sock *sk, const struct sk_buff *skb, int de
        tcp_verify_left_out(tp);
 }
 
+static bool tcp_has_tx_tstamp(const struct sk_buff *skb)
+{
+       return TCP_SKB_CB(skb)->txstamp_ack ||
+               (skb_shinfo(skb)->tx_flags & SKBTX_ANY_TSTAMP);
+}
+
 static void tcp_fragment_tstamp(struct sk_buff *skb, struct sk_buff *skb2)
 {
        struct skb_shared_info *shinfo = skb_shinfo(skb);
 
-       if (unlikely(shinfo->tx_flags & SKBTX_ANY_TSTAMP) &&
+       if (unlikely(tcp_has_tx_tstamp(skb)) &&
            !before(shinfo->tskey, TCP_SKB_CB(skb2)->seq)) {
                struct skb_shared_info *shinfo2 = skb_shinfo(skb2);
                u8 tsflags = shinfo->tx_flags & SKBTX_ANY_TSTAMP;
@@ -2446,13 +2452,12 @@ u32 __tcp_select_window(struct sock *sk)
 void tcp_skb_collapse_tstamp(struct sk_buff *skb,
                             const struct sk_buff *next_skb)
 {
-       const struct skb_shared_info *next_shinfo = skb_shinfo(next_skb);
-       u8 tsflags = next_shinfo->tx_flags & SKBTX_ANY_TSTAMP;
-
-       if (unlikely(tsflags)) {
+       if (unlikely(tcp_has_tx_tstamp(next_skb))) {
+               const struct skb_shared_info *next_shinfo =
+                       skb_shinfo(next_skb);
                struct skb_shared_info *shinfo = skb_shinfo(skb);
 
-               shinfo->tx_flags |= tsflags;
+               shinfo->tx_flags |= next_shinfo->tx_flags & SKBTX_ANY_TSTAMP;
                shinfo->tskey = next_shinfo->tskey;
                TCP_SKB_CB(skb)->txstamp_ack |=
                        TCP_SKB_CB(next_skb)->txstamp_ack;
index 5dbb0bbe12a7d78c528307cd4c7d66556d01d41f..7789d79609dd1a5a80b22135c6983725d40f59a3 100644 (file)
@@ -600,9 +600,6 @@ void __sock_tx_timestamp(__u16 tsflags, __u8 *tx_flags)
        if (tsflags & SOF_TIMESTAMPING_TX_SCHED)
                flags |= SKBTX_SCHED_TSTAMP;
 
-       if (tsflags & SOF_TIMESTAMPING_TX_ACK)
-               flags |= SKBTX_ACK_TSTAMP;
-
        *tx_flags = flags;
 }
 EXPORT_SYMBOL(__sock_tx_timestamp);