]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
tcp: fix mem under-charging with zerocopy sendmsg()
authorEric Dumazet <edumazet@google.com>
Tue, 1 Feb 2022 06:52:54 +0000 (22:52 -0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 5 Feb 2022 11:39:58 +0000 (12:39 +0100)
commit 479f5547239d970d3833f15f54a6481fffdb91ec upstream.

We got reports of following warning in inet_sock_destruct()

WARN_ON(sk_forward_alloc_get(sk));

Whenever we add a non zero-copy fragment to a pure zerocopy skb,
we have to anticipate that whole skb->truesize will be uncharged
when skb is finally freed.

skb->data_len is the payload length. But the memory truesize
estimated by __zerocopy_sg_from_iter() is page aligned.

Fixes: 9b65b17db723 ("net: avoid double accounting for pure zerocopy skbs")
Signed-off-by: Eric Dumazet <edumazet@google.com>
Cc: Talal Ahmad <talalahmad@google.com>
Cc: Arjun Roy <arjunroy@google.com>
Cc: Willem de Bruijn <willemb@google.com>
Acked-by: Soheil Hassas Yeganeh <soheil@google.com>
Link: https://lore.kernel.org/r/20220201065254.680532-1-eric.dumazet@gmail.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
net/ipv4/tcp.c

index 2bb28bfd83bf621b5d9f3fb7ce5695195697b43a..94cbba9fb12b1766b2dcda877579de14552e49c9 100644 (file)
@@ -1321,10 +1321,13 @@ new_segment:
 
                        /* skb changing from pure zc to mixed, must charge zc */
                        if (unlikely(skb_zcopy_pure(skb))) {
-                               if (!sk_wmem_schedule(sk, skb->data_len))
+                               u32 extra = skb->truesize -
+                                           SKB_TRUESIZE(skb_end_offset(skb));
+
+                               if (!sk_wmem_schedule(sk, extra))
                                        goto wait_for_space;
 
-                               sk_mem_charge(sk, skb->data_len);
+                               sk_mem_charge(sk, extra);
                                skb_shinfo(skb)->flags &= ~SKBFL_PURE_ZEROCOPY;
                        }