On Mon, 22 Jul 2024, Matthieu Baerts (NGI0) wrote:
> If no subflows are attached to the 'subflow' endpoints that are being
> flushed, the corresponding addr IDs will not be marked as available
> again.
>
> Mark all ID as being available when flushing all the 'subflow'
> endpoints, and reset local_addr_used counter to cover these cases.
>
> While at it, renamed the helpers linked to the flushing operations to
> make it clear that the intention is to flush all created subflows, and
> remove all announced addresses, not just a "random" selection.
Hi Matthieu -
Considering that this series is getting quite large for -net, a separate
net-next patch looks preferable to me.
- Mat
>
> Fixes: 06faa2271034 ("mptcp: remove multi addresses and subflows in PM")
> Signed-off-by: Matthieu Baerts (NGI0) <matttbe@kernel.org>
> ---
> net/mptcp/pm_netlink.c | 19 +++++++++++++------
> 1 file changed, 13 insertions(+), 6 deletions(-)
>
> diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c
> index bdbf27fe89e0..4045e5cc6298 100644
> --- a/net/mptcp/pm_netlink.c
> +++ b/net/mptcp/pm_netlink.c
> @@ -1586,8 +1586,8 @@ void mptcp_pm_remove_addrs(struct mptcp_sock *msk, struct list_head *rm_list)
> }
> }
>
> -static void mptcp_pm_remove_addrs_and_subflows(struct mptcp_sock *msk,
> - struct list_head *rm_list)
> +static void mptcp_pm_flush_addrs_and_subflows(struct mptcp_sock *msk,
> + struct list_head *rm_list)
> {
> struct mptcp_rm_list alist = { .nr = 0 }, slist = { .nr = 0 };
> struct mptcp_pm_addr_entry *entry;
> @@ -1608,12 +1608,19 @@ static void mptcp_pm_remove_addrs_and_subflows(struct mptcp_sock *msk,
> mptcp_pm_remove_addr(msk, &alist);
> spin_unlock_bh(&msk->pm.lock);
> }
> +
> if (slist.nr)
> mptcp_pm_remove_subflow(msk, &slist);
> +
> + /* Reset counters: maybe some subflows have been removed before */
> + spin_lock_bh(&msk->pm.lock);
> + bitmap_fill(msk->pm.id_avail_bitmap, MPTCP_PM_MAX_ADDR_ID + 1);
> + msk->pm.local_addr_used = 0;
> + spin_unlock_bh(&msk->pm.lock);
> }
>
> -static void mptcp_nl_remove_addrs_list(struct net *net,
> - struct list_head *rm_list)
> +static void mptcp_nl_flush_addrs_list(struct net *net,
> + struct list_head *rm_list)
> {
> long s_slot = 0, s_num = 0;
> struct mptcp_sock *msk;
> @@ -1626,7 +1633,7 @@ static void mptcp_nl_remove_addrs_list(struct net *net,
>
> if (!mptcp_pm_is_userspace(msk)) {
> lock_sock(sk);
> - mptcp_pm_remove_addrs_and_subflows(msk, rm_list);
> + mptcp_pm_flush_addrs_and_subflows(msk, rm_list);
> release_sock(sk);
> }
>
> @@ -1667,7 +1674,7 @@ int mptcp_pm_nl_flush_addrs_doit(struct sk_buff *skb, struct genl_info *info)
> pernet->next_id = 1;
> bitmap_zero(pernet->id_bitmap, MPTCP_PM_MAX_ADDR_ID + 1);
> spin_unlock_bh(&pernet->lock);
> - mptcp_nl_remove_addrs_list(sock_net(skb->sk), &free_list);
> + mptcp_nl_flush_addrs_list(sock_net(skb->sk), &free_list);
> synchronize_rcu();
> __flush_addrs(&free_list);
> return 0;
>
> --
> 2.45.2
>
>
>