Skip to content

Commit c21b50d

Browse files
mjmartineaudavem330
authored andcommitted
mptcp: Avoid acquiring PM lock for subflow priority changes
The in-kernel path manager code for changing subflow flags acquired both the msk socket lock and the PM lock when possibly changing the "backup" and "fullmesh" flags. mptcp_pm_nl_mp_prio_send_ack() does not access anything protected by the PM lock, and it must release and reacquire the PM lock. By pushing the PM lock to where it is needed in mptcp_pm_nl_fullmesh(), the lock is only acquired when the fullmesh flag is changed and the backup flag code no longer has to release and reacquire the PM lock. The change in locking context requires the MIB update to be modified - move that to a better location instead. This change also makes it possible to call mptcp_pm_nl_mp_prio_send_ack() for the userspace PM commands without manipulating the in-kernel PM lock. Fixes: 0f9f696 ("mptcp: add set_flags command in PM netlink") Acked-by: Paolo Abeni <[email protected]> Signed-off-by: Mat Martineau <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 5ccecae commit c21b50d

File tree

2 files changed

+5
-6
lines changed

2 files changed

+5
-6
lines changed

net/mptcp/options.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1584,6 +1584,9 @@ void mptcp_write_options(struct tcphdr *th, __be32 *ptr, struct tcp_sock *tp,
15841584
*ptr++ = mptcp_option(MPTCPOPT_MP_PRIO,
15851585
TCPOLEN_MPTCP_PRIO,
15861586
opts->backup, TCPOPT_NOP);
1587+
1588+
MPTCP_INC_STATS(sock_net((const struct sock *)tp),
1589+
MPTCP_MIB_MPPRIOTX);
15871590
}
15881591

15891592
mp_capable_done:

net/mptcp/pm_netlink.c

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -727,7 +727,6 @@ static int mptcp_pm_nl_mp_prio_send_ack(struct mptcp_sock *msk,
727727

728728
mptcp_for_each_subflow(msk, subflow) {
729729
struct sock *ssk = mptcp_subflow_tcp_sock(subflow);
730-
struct sock *sk = (struct sock *)msk;
731730
struct mptcp_addr_info local;
732731

733732
local_address((struct sock_common *)ssk, &local);
@@ -739,12 +738,9 @@ static int mptcp_pm_nl_mp_prio_send_ack(struct mptcp_sock *msk,
739738
subflow->backup = bkup;
740739
subflow->send_mp_prio = 1;
741740
subflow->request_bkup = bkup;
742-
__MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_MPPRIOTX);
743741

744-
spin_unlock_bh(&msk->pm.lock);
745742
pr_debug("send ack for mp_prio");
746743
mptcp_subflow_send_ack(ssk);
747-
spin_lock_bh(&msk->pm.lock);
748744

749745
return 0;
750746
}
@@ -1816,8 +1812,10 @@ static void mptcp_pm_nl_fullmesh(struct mptcp_sock *msk,
18161812

18171813
list.ids[list.nr++] = addr->id;
18181814

1815+
spin_lock_bh(&msk->pm.lock);
18191816
mptcp_pm_nl_rm_subflow_received(msk, &list);
18201817
mptcp_pm_create_subflow_or_signal_addr(msk);
1818+
spin_unlock_bh(&msk->pm.lock);
18211819
}
18221820

18231821
static int mptcp_nl_set_flags(struct net *net,
@@ -1835,12 +1833,10 @@ static int mptcp_nl_set_flags(struct net *net,
18351833
goto next;
18361834

18371835
lock_sock(sk);
1838-
spin_lock_bh(&msk->pm.lock);
18391836
if (changed & MPTCP_PM_ADDR_FLAG_BACKUP)
18401837
ret = mptcp_pm_nl_mp_prio_send_ack(msk, addr, bkup);
18411838
if (changed & MPTCP_PM_ADDR_FLAG_FULLMESH)
18421839
mptcp_pm_nl_fullmesh(msk, addr);
1843-
spin_unlock_bh(&msk->pm.lock);
18441840
release_sock(sk);
18451841

18461842
next:

0 commit comments

Comments
 (0)