tcp: remove SKBTX_ACK_TSTAMP since it is redundant
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>
This commit is contained in:
parent
863c1fd981
commit
0a2cf20c3f
|
@ -382,14 +382,10 @@ enum {
|
||||||
|
|
||||||
/* generate software time stamp when entering packet scheduling */
|
/* generate software time stamp when entering packet scheduling */
|
||||||
SKBTX_SCHED_TSTAMP = 1 << 6,
|
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 | \
|
#define SKBTX_ANY_SW_TSTAMP (SKBTX_SW_TSTAMP | \
|
||||||
SKBTX_SCHED_TSTAMP | \
|
SKBTX_SCHED_TSTAMP)
|
||||||
SKBTX_ACK_TSTAMP)
|
|
||||||
#define SKBTX_ANY_TSTAMP (SKBTX_HW_TSTAMP | SKBTX_ANY_SW_TSTAMP)
|
#define SKBTX_ANY_TSTAMP (SKBTX_HW_TSTAMP | SKBTX_ANY_SW_TSTAMP)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -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);
|
struct tcp_skb_cb *tcb = TCP_SKB_CB(skb);
|
||||||
|
|
||||||
sock_tx_timestamp(sk, tsflags, &shinfo->tx_flags);
|
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;
|
shinfo->tskey = TCP_SKB_CB(skb)->seq + skb->len - 1;
|
||||||
tcb->txstamp_ack = !!(shinfo->tx_flags & SKBTX_ACK_TSTAMP);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -3087,8 +3087,7 @@ static void tcp_ack_tstamp(struct sock *sk, struct sk_buff *skb,
|
||||||
return;
|
return;
|
||||||
|
|
||||||
shinfo = skb_shinfo(skb);
|
shinfo = skb_shinfo(skb);
|
||||||
if ((shinfo->tx_flags & SKBTX_ACK_TSTAMP) &&
|
if (!before(shinfo->tskey, prior_snd_una) &&
|
||||||
!before(shinfo->tskey, prior_snd_una) &&
|
|
||||||
before(shinfo->tskey, tcp_sk(sk)->snd_una))
|
before(shinfo->tskey, tcp_sk(sk)->snd_una))
|
||||||
__skb_tstamp_tx(skb, NULL, sk, SCM_TSTAMP_ACK);
|
__skb_tstamp_tx(skb, NULL, sk, SCM_TSTAMP_ACK);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1111,11 +1111,17 @@ static void tcp_adjust_pcount(struct sock *sk, const struct sk_buff *skb, int de
|
||||||
tcp_verify_left_out(tp);
|
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)
|
static void tcp_fragment_tstamp(struct sk_buff *skb, struct sk_buff *skb2)
|
||||||
{
|
{
|
||||||
struct skb_shared_info *shinfo = skb_shinfo(skb);
|
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)) {
|
!before(shinfo->tskey, TCP_SKB_CB(skb2)->seq)) {
|
||||||
struct skb_shared_info *shinfo2 = skb_shinfo(skb2);
|
struct skb_shared_info *shinfo2 = skb_shinfo(skb2);
|
||||||
u8 tsflags = shinfo->tx_flags & SKBTX_ANY_TSTAMP;
|
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,
|
void tcp_skb_collapse_tstamp(struct sk_buff *skb,
|
||||||
const struct sk_buff *next_skb)
|
const struct sk_buff *next_skb)
|
||||||
{
|
{
|
||||||
const struct skb_shared_info *next_shinfo = skb_shinfo(next_skb);
|
if (unlikely(tcp_has_tx_tstamp(next_skb))) {
|
||||||
u8 tsflags = next_shinfo->tx_flags & SKBTX_ANY_TSTAMP;
|
const struct skb_shared_info *next_shinfo =
|
||||||
|
skb_shinfo(next_skb);
|
||||||
if (unlikely(tsflags)) {
|
|
||||||
struct skb_shared_info *shinfo = skb_shinfo(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;
|
shinfo->tskey = next_shinfo->tskey;
|
||||||
TCP_SKB_CB(skb)->txstamp_ack |=
|
TCP_SKB_CB(skb)->txstamp_ack |=
|
||||||
TCP_SKB_CB(next_skb)->txstamp_ack;
|
TCP_SKB_CB(next_skb)->txstamp_ack;
|
||||||
|
|
|
@ -600,9 +600,6 @@ void __sock_tx_timestamp(__u16 tsflags, __u8 *tx_flags)
|
||||||
if (tsflags & SOF_TIMESTAMPING_TX_SCHED)
|
if (tsflags & SOF_TIMESTAMPING_TX_SCHED)
|
||||||
flags |= SKBTX_SCHED_TSTAMP;
|
flags |= SKBTX_SCHED_TSTAMP;
|
||||||
|
|
||||||
if (tsflags & SOF_TIMESTAMPING_TX_ACK)
|
|
||||||
flags |= SKBTX_ACK_TSTAMP;
|
|
||||||
|
|
||||||
*tx_flags = flags;
|
*tx_flags = flags;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(__sock_tx_timestamp);
|
EXPORT_SYMBOL(__sock_tx_timestamp);
|
||||||
|
|
Loading…
Reference in New Issue