diff options
Diffstat (limited to 'net/ipv4/tcp_output.c')
-rw-r--r-- | net/ipv4/tcp_output.c | 37 |
1 files changed, 20 insertions, 17 deletions
diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c index cb7ca569052c..412a920fe0ec 100644 --- a/net/ipv4/tcp_output.c +++ b/net/ipv4/tcp_output.c | |||
@@ -2296,7 +2296,7 @@ void __tcp_push_pending_frames(struct sock *sk, unsigned int cur_mss, | |||
2296 | return; | 2296 | return; |
2297 | 2297 | ||
2298 | if (tcp_write_xmit(sk, cur_mss, nonagle, 0, | 2298 | if (tcp_write_xmit(sk, cur_mss, nonagle, 0, |
2299 | sk_gfp_atomic(sk, GFP_ATOMIC))) | 2299 | sk_gfp_mask(sk, GFP_ATOMIC))) |
2300 | tcp_check_probe_timer(sk); | 2300 | tcp_check_probe_timer(sk); |
2301 | } | 2301 | } |
2302 | 2302 | ||
@@ -3150,7 +3150,7 @@ static int tcp_send_syn_data(struct sock *sk, struct sk_buff *syn) | |||
3150 | { | 3150 | { |
3151 | struct tcp_sock *tp = tcp_sk(sk); | 3151 | struct tcp_sock *tp = tcp_sk(sk); |
3152 | struct tcp_fastopen_request *fo = tp->fastopen_req; | 3152 | struct tcp_fastopen_request *fo = tp->fastopen_req; |
3153 | int syn_loss = 0, space, err = 0, copied; | 3153 | int syn_loss = 0, space, err = 0; |
3154 | unsigned long last_syn_loss = 0; | 3154 | unsigned long last_syn_loss = 0; |
3155 | struct sk_buff *syn_data; | 3155 | struct sk_buff *syn_data; |
3156 | 3156 | ||
@@ -3188,17 +3188,18 @@ static int tcp_send_syn_data(struct sock *sk, struct sk_buff *syn) | |||
3188 | goto fallback; | 3188 | goto fallback; |
3189 | syn_data->ip_summed = CHECKSUM_PARTIAL; | 3189 | syn_data->ip_summed = CHECKSUM_PARTIAL; |
3190 | memcpy(syn_data->cb, syn->cb, sizeof(syn->cb)); | 3190 | memcpy(syn_data->cb, syn->cb, sizeof(syn->cb)); |
3191 | copied = copy_from_iter(skb_put(syn_data, space), space, | 3191 | if (space) { |
3192 | &fo->data->msg_iter); | 3192 | int copied = copy_from_iter(skb_put(syn_data, space), space, |
3193 | if (unlikely(!copied)) { | 3193 | &fo->data->msg_iter); |
3194 | kfree_skb(syn_data); | 3194 | if (unlikely(!copied)) { |
3195 | goto fallback; | 3195 | kfree_skb(syn_data); |
3196 | } | 3196 | goto fallback; |
3197 | if (copied != space) { | 3197 | } |
3198 | skb_trim(syn_data, copied); | 3198 | if (copied != space) { |
3199 | space = copied; | 3199 | skb_trim(syn_data, copied); |
3200 | space = copied; | ||
3201 | } | ||
3200 | } | 3202 | } |
3201 | |||
3202 | /* No more data pending in inet_wait_for_connect() */ | 3203 | /* No more data pending in inet_wait_for_connect() */ |
3203 | if (space == fo->size) | 3204 | if (space == fo->size) |
3204 | fo->data = NULL; | 3205 | fo->data = NULL; |
@@ -3352,8 +3353,9 @@ void tcp_send_ack(struct sock *sk) | |||
3352 | * tcp_transmit_skb() will set the ownership to this | 3353 | * tcp_transmit_skb() will set the ownership to this |
3353 | * sock. | 3354 | * sock. |
3354 | */ | 3355 | */ |
3355 | buff = alloc_skb(MAX_TCP_HEADER, sk_gfp_atomic(sk, GFP_ATOMIC)); | 3356 | buff = alloc_skb(MAX_TCP_HEADER, |
3356 | if (!buff) { | 3357 | sk_gfp_mask(sk, GFP_ATOMIC | __GFP_NOWARN)); |
3358 | if (unlikely(!buff)) { | ||
3357 | inet_csk_schedule_ack(sk); | 3359 | inet_csk_schedule_ack(sk); |
3358 | inet_csk(sk)->icsk_ack.ato = TCP_ATO_MIN; | 3360 | inet_csk(sk)->icsk_ack.ato = TCP_ATO_MIN; |
3359 | inet_csk_reset_xmit_timer(sk, ICSK_TIME_DACK, | 3361 | inet_csk_reset_xmit_timer(sk, ICSK_TIME_DACK, |
@@ -3375,7 +3377,7 @@ void tcp_send_ack(struct sock *sk) | |||
3375 | 3377 | ||
3376 | /* Send it off, this clears delayed acks for us. */ | 3378 | /* Send it off, this clears delayed acks for us. */ |
3377 | skb_mstamp_get(&buff->skb_mstamp); | 3379 | skb_mstamp_get(&buff->skb_mstamp); |
3378 | tcp_transmit_skb(sk, buff, 0, sk_gfp_atomic(sk, GFP_ATOMIC)); | 3380 | tcp_transmit_skb(sk, buff, 0, (__force gfp_t)0); |
3379 | } | 3381 | } |
3380 | EXPORT_SYMBOL_GPL(tcp_send_ack); | 3382 | EXPORT_SYMBOL_GPL(tcp_send_ack); |
3381 | 3383 | ||
@@ -3396,7 +3398,8 @@ static int tcp_xmit_probe_skb(struct sock *sk, int urgent, int mib) | |||
3396 | struct sk_buff *skb; | 3398 | struct sk_buff *skb; |
3397 | 3399 | ||
3398 | /* We don't queue it, tcp_transmit_skb() sets ownership. */ | 3400 | /* We don't queue it, tcp_transmit_skb() sets ownership. */ |
3399 | skb = alloc_skb(MAX_TCP_HEADER, sk_gfp_atomic(sk, GFP_ATOMIC)); | 3401 | skb = alloc_skb(MAX_TCP_HEADER, |
3402 | sk_gfp_mask(sk, GFP_ATOMIC | __GFP_NOWARN)); | ||
3400 | if (!skb) | 3403 | if (!skb) |
3401 | return -1; | 3404 | return -1; |
3402 | 3405 | ||
@@ -3409,7 +3412,7 @@ static int tcp_xmit_probe_skb(struct sock *sk, int urgent, int mib) | |||
3409 | tcp_init_nondata_skb(skb, tp->snd_una - !urgent, TCPHDR_ACK); | 3412 | tcp_init_nondata_skb(skb, tp->snd_una - !urgent, TCPHDR_ACK); |
3410 | skb_mstamp_get(&skb->skb_mstamp); | 3413 | skb_mstamp_get(&skb->skb_mstamp); |
3411 | NET_INC_STATS(sock_net(sk), mib); | 3414 | NET_INC_STATS(sock_net(sk), mib); |
3412 | return tcp_transmit_skb(sk, skb, 0, GFP_ATOMIC); | 3415 | return tcp_transmit_skb(sk, skb, 0, (__force gfp_t)0); |
3413 | } | 3416 | } |
3414 | 3417 | ||
3415 | void tcp_send_window_probe(struct sock *sk) | 3418 | void tcp_send_window_probe(struct sock *sk) |