diff options
Diffstat (limited to 'net/ipv4/tcp_output.c')
| -rw-r--r-- | net/ipv4/tcp_output.c | 48 |
1 files changed, 39 insertions, 9 deletions
diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c index 03d26b85eab8..17a11e65e57f 100644 --- a/net/ipv4/tcp_output.c +++ b/net/ipv4/tcp_output.c | |||
| @@ -698,7 +698,8 @@ static void tcp_tsq_handler(struct sock *sk) | |||
| 698 | if ((1 << sk->sk_state) & | 698 | if ((1 << sk->sk_state) & |
| 699 | (TCPF_ESTABLISHED | TCPF_FIN_WAIT1 | TCPF_CLOSING | | 699 | (TCPF_ESTABLISHED | TCPF_FIN_WAIT1 | TCPF_CLOSING | |
| 700 | TCPF_CLOSE_WAIT | TCPF_LAST_ACK)) | 700 | TCPF_CLOSE_WAIT | TCPF_LAST_ACK)) |
| 701 | tcp_write_xmit(sk, tcp_current_mss(sk), 0, 0, GFP_ATOMIC); | 701 | tcp_write_xmit(sk, tcp_current_mss(sk), tcp_sk(sk)->nonagle, |
| 702 | 0, GFP_ATOMIC); | ||
| 702 | } | 703 | } |
| 703 | /* | 704 | /* |
| 704 | * One tasklet per cpu tries to send more skbs. | 705 | * One tasklet per cpu tries to send more skbs. |
| @@ -766,6 +767,17 @@ void tcp_release_cb(struct sock *sk) | |||
| 766 | if (flags & (1UL << TCP_TSQ_DEFERRED)) | 767 | if (flags & (1UL << TCP_TSQ_DEFERRED)) |
| 767 | tcp_tsq_handler(sk); | 768 | tcp_tsq_handler(sk); |
| 768 | 769 | ||
| 770 | /* Here begins the tricky part : | ||
| 771 | * We are called from release_sock() with : | ||
| 772 | * 1) BH disabled | ||
| 773 | * 2) sk_lock.slock spinlock held | ||
| 774 | * 3) socket owned by us (sk->sk_lock.owned == 1) | ||
| 775 | * | ||
| 776 | * But following code is meant to be called from BH handlers, | ||
| 777 | * so we should keep BH disabled, but early release socket ownership | ||
| 778 | */ | ||
| 779 | sock_release_ownership(sk); | ||
| 780 | |||
| 769 | if (flags & (1UL << TCP_WRITE_TIMER_DEFERRED)) { | 781 | if (flags & (1UL << TCP_WRITE_TIMER_DEFERRED)) { |
| 770 | tcp_write_timer_handler(sk); | 782 | tcp_write_timer_handler(sk); |
| 771 | __sock_put(sk); | 783 | __sock_put(sk); |
| @@ -863,8 +875,8 @@ static int tcp_transmit_skb(struct sock *sk, struct sk_buff *skb, int clone_it, | |||
| 863 | 875 | ||
| 864 | if (unlikely(skb->fclone == SKB_FCLONE_ORIG && | 876 | if (unlikely(skb->fclone == SKB_FCLONE_ORIG && |
| 865 | fclone->fclone == SKB_FCLONE_CLONE)) | 877 | fclone->fclone == SKB_FCLONE_CLONE)) |
| 866 | NET_INC_STATS_BH(sock_net(sk), | 878 | NET_INC_STATS(sock_net(sk), |
| 867 | LINUX_MIB_TCPSPURIOUS_RTX_HOSTQUEUES); | 879 | LINUX_MIB_TCPSPURIOUS_RTX_HOSTQUEUES); |
| 868 | 880 | ||
| 869 | if (unlikely(skb_cloned(skb))) | 881 | if (unlikely(skb_cloned(skb))) |
| 870 | skb = pskb_copy(skb, gfp_mask); | 882 | skb = pskb_copy(skb, gfp_mask); |
| @@ -1904,7 +1916,15 @@ static bool tcp_write_xmit(struct sock *sk, unsigned int mss_now, int nonagle, | |||
| 1904 | 1916 | ||
| 1905 | if (atomic_read(&sk->sk_wmem_alloc) > limit) { | 1917 | if (atomic_read(&sk->sk_wmem_alloc) > limit) { |
| 1906 | set_bit(TSQ_THROTTLED, &tp->tsq_flags); | 1918 | set_bit(TSQ_THROTTLED, &tp->tsq_flags); |
| 1907 | break; | 1919 | /* It is possible TX completion already happened |
| 1920 | * before we set TSQ_THROTTLED, so we must | ||
| 1921 | * test again the condition. | ||
| 1922 | * We abuse smp_mb__after_clear_bit() because | ||
| 1923 | * there is no smp_mb__after_set_bit() yet | ||
| 1924 | */ | ||
| 1925 | smp_mb__after_clear_bit(); | ||
| 1926 | if (atomic_read(&sk->sk_wmem_alloc) > limit) | ||
| 1927 | break; | ||
| 1908 | } | 1928 | } |
| 1909 | 1929 | ||
| 1910 | limit = mss_now; | 1930 | limit = mss_now; |
| @@ -1977,7 +1997,7 @@ bool tcp_schedule_loss_probe(struct sock *sk) | |||
| 1977 | /* Schedule a loss probe in 2*RTT for SACK capable connections | 1997 | /* Schedule a loss probe in 2*RTT for SACK capable connections |
| 1978 | * in Open state, that are either limited by cwnd or application. | 1998 | * in Open state, that are either limited by cwnd or application. |
| 1979 | */ | 1999 | */ |
| 1980 | if (sysctl_tcp_early_retrans < 3 || !rtt || !tp->packets_out || | 2000 | if (sysctl_tcp_early_retrans < 3 || !tp->srtt || !tp->packets_out || |
| 1981 | !tcp_is_sack(tp) || inet_csk(sk)->icsk_ca_state != TCP_CA_Open) | 2001 | !tcp_is_sack(tp) || inet_csk(sk)->icsk_ca_state != TCP_CA_Open) |
| 1982 | return false; | 2002 | return false; |
| 1983 | 2003 | ||
| @@ -2328,6 +2348,7 @@ int __tcp_retransmit_skb(struct sock *sk, struct sk_buff *skb) | |||
| 2328 | struct tcp_sock *tp = tcp_sk(sk); | 2348 | struct tcp_sock *tp = tcp_sk(sk); |
| 2329 | struct inet_connection_sock *icsk = inet_csk(sk); | 2349 | struct inet_connection_sock *icsk = inet_csk(sk); |
| 2330 | unsigned int cur_mss; | 2350 | unsigned int cur_mss; |
| 2351 | int err; | ||
| 2331 | 2352 | ||
| 2332 | /* Inconslusive MTU probe */ | 2353 | /* Inconslusive MTU probe */ |
| 2333 | if (icsk->icsk_mtup.probe_size) { | 2354 | if (icsk->icsk_mtup.probe_size) { |
| @@ -2391,11 +2412,15 @@ int __tcp_retransmit_skb(struct sock *sk, struct sk_buff *skb) | |||
| 2391 | skb_headroom(skb) >= 0xFFFF)) { | 2412 | skb_headroom(skb) >= 0xFFFF)) { |
| 2392 | struct sk_buff *nskb = __pskb_copy(skb, MAX_TCP_HEADER, | 2413 | struct sk_buff *nskb = __pskb_copy(skb, MAX_TCP_HEADER, |
| 2393 | GFP_ATOMIC); | 2414 | GFP_ATOMIC); |
| 2394 | return nskb ? tcp_transmit_skb(sk, nskb, 0, GFP_ATOMIC) : | 2415 | err = nskb ? tcp_transmit_skb(sk, nskb, 0, GFP_ATOMIC) : |
| 2395 | -ENOBUFS; | 2416 | -ENOBUFS; |
| 2396 | } else { | 2417 | } else { |
| 2397 | return tcp_transmit_skb(sk, skb, 1, GFP_ATOMIC); | 2418 | err = tcp_transmit_skb(sk, skb, 1, GFP_ATOMIC); |
| 2398 | } | 2419 | } |
| 2420 | |||
| 2421 | if (likely(!err)) | ||
| 2422 | TCP_SKB_CB(skb)->sacked |= TCPCB_EVER_RETRANS; | ||
| 2423 | return err; | ||
| 2399 | } | 2424 | } |
| 2400 | 2425 | ||
| 2401 | int tcp_retransmit_skb(struct sock *sk, struct sk_buff *skb) | 2426 | int tcp_retransmit_skb(struct sock *sk, struct sk_buff *skb) |
| @@ -2899,7 +2924,12 @@ static int tcp_send_syn_data(struct sock *sk, struct sk_buff *syn) | |||
| 2899 | space = __tcp_mtu_to_mss(sk, inet_csk(sk)->icsk_pmtu_cookie) - | 2924 | space = __tcp_mtu_to_mss(sk, inet_csk(sk)->icsk_pmtu_cookie) - |
| 2900 | MAX_TCP_OPTION_SPACE; | 2925 | MAX_TCP_OPTION_SPACE; |
| 2901 | 2926 | ||
| 2902 | syn_data = skb_copy_expand(syn, skb_headroom(syn), space, | 2927 | space = min_t(size_t, space, fo->size); |
| 2928 | |||
| 2929 | /* limit to order-0 allocations */ | ||
| 2930 | space = min_t(size_t, space, SKB_MAX_HEAD(MAX_TCP_HEADER)); | ||
| 2931 | |||
| 2932 | syn_data = skb_copy_expand(syn, MAX_TCP_HEADER, space, | ||
| 2903 | sk->sk_allocation); | 2933 | sk->sk_allocation); |
| 2904 | if (syn_data == NULL) | 2934 | if (syn_data == NULL) |
| 2905 | goto fallback; | 2935 | goto fallback; |
