]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
mptcp: fix bad RCVPRUNED mib accounting
authorPaolo Abeni <pabeni@redhat.com>
Fri, 9 Aug 2024 09:08:14 +0000 (11:08 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 19 Aug 2024 03:45:48 +0000 (05:45 +0200)
commit 0a567c2a10033bf04ed618368d179bce6977984b upstream.

Since its introduction, the mentioned MIB accounted for the wrong
event: wake-up being skipped as not-needed on some edge condition
instead of incoming skb being dropped after landing in the (subflow)
receive queue.

Move the increment in the correct location.

Fixes: ce599c516386 ("mptcp: properly account bulk freed memory")
Cc: stable@vger.kernel.org
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
Reviewed-by: Mat Martineau <martineau@kernel.org>
Signed-off-by: Matthieu Baerts (NGI0) <matttbe@kernel.org>
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
[ Conflicts in protocol.c, because the commit 6511882cdd82 ("mptcp:
  allocate fwd memory separately on the rx and tx path") is not in this
  version. The fix can still be applied before the 'goto drop'. ]
Signed-off-by: Matthieu Baerts (NGI0) <matttbe@kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
net/mptcp/protocol.c

index b6b708dbfce9c4c13775e28b103a0762cb453967..9273316cdbde15ed26f9b96c77adb34b5a8e2976 100644 (file)
@@ -288,8 +288,10 @@ static bool __mptcp_move_skb(struct mptcp_sock *msk, struct sock *ssk,
        if (!sk_rmem_schedule(sk, skb, skb->truesize)) {
                int amount = sk_mem_pages(skb->truesize) << SK_MEM_QUANTUM_SHIFT;
 
-               if (ssk->sk_forward_alloc < amount)
+               if (ssk->sk_forward_alloc < amount) {
+                       MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_RCVPRUNED);
                        goto drop;
+               }
 
                ssk->sk_forward_alloc -= amount;
                sk->sk_forward_alloc += amount;
@@ -774,10 +776,8 @@ void mptcp_data_ready(struct sock *sk, struct sock *ssk)
                sk_rbuf = ssk_rbuf;
 
        /* over limit? can't append more skbs to msk, Also, no need to wake-up*/
-       if (__mptcp_rmem(sk) > sk_rbuf) {
-               MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_RCVPRUNED);
+       if (__mptcp_rmem(sk) > sk_rbuf)
                return;
-       }
 
        /* Wake-up the reader only for in-sequence data */
        mptcp_data_lock(sk);