mptcp: register default scheduler
authorGeliang Tang <geliang.tang@suse.com>
Mon, 21 Aug 2023 22:25:21 +0000 (15:25 -0700)
committerJakub Kicinski <kuba@kernel.org>
Wed, 23 Aug 2023 00:31:19 +0000 (17:31 -0700)
This patch defines the default packet scheduler mptcp_sched_default.
Register it in mptcp_sched_init(), which is invoked in mptcp_proto_init().
Skip deleting this default scheduler in mptcp_unregister_scheduler().

Set msk->sched to the default scheduler when the input parameter of
mptcp_init_sched() is NULL.

Invoke mptcp_sched_default_get_subflow in get_send() and get_retrans()
if the defaut scheduler is set or msk->sched is NULL.

Acked-by: Paolo Abeni <pabeni@redhat.com>
Signed-off-by: Geliang Tang <geliang.tang@suse.com>
Signed-off-by: Mat Martineau <martineau@kernel.org>
Link: https://lore.kernel.org/r/20230821-upstream-net-next-20230818-v1-10-0c860fb256a8@kernel.org
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
net/mptcp/protocol.c
net/mptcp/protocol.h
net/mptcp/sched.c

index 61590ff2b9ee06c63b16291aca4accb437150221..933b257eee0242d9864ca9202cea69f2592663be 100644 (file)
@@ -3965,6 +3965,7 @@ void __init mptcp_proto_init(void)
 
        mptcp_subflow_init();
        mptcp_pm_init();
+       mptcp_sched_init();
        mptcp_token_init();
 
        if (proto_register(&mptcp_prot, 1) != 0)
index 78562f695c46dc750bab6991f13c79b5fd320403..7254b35625756b24fbe33a2139add079ee98fd63 100644 (file)
@@ -661,6 +661,7 @@ void mptcp_info2sockaddr(const struct mptcp_addr_info *info,
 struct mptcp_sched_ops *mptcp_sched_find(const char *name);
 int mptcp_register_scheduler(struct mptcp_sched_ops *sched);
 void mptcp_unregister_scheduler(struct mptcp_sched_ops *sched);
+void mptcp_sched_init(void);
 int mptcp_init_sched(struct mptcp_sock *msk,
                     struct mptcp_sched_ops *sched);
 void mptcp_release_sched(struct mptcp_sock *msk);
index cac1cc1fa3b0d706c17a4c0b0fe9772c6b8b484f..4ab0693c069c0fb0725372f17df62d87e859820c 100644 (file)
 static DEFINE_SPINLOCK(mptcp_sched_list_lock);
 static LIST_HEAD(mptcp_sched_list);
 
+static int mptcp_sched_default_get_subflow(struct mptcp_sock *msk,
+                                          struct mptcp_sched_data *data)
+{
+       struct sock *ssk;
+
+       ssk = data->reinject ? mptcp_subflow_get_retrans(msk) :
+                              mptcp_subflow_get_send(msk);
+       if (!ssk)
+               return -EINVAL;
+
+       mptcp_subflow_set_scheduled(mptcp_subflow_ctx(ssk), true);
+       return 0;
+}
+
+static struct mptcp_sched_ops mptcp_sched_default = {
+       .get_subflow    = mptcp_sched_default_get_subflow,
+       .name           = "default",
+       .owner          = THIS_MODULE,
+};
+
 /* Must be called with rcu read lock held */
 struct mptcp_sched_ops *mptcp_sched_find(const char *name)
 {
@@ -50,16 +70,24 @@ int mptcp_register_scheduler(struct mptcp_sched_ops *sched)
 
 void mptcp_unregister_scheduler(struct mptcp_sched_ops *sched)
 {
+       if (sched == &mptcp_sched_default)
+               return;
+
        spin_lock(&mptcp_sched_list_lock);
        list_del_rcu(&sched->list);
        spin_unlock(&mptcp_sched_list_lock);
 }
 
+void mptcp_sched_init(void)
+{
+       mptcp_register_scheduler(&mptcp_sched_default);
+}
+
 int mptcp_init_sched(struct mptcp_sock *msk,
                     struct mptcp_sched_ops *sched)
 {
        if (!sched)
-               goto out;
+               sched = &mptcp_sched_default;
 
        if (!bpf_try_module_get(sched, sched->owner))
                return -EBUSY;
@@ -70,7 +98,6 @@ int mptcp_init_sched(struct mptcp_sock *msk,
 
        pr_debug("sched=%s", msk->sched->name);
 
-out:
        return 0;
 }
 
@@ -117,17 +144,9 @@ int mptcp_sched_get_send(struct mptcp_sock *msk)
                        return 0;
        }
 
-       if (!msk->sched) {
-               struct sock *ssk;
-
-               ssk = mptcp_subflow_get_send(msk);
-               if (!ssk)
-                       return -EINVAL;
-               mptcp_subflow_set_scheduled(mptcp_subflow_ctx(ssk), true);
-               return 0;
-       }
-
        data.reinject = false;
+       if (msk->sched == &mptcp_sched_default || !msk->sched)
+               return mptcp_sched_default_get_subflow(msk, &data);
        return msk->sched->get_subflow(msk, &data);
 }
 
@@ -147,16 +166,8 @@ int mptcp_sched_get_retrans(struct mptcp_sock *msk)
                        return 0;
        }
 
-       if (!msk->sched) {
-               struct sock *ssk;
-
-               ssk = mptcp_subflow_get_retrans(msk);
-               if (!ssk)
-                       return -EINVAL;
-               mptcp_subflow_set_scheduled(mptcp_subflow_ctx(ssk), true);
-               return 0;
-       }
-
        data.reinject = true;
+       if (msk->sched == &mptcp_sched_default || !msk->sched)
+               return mptcp_sched_default_get_subflow(msk, &data);
        return msk->sched->get_subflow(msk, &data);
 }