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 - 2024 Red Hat, Inc.