aboutsummaryrefslogtreecommitdiffstats
path: root/net/ipv4/tcp_output.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/ipv4/tcp_output.c')
-rw-r--r--net/ipv4/tcp_output.c48
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
2401int tcp_retransmit_skb(struct sock *sk, struct sk_buff *skb) 2426int 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;