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.c10
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));