* [PATCH mptcp-net 0/3] fixes for userspace pm
@ 2024-11-05 9:40 Geliang Tang
2024-11-05 9:40 ` [PATCH mptcp-net 1/3] mptcp: add lookup_addr " Geliang Tang
` (4 more replies)
0 siblings, 5 replies; 8+ messages in thread
From: Geliang Tang @ 2024-11-05 9:40 UTC (permalink / raw)
To: mptcp; +Cc: Geliang Tang
From: Geliang Tang <tanggeliang@kylinos.cn>
Three fixes for userspace pm extract from "BPF path manager" series.
Geliang Tang (3):
mptcp: add lookup_addr for userspace pm
mptcp: update local address flags when setting it
mptcp: hold pm lock when deleting entry
net/mptcp/pm_userspace.c | 72 ++++++++++++++++++++++++----------------
1 file changed, 44 insertions(+), 28 deletions(-)
--
2.45.2
^ permalink raw reply [flat|nested] 8+ messages in thread* [PATCH mptcp-net 1/3] mptcp: add lookup_addr for userspace pm 2024-11-05 9:40 [PATCH mptcp-net 0/3] fixes for userspace pm Geliang Tang @ 2024-11-05 9:40 ` Geliang Tang 2024-11-05 17:31 ` Matthieu Baerts 2024-11-05 9:40 ` [PATCH mptcp-net 2/3] mptcp: update local address flags when setting it Geliang Tang ` (3 subsequent siblings) 4 siblings, 1 reply; 8+ messages in thread From: Geliang Tang @ 2024-11-05 9:40 UTC (permalink / raw) To: mptcp; +Cc: Geliang Tang From: Geliang Tang <tanggeliang@kylinos.cn> Like __lookup_addr() helper in pm_netlink.c, a new helper mptcp_userspace_pm_lookup_addr() is also defined in pm_userspace.c. It looks up the corresponding mptcp_pm_addr_entry address in userspace_pm_local_addr_list through the passed "addr" parameter and returns it. This helper can be used in mptcp_userspace_pm_delete_local_addr(), mptcp_userspace_pm_get_local_id() and mptcp_userspace_pm_is_backup() to simplify the code. Please note that with this change now list_for_each_entry() is used in mptcp_userspace_pm_append_new_local_addr(), not list_for_each_entry_safe(), but that's OK to do so because mptcp_userspace_pm_lookup_addr() only returns an entry from the list, the list hasn't been modified here. Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn> --- net/mptcp/pm_userspace.c | 58 +++++++++++++++++++++------------------- 1 file changed, 30 insertions(+), 28 deletions(-) diff --git a/net/mptcp/pm_userspace.c b/net/mptcp/pm_userspace.c index 56dfea9862b7..9c622b0e3e6e 100644 --- a/net/mptcp/pm_userspace.c +++ b/net/mptcp/pm_userspace.c @@ -26,6 +26,19 @@ void mptcp_free_local_addr_list(struct mptcp_sock *msk) } } +static struct mptcp_pm_addr_entry * +mptcp_userspace_pm_lookup_addr(struct mptcp_sock *msk, + const struct mptcp_addr_info *addr) +{ + struct mptcp_pm_addr_entry *entry; + + list_for_each_entry(entry, &msk->pm.userspace_pm_local_addr_list, list) { + if (mptcp_addresses_equal(&entry->addr, addr, false)) + return entry; + } + return NULL; +} + static int mptcp_userspace_pm_append_new_local_addr(struct mptcp_sock *msk, struct mptcp_pm_addr_entry *entry, bool needs_id) @@ -90,22 +103,20 @@ static int mptcp_userspace_pm_append_new_local_addr(struct mptcp_sock *msk, static int mptcp_userspace_pm_delete_local_addr(struct mptcp_sock *msk, struct mptcp_pm_addr_entry *addr) { - struct mptcp_pm_addr_entry *entry, *tmp; struct sock *sk = (struct sock *)msk; + struct mptcp_pm_addr_entry *entry; - list_for_each_entry_safe(entry, tmp, &msk->pm.userspace_pm_local_addr_list, list) { - if (mptcp_addresses_equal(&entry->addr, &addr->addr, false)) { - /* TODO: a refcount is needed because the entry can - * be used multiple times (e.g. fullmesh mode). - */ - list_del_rcu(&entry->list); - sock_kfree_s(sk, entry, sizeof(*entry)); - msk->pm.local_addr_used--; - return 0; - } - } - - return -EINVAL; + entry = mptcp_userspace_pm_lookup_addr(msk, &addr->addr); + if (!entry) + return -EINVAL; + + /* TODO: a refcount is needed because the entry can + * be used multiple times (e.g. fullmesh mode). + */ + list_del_rcu(&entry->list); + sock_kfree_s(sk, entry, sizeof(*entry)); + msk->pm.local_addr_used--; + return 0; } static struct mptcp_pm_addr_entry * @@ -123,17 +134,12 @@ mptcp_userspace_pm_lookup_addr_by_id(struct mptcp_sock *msk, unsigned int id) int mptcp_userspace_pm_get_local_id(struct mptcp_sock *msk, struct mptcp_addr_info *skc) { - struct mptcp_pm_addr_entry *entry = NULL, *e, new_entry; + struct mptcp_pm_addr_entry *entry = NULL, new_entry; __be16 msk_sport = ((struct inet_sock *) inet_sk((struct sock *)msk))->inet_sport; spin_lock_bh(&msk->pm.lock); - list_for_each_entry(e, &msk->pm.userspace_pm_local_addr_list, list) { - if (mptcp_addresses_equal(&e->addr, skc, false)) { - entry = e; - break; - } - } + entry = mptcp_userspace_pm_lookup_addr(msk, skc); spin_unlock_bh(&msk->pm.lock); if (entry) return entry->addr.id; @@ -153,15 +159,11 @@ bool mptcp_userspace_pm_is_backup(struct mptcp_sock *msk, struct mptcp_addr_info *skc) { struct mptcp_pm_addr_entry *entry; - bool backup = false; + bool backup; spin_lock_bh(&msk->pm.lock); - list_for_each_entry(entry, &msk->pm.userspace_pm_local_addr_list, list) { - if (mptcp_addresses_equal(&entry->addr, skc, false)) { - backup = !!(entry->flags & MPTCP_PM_ADDR_FLAG_BACKUP); - break; - } - } + entry = mptcp_userspace_pm_lookup_addr(msk, skc); + backup = entry && !!(entry->flags & MPTCP_PM_ADDR_FLAG_BACKUP); spin_unlock_bh(&msk->pm.lock); return backup; -- 2.45.2 ^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [PATCH mptcp-net 1/3] mptcp: add lookup_addr for userspace pm 2024-11-05 9:40 ` [PATCH mptcp-net 1/3] mptcp: add lookup_addr " Geliang Tang @ 2024-11-05 17:31 ` Matthieu Baerts 0 siblings, 0 replies; 8+ messages in thread From: Matthieu Baerts @ 2024-11-05 17:31 UTC (permalink / raw) To: Geliang Tang, mptcp; +Cc: Geliang Tang Hi Geliang, Thank you for the patches! On 05/11/2024 10:40, Geliang Tang wrote: > From: Geliang Tang <tanggeliang@kylinos.cn> > > Like __lookup_addr() helper in pm_netlink.c, a new helper > mptcp_userspace_pm_lookup_addr() is also defined in pm_userspace.c. > It looks up the corresponding mptcp_pm_addr_entry address in > userspace_pm_local_addr_list through the passed "addr" parameter > and returns it. > > This helper can be used in mptcp_userspace_pm_delete_local_addr(), > mptcp_userspace_pm_get_local_id() and mptcp_userspace_pm_is_backup() > to simplify the code. I would prefer to avoid the refactoring for -net if it is not needed: this will make the next fix harder to backport. Please see my comment on the next patch. Cheers, Matt -- Sponsored by the NGI0 Core fund. ^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH mptcp-net 2/3] mptcp: update local address flags when setting it 2024-11-05 9:40 [PATCH mptcp-net 0/3] fixes for userspace pm Geliang Tang 2024-11-05 9:40 ` [PATCH mptcp-net 1/3] mptcp: add lookup_addr " Geliang Tang @ 2024-11-05 9:40 ` Geliang Tang 2024-11-05 17:31 ` Matthieu Baerts 2024-11-05 9:41 ` [PATCH mptcp-net 3/3] mptcp: hold pm lock when deleting entry Geliang Tang ` (2 subsequent siblings) 4 siblings, 1 reply; 8+ messages in thread From: Geliang Tang @ 2024-11-05 9:40 UTC (permalink / raw) To: mptcp; +Cc: Geliang Tang From: Geliang Tang <tanggeliang@kylinos.cn> Just like in-kernel pm, when userspace pm does set_flags, it needs to send out MP_PRIO signal, and also modify the flags of the corresponding address entry in the local address list. This patch implements the missing logic. Use mptcp_userspace_pm_lookup_addr() helper to find the address entry on userspace_pm_local_addr_list, if bkup is true, set the flags of the address entry with FLAG_BACKUP, otherwise, clear FLAG_BACKUP. Fixes: 892f396c8e68 ("mptcp: netlink: issue MP_PRIO signals from userspace PMs") Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn> --- net/mptcp/pm_userspace.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/net/mptcp/pm_userspace.c b/net/mptcp/pm_userspace.c index 9c622b0e3e6e..0c0f6f65accb 100644 --- a/net/mptcp/pm_userspace.c +++ b/net/mptcp/pm_userspace.c @@ -562,6 +562,7 @@ int mptcp_userspace_pm_set_flags(struct sk_buff *skb, struct genl_info *info) struct nlattr *token = info->attrs[MPTCP_PM_ATTR_TOKEN]; struct nlattr *attr = info->attrs[MPTCP_PM_ATTR_ADDR]; struct net *net = sock_net(skb->sk); + struct mptcp_pm_addr_entry *entry; struct mptcp_sock *msk; int ret = -EINVAL; struct sock *sk; @@ -603,6 +604,16 @@ int mptcp_userspace_pm_set_flags(struct sk_buff *skb, struct genl_info *info) if (loc.flags & MPTCP_PM_ADDR_FLAG_BACKUP) bkup = 1; + spin_lock_bh(&msk->pm.lock); + entry = mptcp_userspace_pm_lookup_addr(msk, &loc.addr); + if (entry) { + if (bkup) + entry->flags |= MPTCP_PM_ADDR_FLAG_BACKUP; + else + entry->flags &= ~MPTCP_PM_ADDR_FLAG_BACKUP; + } + spin_unlock_bh(&msk->pm.lock); + lock_sock(sk); ret = mptcp_pm_nl_mp_prio_send_ack(msk, &loc.addr, &rem.addr, bkup); release_sock(sk); -- 2.45.2 ^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [PATCH mptcp-net 2/3] mptcp: update local address flags when setting it 2024-11-05 9:40 ` [PATCH mptcp-net 2/3] mptcp: update local address flags when setting it Geliang Tang @ 2024-11-05 17:31 ` Matthieu Baerts 0 siblings, 0 replies; 8+ messages in thread From: Matthieu Baerts @ 2024-11-05 17:31 UTC (permalink / raw) To: Geliang Tang, mptcp; +Cc: Geliang Tang Hi Geliang, On 05/11/2024 10:40, Geliang Tang wrote: > From: Geliang Tang <tanggeliang@kylinos.cn> > > Just like in-kernel pm, when userspace pm does set_flags, it needs to send > out MP_PRIO signal, and also modify the flags of the corresponding address > entry in the local address list. This patch implements the missing logic. > > Use mptcp_userspace_pm_lookup_addr() helper to find the address entry on > userspace_pm_local_addr_list, if bkup is true, set the flags of the address > entry with FLAG_BACKUP, otherwise, clear FLAG_BACKUP. > > Fixes: 892f396c8e68 ("mptcp: netlink: issue MP_PRIO signals from userspace PMs") > Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn> > --- > net/mptcp/pm_userspace.c | 11 +++++++++++ > 1 file changed, 11 insertions(+) > > diff --git a/net/mptcp/pm_userspace.c b/net/mptcp/pm_userspace.c > index 9c622b0e3e6e..0c0f6f65accb 100644 > --- a/net/mptcp/pm_userspace.c > +++ b/net/mptcp/pm_userspace.c > @@ -562,6 +562,7 @@ int mptcp_userspace_pm_set_flags(struct sk_buff *skb, struct genl_info *info) > struct nlattr *token = info->attrs[MPTCP_PM_ATTR_TOKEN]; > struct nlattr *attr = info->attrs[MPTCP_PM_ATTR_ADDR]; > struct net *net = sock_net(skb->sk); > + struct mptcp_pm_addr_entry *entry; > struct mptcp_sock *msk; > int ret = -EINVAL; > struct sock *sk; > @@ -603,6 +604,16 @@ int mptcp_userspace_pm_set_flags(struct sk_buff *skb, struct genl_info *info) > if (loc.flags & MPTCP_PM_ADDR_FLAG_BACKUP) > bkup = 1; > > + spin_lock_bh(&msk->pm.lock); > + entry = mptcp_userspace_pm_lookup_addr(msk, &loc.addr); (Linked to my comment from the previous patch) Adding only the helper, and squashing that in this patch here might be an option, but even that can cause conflicts. I think the simplest is not to add this small helper only used once for the moment: so simply calling list_for_each_entry() here, and add the following code inside it. WDYT? > + if (entry) { > + if (bkup) > + entry->flags |= MPTCP_PM_ADDR_FLAG_BACKUP; > + else > + entry->flags &= ~MPTCP_PM_ADDR_FLAG_BACKUP; > + } > + spin_unlock_bh(&msk->pm.lock); > + > lock_sock(sk); > ret = mptcp_pm_nl_mp_prio_send_ack(msk, &loc.addr, &rem.addr, bkup); > release_sock(sk); Cheers, Matt -- Sponsored by the NGI0 Core fund. ^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH mptcp-net 3/3] mptcp: hold pm lock when deleting entry 2024-11-05 9:40 [PATCH mptcp-net 0/3] fixes for userspace pm Geliang Tang 2024-11-05 9:40 ` [PATCH mptcp-net 1/3] mptcp: add lookup_addr " Geliang Tang 2024-11-05 9:40 ` [PATCH mptcp-net 2/3] mptcp: update local address flags when setting it Geliang Tang @ 2024-11-05 9:41 ` Geliang Tang 2024-11-05 11:25 ` [PATCH mptcp-net 0/3] fixes for userspace pm MPTCP CI 2024-11-05 15:40 ` MPTCP CI 4 siblings, 0 replies; 8+ messages in thread From: Geliang Tang @ 2024-11-05 9:41 UTC (permalink / raw) To: mptcp; +Cc: Geliang Tang From: Geliang Tang <tanggeliang@kylinos.cn> When traversing userspace_pm_local_addr_list and deleting an entry from it in mptcp_pm_nl_remove_doit(), msk->pm.lock should be held. This patch holds the lock in mptcp_pm_nl_remove_doit(). Fixes: d9a4594edabf ("mptcp: netlink: Add MPTCP_PM_CMD_REMOVE") Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn> --- net/mptcp/pm_userspace.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/net/mptcp/pm_userspace.c b/net/mptcp/pm_userspace.c index 0c0f6f65accb..3664f3c1572e 100644 --- a/net/mptcp/pm_userspace.c +++ b/net/mptcp/pm_userspace.c @@ -310,14 +310,17 @@ int mptcp_pm_nl_remove_doit(struct sk_buff *skb, struct genl_info *info) lock_sock(sk); + spin_lock_bh(&msk->pm.lock); match = mptcp_userspace_pm_lookup_addr_by_id(msk, id_val); if (!match) { GENL_SET_ERR_MSG(info, "address with specified id not found"); + spin_unlock_bh(&msk->pm.lock); release_sock(sk); goto out; } list_move(&match->list, &free_list); + spin_unlock_bh(&msk->pm.lock); mptcp_pm_remove_addrs(msk, &free_list); -- 2.45.2 ^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [PATCH mptcp-net 0/3] fixes for userspace pm 2024-11-05 9:40 [PATCH mptcp-net 0/3] fixes for userspace pm Geliang Tang ` (2 preceding siblings ...) 2024-11-05 9:41 ` [PATCH mptcp-net 3/3] mptcp: hold pm lock when deleting entry Geliang Tang @ 2024-11-05 11:25 ` MPTCP CI 2024-11-05 15:40 ` MPTCP CI 4 siblings, 0 replies; 8+ messages in thread From: MPTCP CI @ 2024-11-05 11:25 UTC (permalink / raw) To: Geliang Tang; +Cc: mptcp Hi Geliang, Thank you for your modifications, that's great! Our CI did some validations and here is its report: - KVM Validation: normal: Critical: Global Timeout ❌ - KVM Validation: debug: Success! ✅ - KVM Validation: btf-normal (only bpftest_all): Success! ✅ - KVM Validation: btf-debug (only bpftest_all): Success! ✅ - Task: https://github.com/multipath-tcp/mptcp_net-next/actions/runs/11681780257 Initiator: Patchew Applier Commits: https://github.com/multipath-tcp/mptcp_net-next/commits/e594c42ba8aa Patchwork: https://patchwork.kernel.org/project/mptcp/list/?series=906422 If there are some issues, you can reproduce them using the same environment as the one used by the CI thanks to a docker image, e.g.: $ cd [kernel source code] $ docker run -v "${PWD}:${PWD}:rw" -w "${PWD}" --privileged --rm -it \ --pull always mptcp/mptcp-upstream-virtme-docker:latest \ auto-normal For more details: https://github.com/multipath-tcp/mptcp-upstream-virtme-docker Please note that despite all the efforts that have been already done to have a stable tests suite when executed on a public CI like here, it is possible some reported issues are not due to your modifications. Still, do not hesitate to help us improve that ;-) Cheers, MPTCP GH Action bot Bot operated by Matthieu Baerts (NGI0 Core) ^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH mptcp-net 0/3] fixes for userspace pm 2024-11-05 9:40 [PATCH mptcp-net 0/3] fixes for userspace pm Geliang Tang ` (3 preceding siblings ...) 2024-11-05 11:25 ` [PATCH mptcp-net 0/3] fixes for userspace pm MPTCP CI @ 2024-11-05 15:40 ` MPTCP CI 4 siblings, 0 replies; 8+ messages in thread From: MPTCP CI @ 2024-11-05 15:40 UTC (permalink / raw) To: Geliang Tang; +Cc: mptcp Hi Geliang, Thank you for your modifications, that's great! Our CI did some validations and here is its report: - KVM Validation: normal: Success! ✅ - KVM Validation: debug: Success! ✅ - KVM Validation: btf-normal (only bpftest_all): Success! ✅ - KVM Validation: btf-debug (only bpftest_all): Success! ✅ - Task: https://github.com/multipath-tcp/mptcp_net-next/actions/runs/11681780257 Initiator: Patchew Applier Commits: https://github.com/multipath-tcp/mptcp_net-next/commits/e594c42ba8aa Patchwork: https://patchwork.kernel.org/project/mptcp/list/?series=906422 If there are some issues, you can reproduce them using the same environment as the one used by the CI thanks to a docker image, e.g.: $ cd [kernel source code] $ docker run -v "${PWD}:${PWD}:rw" -w "${PWD}" --privileged --rm -it \ --pull always mptcp/mptcp-upstream-virtme-docker:latest \ auto-normal For more details: https://github.com/multipath-tcp/mptcp-upstream-virtme-docker Please note that despite all the efforts that have been already done to have a stable tests suite when executed on a public CI like here, it is possible some reported issues are not due to your modifications. Still, do not hesitate to help us improve that ;-) Cheers, MPTCP GH Action bot Bot operated by Matthieu Baerts (NGI0 Core) ^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2024-11-05 17:31 UTC | newest] Thread overview: 8+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2024-11-05 9:40 [PATCH mptcp-net 0/3] fixes for userspace pm Geliang Tang 2024-11-05 9:40 ` [PATCH mptcp-net 1/3] mptcp: add lookup_addr " Geliang Tang 2024-11-05 17:31 ` Matthieu Baerts 2024-11-05 9:40 ` [PATCH mptcp-net 2/3] mptcp: update local address flags when setting it Geliang Tang 2024-11-05 17:31 ` Matthieu Baerts 2024-11-05 9:41 ` [PATCH mptcp-net 3/3] mptcp: hold pm lock when deleting entry Geliang Tang 2024-11-05 11:25 ` [PATCH mptcp-net 0/3] fixes for userspace pm MPTCP CI 2024-11-05 15:40 ` MPTCP CI
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox