When sendmsg() needs to wait for memory, the pending data
is not updated. That causes a drift in forward memory allocation,
leading to stall and/or warnings at socket close time.

This change addresses the above issue moving the pending data
counter update inside the sendmsg() main loop.

Fixes: 6e628cd3a8f7 ("mptcp: use mptcp release_cb for delayed tasks")
Reviewed-by: Mat Martineau <mathew.j.martin...@linux.intel.com>
Signed-off-by: Paolo Abeni <pab...@redhat.com>
---
 net/mptcp/protocol.c | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)

diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c
index b53a91801a6c..09b19aa2f205 100644
--- a/net/mptcp/protocol.c
+++ b/net/mptcp/protocol.c
@@ -1658,6 +1658,7 @@ static int mptcp_sendmsg(struct sock *sk, struct msghdr 
*msg, size_t len)
                frag_truesize += psize;
                pfrag->offset += frag_truesize;
                WRITE_ONCE(msk->write_seq, msk->write_seq + psize);
+               msk->tx_pending_data += psize;
 
                /* charge data on mptcp pending queue to the msk socket
                 * Note: we charge such data both to sk and ssk
@@ -1683,10 +1684,8 @@ static int mptcp_sendmsg(struct sock *sk, struct msghdr 
*msg, size_t len)
                        goto out;
        }
 
-       if (copied) {
-               msk->tx_pending_data += copied;
+       if (copied)
                mptcp_push_pending(sk, msg->msg_flags);
-       }
 
 out:
        release_sock(sk);
-- 
2.26.2

Reply via email to