lkml.org 
[lkml]   [2022]   [Jan]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.16 0418/1039] mptcp: fix per socket endpoint accounting
    Date
    From: Paolo Abeni <pabeni@redhat.com>

    [ Upstream commit f7d6a237d7422809d458d754016de2844017cb4d ]

    Since full-mesh endpoint support, the reception of a single ADD_ADDR
    option can cause multiple subflows creation. When such option is
    accepted we increment 'add_addr_accepted' by one. When we received
    a paired RM_ADDR option, we deleted all the relevant subflows,
    decrementing 'add_addr_accepted' by one for each of them.

    We have a similar issue for 'local_addr_used'

    Fix them moving the pm endpoint accounting outside the subflow
    traversal.

    Fixes: 1a0d6136c5f0 ("mptcp: local addresses fullmesh")
    Signed-off-by: Paolo Abeni <pabeni@redhat.com>
    Signed-off-by: Mat Martineau <mathew.j.martineau@linux.intel.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    net/mptcp/pm_netlink.c | 18 ++++++++++++------
    1 file changed, 12 insertions(+), 6 deletions(-)

    diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c
    index f523051f5aef3..65764c8171b37 100644
    --- a/net/mptcp/pm_netlink.c
    +++ b/net/mptcp/pm_netlink.c
    @@ -710,6 +710,8 @@ static void mptcp_pm_nl_rm_addr_or_subflow(struct mptcp_sock *msk,
    return;

    for (i = 0; i < rm_list->nr; i++) {
    + bool removed = false;
    +
    list_for_each_entry_safe(subflow, tmp, &msk->conn_list, node) {
    struct sock *ssk = mptcp_subflow_tcp_sock(subflow);
    int how = RCV_SHUTDOWN | SEND_SHUTDOWN;
    @@ -729,15 +731,19 @@ static void mptcp_pm_nl_rm_addr_or_subflow(struct mptcp_sock *msk,
    mptcp_close_ssk(sk, ssk, subflow);
    spin_lock_bh(&msk->pm.lock);

    - if (rm_type == MPTCP_MIB_RMADDR) {
    - msk->pm.add_addr_accepted--;
    - WRITE_ONCE(msk->pm.accept_addr, true);
    - } else if (rm_type == MPTCP_MIB_RMSUBFLOW) {
    - msk->pm.local_addr_used--;
    - }
    + removed = true;
    msk->pm.subflows--;
    __MPTCP_INC_STATS(sock_net(sk), rm_type);
    }
    + if (!removed)
    + continue;
    +
    + if (rm_type == MPTCP_MIB_RMADDR) {
    + msk->pm.add_addr_accepted--;
    + WRITE_ONCE(msk->pm.accept_addr, true);
    + } else if (rm_type == MPTCP_MIB_RMSUBFLOW) {
    + msk->pm.local_addr_used--;
    + }
    }
    }

    --
    2.34.1


    \
     
     \ /
      Last update: 2022-09-17 16:12    [W:2.439 / U:1.936 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site