diff options
author | Eric Dumazet <edumazet@google.com> | 2014-10-30 13:32:34 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2014-10-30 19:58:30 -0400 |
commit | 39bb5e62867de82b269b07df900165029b928359 (patch) | |
tree | f0cbefb0eee4eda2697c4e2fd6e0ad3ee7331f43 /net/xfrm | |
parent | 14051f0452a2c26a3f4791e6ad6a435e8f1945ff (diff) |
net: skb_fclone_busy() needs to detect orphaned skb
Some drivers are unable to perform TX completions in a bound time.
They instead call skb_orphan()
Problem is skb_fclone_busy() has to detect this case, otherwise
we block TCP retransmits and can freeze unlucky tcp sessions on
mostly idle hosts.
Signed-off-by: Eric Dumazet <edumazet@google.com>
Fixes: 1f3279ae0c13 ("tcp: avoid retransmits of TCP packets hanging in host queues")
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/xfrm')
-rw-r--r-- | net/xfrm/xfrm_policy.c | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/net/xfrm/xfrm_policy.c b/net/xfrm/xfrm_policy.c index 4c4e457e7888..88bf289abdc9 100644 --- a/net/xfrm/xfrm_policy.c +++ b/net/xfrm/xfrm_policy.c | |||
@@ -1962,7 +1962,7 @@ static int xdst_queue_output(struct sock *sk, struct sk_buff *skb) | |||
1962 | struct xfrm_policy *pol = xdst->pols[0]; | 1962 | struct xfrm_policy *pol = xdst->pols[0]; |
1963 | struct xfrm_policy_queue *pq = &pol->polq; | 1963 | struct xfrm_policy_queue *pq = &pol->polq; |
1964 | 1964 | ||
1965 | if (unlikely(skb_fclone_busy(skb))) { | 1965 | if (unlikely(skb_fclone_busy(sk, skb))) { |
1966 | kfree_skb(skb); | 1966 | kfree_skb(skb); |
1967 | return 0; | 1967 | return 0; |
1968 | } | 1968 | } |