diff mbox series

[v1,5/0005] Squash-to: "mptcp: Implement path manager interface commands"

Message ID a2cab6d6030fb61e655ae4b387370c3de8565874.1583334095.git.pabeni@redhat.com
State Superseded, archived
Delegated to: Mat Martineau
Headers show
Series pm netlink: followup and fixes | expand

Commit Message

Paolo Abeni March 4, 2020, 3:02 p.m. UTC
Adapt the mptcp_pm_fully_established() hook to the new call
site. Additionally avoid useless work if we don't need to
announce any address /create any subflows

Signed-off-by: Paolo Abeni <pabeni@redhat.com>
---
 net/mptcp/pm.c | 26 ++++++++++++++++++++------
 1 file changed, 20 insertions(+), 6 deletions(-)
diff mbox series

Patch

diff --git a/net/mptcp/pm.c b/net/mptcp/pm.c
index 174fde4071e0..a3fe2371d41b 100644
--- a/net/mptcp/pm.c
+++ b/net/mptcp/pm.c
@@ -45,9 +45,23 @@  void mptcp_pm_new_connection(struct mptcp_sock *msk, int server_side)
 
 bool mptcp_pm_allow_new_subflow(struct mptcp_sock *msk)
 {
-	pr_debug("msk=%p", msk);
+	struct mptcp_pm_data *pm = &msk->pm;
+	int ret;
 
-	return false;
+	pr_debug("msk=%p subflows=%d max=%d allow=%d", msk, pm->subflows,
+		 pm->subflows_max, READ_ONCE(pm->accept_subflow));
+
+	/* try to avoid acquiring the lock below */
+	if (!READ_ONCE(pm->accept_subflow))
+		return false;
+
+	spin_lock_bh(&pm->lock);
+	ret = pm->subflows < pm->subflows_max;
+	if (ret && ++pm->subflows == pm->subflows_max)
+		WRITE_ONCE(pm->accept_subflow, false);
+	spin_unlock_bh(&pm->lock);
+
+	return ret;
 }
 
 static bool mptcp_pm_schedule_work(struct mptcp_sock *msk,
@@ -71,13 +85,13 @@  void mptcp_pm_fully_established(struct mptcp_sock *msk)
 	pr_debug("msk=%p", msk);
 
 	/* try to avoid acquiring the lock below */
-	if (READ_ONCE(pm->fully_established))
+	if (!READ_ONCE(pm->work_pending))
 		return;
 
 	spin_lock_bh(&pm->lock);
-	if (!READ_ONCE(pm->fully_established) &&
-	    mptcp_pm_schedule_work(msk, MPTCP_PM_ESTABLISHED))
-		WRITE_ONCE(pm->fully_established, true);
+
+	if (READ_ONCE(pm->work_pending))
+		mptcp_pm_schedule_work(msk, MPTCP_PM_ESTABLISHED);
 
 	spin_unlock_bh(&pm->lock);
 }