Skip to content

Commit 7d2253d

Browse files
committed
Merge branch 'mptcp-pm-a-few-more-fixes'
Matthieu Baerts says: ==================== mptcp: pm: a few more fixes Three small fixes related to the MPTCP path-manager: - Patch 1: correctly reflect the backup flag to the corresponding local address entry of the userspace path-manager. A fix for v5.19. - Patch 2: hold the PM lock when deleting an entry from the local addresses of the userspace path-manager to avoid messing up with this list. A fix for v5.19. - Patch 3: use _rcu variant to iterate the in-kernel path-manager's local addresses list, when under rcu_read_lock(). A fix for v5.17. ==================== Link: https://patch.msgid.link/[email protected] Signed-off-by: Jakub Kicinski <[email protected]>
2 parents 73af53d + db3eab8 commit 7d2253d

File tree

2 files changed

+17
-1
lines changed

2 files changed

+17
-1
lines changed

net/mptcp/pm_netlink.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -524,7 +524,8 @@ __lookup_addr(struct pm_nl_pernet *pernet, const struct mptcp_addr_info *info)
524524
{
525525
struct mptcp_pm_addr_entry *entry;
526526

527-
list_for_each_entry(entry, &pernet->local_addr_list, list) {
527+
list_for_each_entry_rcu(entry, &pernet->local_addr_list, list,
528+
lockdep_is_held(&pernet->lock)) {
528529
if (mptcp_addresses_equal(&entry->addr, info, entry->addr.port))
529530
return entry;
530531
}

net/mptcp/pm_userspace.c

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -308,14 +308,17 @@ int mptcp_pm_nl_remove_doit(struct sk_buff *skb, struct genl_info *info)
308308

309309
lock_sock(sk);
310310

311+
spin_lock_bh(&msk->pm.lock);
311312
match = mptcp_userspace_pm_lookup_addr_by_id(msk, id_val);
312313
if (!match) {
313314
GENL_SET_ERR_MSG(info, "address with specified id not found");
315+
spin_unlock_bh(&msk->pm.lock);
314316
release_sock(sk);
315317
goto out;
316318
}
317319

318320
list_move(&match->list, &free_list);
321+
spin_unlock_bh(&msk->pm.lock);
319322

320323
mptcp_pm_remove_addrs(msk, &free_list);
321324

@@ -560,6 +563,7 @@ int mptcp_userspace_pm_set_flags(struct sk_buff *skb, struct genl_info *info)
560563
struct nlattr *token = info->attrs[MPTCP_PM_ATTR_TOKEN];
561564
struct nlattr *attr = info->attrs[MPTCP_PM_ATTR_ADDR];
562565
struct net *net = sock_net(skb->sk);
566+
struct mptcp_pm_addr_entry *entry;
563567
struct mptcp_sock *msk;
564568
int ret = -EINVAL;
565569
struct sock *sk;
@@ -601,6 +605,17 @@ int mptcp_userspace_pm_set_flags(struct sk_buff *skb, struct genl_info *info)
601605
if (loc.flags & MPTCP_PM_ADDR_FLAG_BACKUP)
602606
bkup = 1;
603607

608+
spin_lock_bh(&msk->pm.lock);
609+
list_for_each_entry(entry, &msk->pm.userspace_pm_local_addr_list, list) {
610+
if (mptcp_addresses_equal(&entry->addr, &loc.addr, false)) {
611+
if (bkup)
612+
entry->flags |= MPTCP_PM_ADDR_FLAG_BACKUP;
613+
else
614+
entry->flags &= ~MPTCP_PM_ADDR_FLAG_BACKUP;
615+
}
616+
}
617+
spin_unlock_bh(&msk->pm.lock);
618+
604619
lock_sock(sk);
605620
ret = mptcp_pm_nl_mp_prio_send_ack(msk, &loc.addr, &rem.addr, bkup);
606621
release_sock(sk);

0 commit comments

Comments
 (0)