diff options
Diffstat (limited to 'net/ipv4/tcp_output.c')
| -rw-r--r-- | net/ipv4/tcp_output.c | 22 | 
1 files changed, 16 insertions, 6 deletions
diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c index 3be16727f058..f0eb4e337ec8 100644 --- a/net/ipv4/tcp_output.c +++ b/net/ipv4/tcp_output.c @@ -864,8 +864,8 @@ static int tcp_transmit_skb(struct sock *sk, struct sk_buff *skb, int clone_it,  		if (unlikely(skb->fclone == SKB_FCLONE_ORIG &&  			     fclone->fclone == SKB_FCLONE_CLONE)) -			NET_INC_STATS_BH(sock_net(sk), -					 LINUX_MIB_TCPSPURIOUS_RTX_HOSTQUEUES); +			NET_INC_STATS(sock_net(sk), +				      LINUX_MIB_TCPSPURIOUS_RTX_HOSTQUEUES);  		if (unlikely(skb_cloned(skb)))  			skb = pskb_copy(skb, gfp_mask); @@ -2337,6 +2337,7 @@ int __tcp_retransmit_skb(struct sock *sk, struct sk_buff *skb)  	struct tcp_sock *tp = tcp_sk(sk);  	struct inet_connection_sock *icsk = inet_csk(sk);  	unsigned int cur_mss; +	int err;  	/* Inconslusive MTU probe */  	if (icsk->icsk_mtup.probe_size) { @@ -2400,11 +2401,15 @@ int __tcp_retransmit_skb(struct sock *sk, struct sk_buff *skb)  		     skb_headroom(skb) >= 0xFFFF)) {  		struct sk_buff *nskb = __pskb_copy(skb, MAX_TCP_HEADER,  						   GFP_ATOMIC); -		return nskb ? tcp_transmit_skb(sk, nskb, 0, GFP_ATOMIC) : -			      -ENOBUFS; +		err = nskb ? tcp_transmit_skb(sk, nskb, 0, GFP_ATOMIC) : +			     -ENOBUFS;  	} else { -		return tcp_transmit_skb(sk, skb, 1, GFP_ATOMIC); +		err = tcp_transmit_skb(sk, skb, 1, GFP_ATOMIC);  	} + +	if (likely(!err)) +		TCP_SKB_CB(skb)->sacked |= TCPCB_EVER_RETRANS; +	return err;  }  int tcp_retransmit_skb(struct sock *sk, struct sk_buff *skb) @@ -2908,7 +2913,12 @@ static int tcp_send_syn_data(struct sock *sk, struct sk_buff *syn)  	space = __tcp_mtu_to_mss(sk, inet_csk(sk)->icsk_pmtu_cookie) -  		MAX_TCP_OPTION_SPACE; -	syn_data = skb_copy_expand(syn, skb_headroom(syn), space, +	space = min_t(size_t, space, fo->size); + +	/* limit to order-0 allocations */ +	space = min_t(size_t, space, SKB_MAX_HEAD(MAX_TCP_HEADER)); + +	syn_data = skb_copy_expand(syn, MAX_TCP_HEADER, space,  				   sk->sk_allocation);  	if (syn_data == NULL)  		goto fallback;  | 
