tcp: Honor the eor bit in tcp_mtu_probe
[ Upstream commit808cf9e38c
] Avoid SKB coalescing if eor bit is set in one of the relevant SKBs. Fixes:c134ecb878
("tcp: Make use of MSG_EOR in tcp_sendmsg") Signed-off-by: Ilya Lesokhin <ilyal@mellanox.com> Signed-off-by: David S. Miller <davem@davemloft.net> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
dcb5da20ee
commit
17634603d4
|
@ -1973,6 +1973,24 @@ static inline void tcp_mtu_check_reprobe(struct sock *sk)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool tcp_can_coalesce_send_queue_head(struct sock *sk, int len)
|
||||||
|
{
|
||||||
|
struct sk_buff *skb, *next;
|
||||||
|
|
||||||
|
skb = tcp_send_head(sk);
|
||||||
|
tcp_for_write_queue_from_safe(skb, next, sk) {
|
||||||
|
if (len <= skb->len)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if (unlikely(TCP_SKB_CB(skb)->eor))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
len -= skb->len;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
/* Create a new MTU probe if we are ready.
|
/* Create a new MTU probe if we are ready.
|
||||||
* MTU probe is regularly attempting to increase the path MTU by
|
* MTU probe is regularly attempting to increase the path MTU by
|
||||||
* deliberately sending larger packets. This discovers routing
|
* deliberately sending larger packets. This discovers routing
|
||||||
|
@ -2045,6 +2063,9 @@ static int tcp_mtu_probe(struct sock *sk)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!tcp_can_coalesce_send_queue_head(sk, probe_size))
|
||||||
|
return -1;
|
||||||
|
|
||||||
/* We're allowed to probe. Build it now. */
|
/* We're allowed to probe. Build it now. */
|
||||||
nskb = sk_stream_alloc_skb(sk, probe_size, GFP_ATOMIC, false);
|
nskb = sk_stream_alloc_skb(sk, probe_size, GFP_ATOMIC, false);
|
||||||
if (!nskb)
|
if (!nskb)
|
||||||
|
@ -2080,6 +2101,10 @@ static int tcp_mtu_probe(struct sock *sk)
|
||||||
/* We've eaten all the data from this skb.
|
/* We've eaten all the data from this skb.
|
||||||
* Throw it away. */
|
* Throw it away. */
|
||||||
TCP_SKB_CB(nskb)->tcp_flags |= TCP_SKB_CB(skb)->tcp_flags;
|
TCP_SKB_CB(nskb)->tcp_flags |= TCP_SKB_CB(skb)->tcp_flags;
|
||||||
|
/* If this is the last SKB we copy and eor is set
|
||||||
|
* we need to propagate it to the new skb.
|
||||||
|
*/
|
||||||
|
TCP_SKB_CB(nskb)->eor = TCP_SKB_CB(skb)->eor;
|
||||||
tcp_unlink_write_queue(skb, sk);
|
tcp_unlink_write_queue(skb, sk);
|
||||||
sk_wmem_free_skb(sk, skb);
|
sk_wmem_free_skb(sk, skb);
|
||||||
} else {
|
} else {
|
||||||
|
|
Loading…
Reference in a new issue