[PATCH mptcp-next 3/6] mptcp: Bypass kernel PM when userspace PM is enabled

Mat Martineau posted 6 patches 4 years, 2 months ago
Maintainers: Mat Martineau <mathew.j.martineau@linux.intel.com>, Jakub Kicinski <kuba@kernel.org>, Jonathan Corbet <corbet@lwn.net>, Matthieu Baerts <matthieu.baerts@tessares.net>, Shuah Khan <shuah@kernel.org>, "David S. Miller" <davem@davemloft.net>
There is a newer version of this series
[PATCH mptcp-next 3/6] mptcp: Bypass kernel PM when userspace PM is enabled
Posted by Mat Martineau 4 years, 2 months ago
When a MPTCP connection is managed by a userspace PM, bypass the kernel
PM for incoming advertisements and subflow events. Netlink events are
still sent to userspace.

Signed-off-by: Mat Martineau <mathew.j.martineau@linux.intel.com>
---
 net/mptcp/pm.c | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/net/mptcp/pm.c b/net/mptcp/pm.c
index 3a3800771aca..7f96a888e2d5 100644
--- a/net/mptcp/pm.c
+++ b/net/mptcp/pm.c
@@ -189,7 +189,8 @@ void mptcp_pm_add_addr_received(struct mptcp_sock *msk,
 
 	spin_lock_bh(&pm->lock);
 
-	if (!READ_ONCE(pm->accept_addr)) {
+	if (!READ_ONCE(pm->accept_addr) ||
+	    READ_ONCE(pm->pm_type) != MPTCP_PM_TYPE_KERNEL) {
 		mptcp_pm_announce_addr(msk, addr, true);
 		mptcp_pm_add_addr_send_ack(msk);
 	} else if (mptcp_pm_schedule_work(msk, MPTCP_PM_ADD_ADDR_RECEIVED)) {
@@ -233,6 +234,9 @@ void mptcp_pm_rm_addr_received(struct mptcp_sock *msk,
 	for (i = 0; i < rm_list->nr; i++)
 		mptcp_event_addr_removed(msk, rm_list->ids[i]);
 
+	if (READ_ONCE(pm->pm_type) != MPTCP_PM_TYPE_KERNEL)
+		return;
+
 	spin_lock_bh(&pm->lock);
 	mptcp_pm_schedule_work(msk, MPTCP_PM_RM_ADDR_RECEIVED);
 	pm->rm_list_rx = *rm_list;
-- 
2.34.0


Re: [PATCH mptcp-next 3/6] mptcp: Bypass kernel PM when userspace PM is enabled
Posted by Kishen Maloor 4 years, 2 months ago
On 11/17/21 5:30 PM, Mat Martineau wrote:
> When a MPTCP connection is managed by a userspace PM, bypass the kernel
> PM for incoming advertisements and subflow events. Netlink events are
> still sent to userspace.
> 
> Signed-off-by: Mat Martineau <mathew.j.martineau@linux.intel.com>
> ---
>  net/mptcp/pm.c | 6 +++++-
>  1 file changed, 5 insertions(+), 1 deletion(-)
> 
> diff --git a/net/mptcp/pm.c b/net/mptcp/pm.c
> index 3a3800771aca..7f96a888e2d5 100644
> --- a/net/mptcp/pm.c
> +++ b/net/mptcp/pm.c
> @@ -189,7 +189,8 @@ void mptcp_pm_add_addr_received(struct mptcp_sock *msk,
>  
>  	spin_lock_bh(&pm->lock);
>  
> -	if (!READ_ONCE(pm->accept_addr)) {
> +	if (!READ_ONCE(pm->accept_addr) ||
> +	    READ_ONCE(pm->pm_type) != MPTCP_PM_TYPE_KERNEL) {
>  		mptcp_pm_announce_addr(msk, addr, true);
>  		mptcp_pm_add_addr_send_ack(msk);
>  	} else if (mptcp_pm_schedule_work(msk, MPTCP_PM_ADD_ADDR_RECEIVED)) {
> @@ -233,6 +234,9 @@ void mptcp_pm_rm_addr_received(struct mptcp_sock *msk,
>  	for (i = 0; i < rm_list->nr; i++)
>  		mptcp_event_addr_removed(msk, rm_list->ids[i]);
>  
> +	if (READ_ONCE(pm->pm_type) != MPTCP_PM_TYPE_KERNEL)
> +		return;
> +

The flow which ensues from MPTCP_PM_RM_ADDR_RECEIVED can be fully utilized with userspace PMs, so the above check for pm_type can be removed.

>  	spin_lock_bh(&pm->lock);
>  	mptcp_pm_schedule_work(msk, MPTCP_PM_RM_ADDR_RECEIVED);
>  	pm->rm_list_rx = *rm_list;
>