Commit 2a9e8438 authored by David S. Miller's avatar David S. Miller

Merge branch 'tcp-redundant-checks'

Soheil Hassas Yeganeh says:

====================
tcp: simplify ack tx timestamps

v2:
- Fully remove SKBTX_ACK_TSTAMP, as suggested by Willem de Bruijn.

This patch series aims at removing redundant checks and fields
for ack timestamps for TCP.
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents ba7863f4 0a2cf20c
...@@ -382,14 +382,10 @@ enum { ...@@ -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)
/* /*
......
...@@ -430,14 +430,15 @@ EXPORT_SYMBOL(tcp_init_sock); ...@@ -430,14 +430,15 @@ EXPORT_SYMBOL(tcp_init_sock);
static void tcp_tx_timestamp(struct sock *sk, u16 tsflags, struct sk_buff *skb) static void tcp_tx_timestamp(struct sock *sk, u16 tsflags, struct sk_buff *skb)
{ {
if (sk->sk_tsflags || tsflags) { if (tsflags) {
struct skb_shared_info *shinfo = skb_shinfo(skb); struct skb_shared_info *shinfo = skb_shinfo(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, ...@@ -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 ...@@ -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) ...@@ -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) ...@@ -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);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment