From: Geliang Tang <tanggeliang@kylinos.cn>
struct mptcp_pm_local is used in pm_netlink to reduce memory usage, but
it has less effect in pm_userspace because userspace pm doesn't use an
array of struct mptcp_pm_addr_entry type.
So this patch moves struct mptcp_pm_local to pm_netlink and restores the
use of mptcp_pm_addr_entry type parameters in __mptcp_subflow_connect().
In this case, only one "struct mptcp_pm_addr_entry" is needed, that's not
reserving too much memory.
This patch makes the path manager code simpler, and easier to implement
the BPF path manager.
Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
---
net/mptcp/pm_netlink.c | 26 ++++++++++++++++++++++----
net/mptcp/pm_userspace.c | 7 +------
net/mptcp/protocol.h | 8 +-------
net/mptcp/subflow.c | 2 +-
4 files changed, 25 insertions(+), 18 deletions(-)
diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c
index 8aba7670345d..00911fae5d88 100644
--- a/net/mptcp/pm_netlink.c
+++ b/net/mptcp/pm_netlink.c
@@ -40,6 +40,12 @@ struct pm_nl_pernet {
DECLARE_BITMAP(id_bitmap, MPTCP_PM_MAX_ADDR_ID + 1);
};
+struct mptcp_pm_local {
+ struct mptcp_addr_info addr;
+ u8 flags;
+ int ifindex;
+};
+
#define MPTCP_PM_ADDR_MAX 8
#define ADD_ADDR_RETRANS_MAX 3
@@ -638,8 +644,14 @@ static void mptcp_pm_create_subflow_or_signal_addr(struct mptcp_sock *msk)
continue;
spin_unlock_bh(&msk->pm.lock);
- for (i = 0; i < nr; i++)
- __mptcp_subflow_connect(sk, &local, &addrs[i]);
+ for (i = 0; i < nr; i++) {
+ struct mptcp_pm_addr_entry entry = { 0 };
+
+ entry.addr = local.addr;
+ entry.flags = local.flags;
+ entry.ifindex = local.ifindex;
+ __mptcp_subflow_connect(sk, &entry, &addrs[i]);
+ }
spin_lock_bh(&msk->pm.lock);
}
mptcp_pm_nl_check_work_pending(msk);
@@ -755,9 +767,15 @@ static void mptcp_pm_nl_add_addr_received(struct mptcp_sock *msk)
return;
spin_unlock_bh(&msk->pm.lock);
- for (i = 0; i < nr; i++)
- if (__mptcp_subflow_connect(sk, &locals[i], &remote) == 0)
+ for (i = 0; i < nr; i++) {
+ struct mptcp_pm_addr_entry entry = { 0 };
+
+ entry.addr = locals[i].addr;
+ entry.flags = locals[i].flags;
+ entry.ifindex = locals[i].ifindex;
+ if (__mptcp_subflow_connect(sk, &entry, &remote) == 0)
sf_created = true;
+ }
spin_lock_bh(&msk->pm.lock);
if (sf_created) {
diff --git a/net/mptcp/pm_userspace.c b/net/mptcp/pm_userspace.c
index a98da9a44bfa..db09350b5022 100644
--- a/net/mptcp/pm_userspace.c
+++ b/net/mptcp/pm_userspace.c
@@ -368,7 +368,6 @@ int mptcp_pm_nl_subflow_create_doit(struct sk_buff *skb, struct genl_info *info)
struct nlattr *laddr = info->attrs[MPTCP_PM_ATTR_ADDR];
struct mptcp_pm_addr_entry entry = { 0 };
struct mptcp_addr_info addr_r;
- struct mptcp_pm_local local;
struct mptcp_sock *msk;
int err = -EINVAL;
struct sock *sk;
@@ -415,12 +414,8 @@ int mptcp_pm_nl_subflow_create_doit(struct sk_buff *skb, struct genl_info *info)
goto create_err;
}
- local.addr = entry.addr;
- local.flags = entry.flags;
- local.ifindex = entry.ifindex;
-
lock_sock(sk);
- err = __mptcp_subflow_connect(sk, &local, &addr_r);
+ err = __mptcp_subflow_connect(sk, &entry, &addr_r);
release_sock(sk);
spin_lock_bh(&msk->pm.lock);
diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h
index 19a811220621..775ac2fd6854 100644
--- a/net/mptcp/protocol.h
+++ b/net/mptcp/protocol.h
@@ -236,12 +236,6 @@ struct mptcp_pm_data {
struct mptcp_rm_list rm_list_rx;
};
-struct mptcp_pm_local {
- struct mptcp_addr_info addr;
- u8 flags;
- int ifindex;
-};
-
struct mptcp_pm_addr_entry {
struct list_head list;
struct mptcp_addr_info addr;
@@ -736,7 +730,7 @@ bool mptcp_addresses_equal(const struct mptcp_addr_info *a,
void mptcp_local_address(const struct sock_common *skc, struct mptcp_addr_info *addr);
/* called with sk socket lock held */
-int __mptcp_subflow_connect(struct sock *sk, const struct mptcp_pm_local *local,
+int __mptcp_subflow_connect(struct sock *sk, const struct mptcp_pm_addr_entry *local,
const struct mptcp_addr_info *remote);
int mptcp_subflow_create_socket(struct sock *sk, unsigned short family,
struct socket **new_sock);
diff --git a/net/mptcp/subflow.c b/net/mptcp/subflow.c
index 07352b15f145..2ae8f467abc1 100644
--- a/net/mptcp/subflow.c
+++ b/net/mptcp/subflow.c
@@ -1586,7 +1586,7 @@ void mptcp_info2sockaddr(const struct mptcp_addr_info *info,
#endif
}
-int __mptcp_subflow_connect(struct sock *sk, const struct mptcp_pm_local *local,
+int __mptcp_subflow_connect(struct sock *sk, const struct mptcp_pm_addr_entry *local,
const struct mptcp_addr_info *remote)
{
struct mptcp_sock *msk = mptcp_sk(sk);
--
2.45.2
As I mentioned in [1], I decided to deprecate this patch and keep the
code for struct mptcp_pm_local as it is.
I changed this patch as "Rejected" in patchwork. Other patches in this
set are still valid.
Thanks,
-Geliang
[1]
https://patchwork.kernel.org/project/mptcp/patch/5b8a8e318c9d661f495b6d0be2b7a776de7da7a1.1729588019.git.tanggeliang@kylinos.cn/
On Thu, 2024-11-07 at 14:45 +0800, Geliang Tang wrote:
> From: Geliang Tang <tanggeliang@kylinos.cn>
>
> struct mptcp_pm_local is used in pm_netlink to reduce memory usage,
> but
> it has less effect in pm_userspace because userspace pm doesn't use
> an
> array of struct mptcp_pm_addr_entry type.
>
> So this patch moves struct mptcp_pm_local to pm_netlink and restores
> the
> use of mptcp_pm_addr_entry type parameters in
> __mptcp_subflow_connect().
> In this case, only one "struct mptcp_pm_addr_entry" is needed, that's
> not
> reserving too much memory.
>
> This patch makes the path manager code simpler, and easier to
> implement
> the BPF path manager.
>
> Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
> ---
> net/mptcp/pm_netlink.c | 26 ++++++++++++++++++++++----
> net/mptcp/pm_userspace.c | 7 +------
> net/mptcp/protocol.h | 8 +-------
> net/mptcp/subflow.c | 2 +-
> 4 files changed, 25 insertions(+), 18 deletions(-)
>
> diff --git a/net/mptcp/pm_netlink.c b/net/mptcp/pm_netlink.c
> index 8aba7670345d..00911fae5d88 100644
> --- a/net/mptcp/pm_netlink.c
> +++ b/net/mptcp/pm_netlink.c
> @@ -40,6 +40,12 @@ struct pm_nl_pernet {
> DECLARE_BITMAP(id_bitmap, MPTCP_PM_MAX_ADDR_ID + 1);
> };
>
> +struct mptcp_pm_local {
> + struct mptcp_addr_info addr;
> + u8 flags;
> + int ifindex;
> +};
> +
> #define MPTCP_PM_ADDR_MAX 8
> #define ADD_ADDR_RETRANS_MAX 3
>
> @@ -638,8 +644,14 @@ static void
> mptcp_pm_create_subflow_or_signal_addr(struct mptcp_sock *msk)
> continue;
>
> spin_unlock_bh(&msk->pm.lock);
> - for (i = 0; i < nr; i++)
> - __mptcp_subflow_connect(sk, &local,
> &addrs[i]);
> + for (i = 0; i < nr; i++) {
> + struct mptcp_pm_addr_entry entry = { 0 };
> +
> + entry.addr = local.addr;
> + entry.flags = local.flags;
> + entry.ifindex = local.ifindex;
> + __mptcp_subflow_connect(sk, &entry,
> &addrs[i]);
> + }
> spin_lock_bh(&msk->pm.lock);
> }
> mptcp_pm_nl_check_work_pending(msk);
> @@ -755,9 +767,15 @@ static void mptcp_pm_nl_add_addr_received(struct
> mptcp_sock *msk)
> return;
>
> spin_unlock_bh(&msk->pm.lock);
> - for (i = 0; i < nr; i++)
> - if (__mptcp_subflow_connect(sk, &locals[i], &remote)
> == 0)
> + for (i = 0; i < nr; i++) {
> + struct mptcp_pm_addr_entry entry = { 0 };
> +
> + entry.addr = locals[i].addr;
> + entry.flags = locals[i].flags;
> + entry.ifindex = locals[i].ifindex;
> + if (__mptcp_subflow_connect(sk, &entry, &remote) ==
> 0)
> sf_created = true;
> + }
> spin_lock_bh(&msk->pm.lock);
>
> if (sf_created) {
> diff --git a/net/mptcp/pm_userspace.c b/net/mptcp/pm_userspace.c
> index a98da9a44bfa..db09350b5022 100644
> --- a/net/mptcp/pm_userspace.c
> +++ b/net/mptcp/pm_userspace.c
> @@ -368,7 +368,6 @@ int mptcp_pm_nl_subflow_create_doit(struct
> sk_buff *skb, struct genl_info *info)
> struct nlattr *laddr = info->attrs[MPTCP_PM_ATTR_ADDR];
> struct mptcp_pm_addr_entry entry = { 0 };
> struct mptcp_addr_info addr_r;
> - struct mptcp_pm_local local;
> struct mptcp_sock *msk;
> int err = -EINVAL;
> struct sock *sk;
> @@ -415,12 +414,8 @@ int mptcp_pm_nl_subflow_create_doit(struct
> sk_buff *skb, struct genl_info *info)
> goto create_err;
> }
>
> - local.addr = entry.addr;
> - local.flags = entry.flags;
> - local.ifindex = entry.ifindex;
> -
> lock_sock(sk);
> - err = __mptcp_subflow_connect(sk, &local, &addr_r);
> + err = __mptcp_subflow_connect(sk, &entry, &addr_r);
> release_sock(sk);
>
> spin_lock_bh(&msk->pm.lock);
> diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h
> index 19a811220621..775ac2fd6854 100644
> --- a/net/mptcp/protocol.h
> +++ b/net/mptcp/protocol.h
> @@ -236,12 +236,6 @@ struct mptcp_pm_data {
> struct mptcp_rm_list rm_list_rx;
> };
>
> -struct mptcp_pm_local {
> - struct mptcp_addr_info addr;
> - u8 flags;
> - int ifindex;
> -};
> -
> struct mptcp_pm_addr_entry {
> struct list_head list;
> struct mptcp_addr_info addr;
> @@ -736,7 +730,7 @@ bool mptcp_addresses_equal(const struct
> mptcp_addr_info *a,
> void mptcp_local_address(const struct sock_common *skc, struct
> mptcp_addr_info *addr);
>
> /* called with sk socket lock held */
> -int __mptcp_subflow_connect(struct sock *sk, const struct
> mptcp_pm_local *local,
> +int __mptcp_subflow_connect(struct sock *sk, const struct
> mptcp_pm_addr_entry *local,
> const struct mptcp_addr_info *remote);
> int mptcp_subflow_create_socket(struct sock *sk, unsigned short
> family,
> struct socket **new_sock);
> diff --git a/net/mptcp/subflow.c b/net/mptcp/subflow.c
> index 07352b15f145..2ae8f467abc1 100644
> --- a/net/mptcp/subflow.c
> +++ b/net/mptcp/subflow.c
> @@ -1586,7 +1586,7 @@ void mptcp_info2sockaddr(const struct
> mptcp_addr_info *info,
> #endif
> }
>
> -int __mptcp_subflow_connect(struct sock *sk, const struct
> mptcp_pm_local *local,
> +int __mptcp_subflow_connect(struct sock *sk, const struct
> mptcp_pm_addr_entry *local,
> const struct mptcp_addr_info *remote)
> {
> struct mptcp_sock *msk = mptcp_sk(sk);
© 2016 - 2026 Red Hat, Inc.