diff options
Diffstat (limited to 'net/ipv4/tcp_output.c')
-rw-r--r-- | net/ipv4/tcp_output.c | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c index 722c8bceaf9a..4fcc9a768849 100644 --- a/net/ipv4/tcp_output.c +++ b/net/ipv4/tcp_output.c | |||
@@ -948,7 +948,7 @@ static int tcp_transmit_skb(struct sock *sk, struct sk_buff *skb, int clone_it, | |||
948 | 948 | ||
949 | skb_orphan(skb); | 949 | skb_orphan(skb); |
950 | skb->sk = sk; | 950 | skb->sk = sk; |
951 | skb->destructor = tcp_wfree; | 951 | skb->destructor = skb_is_tcp_pure_ack(skb) ? sock_wfree : tcp_wfree; |
952 | skb_set_hash_from_sk(skb, sk); | 952 | skb_set_hash_from_sk(skb, sk); |
953 | atomic_add(skb->truesize, &sk->sk_wmem_alloc); | 953 | atomic_add(skb->truesize, &sk->sk_wmem_alloc); |
954 | 954 | ||
@@ -3270,6 +3270,14 @@ void tcp_send_ack(struct sock *sk) | |||
3270 | skb_reserve(buff, MAX_TCP_HEADER); | 3270 | skb_reserve(buff, MAX_TCP_HEADER); |
3271 | tcp_init_nondata_skb(buff, tcp_acceptable_seq(sk), TCPHDR_ACK); | 3271 | tcp_init_nondata_skb(buff, tcp_acceptable_seq(sk), TCPHDR_ACK); |
3272 | 3272 | ||
3273 | /* We do not want pure acks influencing TCP Small Queues or fq/pacing | ||
3274 | * too much. | ||
3275 | * SKB_TRUESIZE(max(1 .. 66, MAX_TCP_HEADER)) is unfortunately ~784 | ||
3276 | * We also avoid tcp_wfree() overhead (cache line miss accessing | ||
3277 | * tp->tsq_flags) by using regular sock_wfree() | ||
3278 | */ | ||
3279 | skb_set_tcp_pure_ack(buff); | ||
3280 | |||
3273 | /* Send it off, this clears delayed acks for us. */ | 3281 | /* Send it off, this clears delayed acks for us. */ |
3274 | skb_mstamp_get(&buff->skb_mstamp); | 3282 | skb_mstamp_get(&buff->skb_mstamp); |
3275 | tcp_transmit_skb(sk, buff, 0, sk_gfp_atomic(sk, GFP_ATOMIC)); | 3283 | tcp_transmit_skb(sk, buff, 0, sk_gfp_atomic(sk, GFP_ATOMIC)); |