]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
mptcp: drop free_list for deleting entries
authorGeliang Tang <tanggeliang@kylinos.cn>
Fri, 13 Dec 2024 19:52:56 +0000 (20:52 +0100)
committerJakub Kicinski <kuba@kernel.org>
Sun, 15 Dec 2024 22:28:34 +0000 (14:28 -0800)
mptcp_pm_remove_addrs() actually only deletes one address, which does
not match its name. This patch renames it to mptcp_pm_remove_addr_entry()
and changes the parameter "rm_list" to "entry".

With the help of mptcp_pm_remove_addr_entry(), it's no longer necessary to
move the entry to be deleted to free_list and then traverse the list to
delete the entry, which is not allowed in BPF. The entry can be directly
deleted through list_del_rcu() and sock_kfree_s() now.

Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
Reviewed-by: Matthieu Baerts (NGI0) <matttbe@kernel.org>
Signed-off-by: Matthieu Baerts (NGI0) <matttbe@kernel.org>
Link: https://patch.msgid.link/20241213-net-next-mptcp-pm-misc-cleanup-v1-5-ddb6d00109a8@kernel.org
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
net/mptcp/pm_userspace.c
net/mptcp/protocol.h

index cac4b4a7b1e586b66d86c7a15462f642a7b0314f..7689ea987be35aa9e9b87c7add108a08566e974f 100644 (file)
@@ -287,41 +287,31 @@ remove_err:
        return err;
 }
 
-void mptcp_pm_remove_addrs(struct mptcp_sock *msk, struct list_head *rm_list)
+void mptcp_pm_remove_addr_entry(struct mptcp_sock *msk,
+                               struct mptcp_pm_addr_entry *entry)
 {
        struct mptcp_rm_list alist = { .nr = 0 };
-       struct mptcp_pm_addr_entry *entry;
        int anno_nr = 0;
 
-       list_for_each_entry(entry, rm_list, list) {
-               if (alist.nr >= MPTCP_RM_IDS_MAX)
-                       break;
-
-               /* only delete if either announced or matching a subflow */
-               if (mptcp_remove_anno_list_by_saddr(msk, &entry->addr))
-                       anno_nr++;
-               else if (!mptcp_lookup_subflow_by_saddr(&msk->conn_list,
-                                                       &entry->addr))
-                       continue;
+       /* only delete if either announced or matching a subflow */
+       if (mptcp_remove_anno_list_by_saddr(msk, &entry->addr))
+               anno_nr++;
+       else if (!mptcp_lookup_subflow_by_saddr(&msk->conn_list, &entry->addr))
+               return;
 
-               alist.ids[alist.nr++] = entry->addr.id;
-       }
+       alist.ids[alist.nr++] = entry->addr.id;
 
-       if (alist.nr) {
-               spin_lock_bh(&msk->pm.lock);
-               msk->pm.add_addr_signaled -= anno_nr;
-               mptcp_pm_remove_addr(msk, &alist);
-               spin_unlock_bh(&msk->pm.lock);
-       }
+       spin_lock_bh(&msk->pm.lock);
+       msk->pm.add_addr_signaled -= anno_nr;
+       mptcp_pm_remove_addr(msk, &alist);
+       spin_unlock_bh(&msk->pm.lock);
 }
 
 int mptcp_pm_nl_remove_doit(struct sk_buff *skb, struct genl_info *info)
 {
        struct nlattr *id = info->attrs[MPTCP_PM_ATTR_LOC_ID];
        struct mptcp_pm_addr_entry *match;
-       struct mptcp_pm_addr_entry *entry;
        struct mptcp_sock *msk;
-       LIST_HEAD(free_list);
        int err = -EINVAL;
        struct sock *sk;
        u8 id_val;
@@ -355,16 +345,14 @@ int mptcp_pm_nl_remove_doit(struct sk_buff *skb, struct genl_info *info)
                goto out;
        }
 
-       list_move(&match->list, &free_list);
+       list_del_rcu(&match->list);
        spin_unlock_bh(&msk->pm.lock);
 
-       mptcp_pm_remove_addrs(msk, &free_list);
+       mptcp_pm_remove_addr_entry(msk, match);
 
        release_sock(sk);
 
-       list_for_each_entry_safe(match, entry, &free_list, list) {
-               sock_kfree_s(sk, match, sizeof(*match));
-       }
+       sock_kfree_s(sk, match, sizeof(*match));
 
        err = 0;
 out:
index 5ba67cb601e02902ca6fcd91028ce36d30f45fc3..cd5132fe7d22096dbf6867510c10693d42255a82 100644 (file)
@@ -1038,7 +1038,8 @@ int mptcp_pm_announce_addr(struct mptcp_sock *msk,
                           const struct mptcp_addr_info *addr,
                           bool echo);
 int mptcp_pm_remove_addr(struct mptcp_sock *msk, const struct mptcp_rm_list *rm_list);
-void mptcp_pm_remove_addrs(struct mptcp_sock *msk, struct list_head *rm_list);
+void mptcp_pm_remove_addr_entry(struct mptcp_sock *msk,
+                               struct mptcp_pm_addr_entry *entry);
 
 void mptcp_free_local_addr_list(struct mptcp_sock *msk);