diff options
author | Geliang Tang <geliang.tang@suse.com> | 2023-08-21 15:25:21 -0700 |
---|---|---|
committer | Jakub Kicinski <kuba@kernel.org> | 2023-08-22 17:31:19 -0700 |
commit | ed1ad86b8527f8f864df3c182adbfcd12a445de6 (patch) | |
tree | 23e03f8855716d0417a00eedff40eca4d63cee49 /net/mptcp | |
parent | ee2708aedad00544d38dba6df88efeb4a330bd66 (diff) | |
download | linux-ed1ad86b8527f8f864df3c182adbfcd12a445de6.tar.gz linux-ed1ad86b8527f8f864df3c182adbfcd12a445de6.tar.bz2 linux-ed1ad86b8527f8f864df3c182adbfcd12a445de6.zip |
mptcp: register default scheduler
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>
Diffstat (limited to 'net/mptcp')
-rw-r--r-- | net/mptcp/protocol.c | 1 | ||||
-rw-r--r-- | net/mptcp/protocol.h | 1 | ||||
-rw-r--r-- | net/mptcp/sched.c | 55 |
3 files changed, 35 insertions, 22 deletions
diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c index 61590ff2b9ee..933b257eee02 100644 --- a/net/mptcp/protocol.c +++ b/net/mptcp/protocol.c @@ -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) diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h index 78562f695c46..7254b3562575 100644 --- a/net/mptcp/protocol.h +++ b/net/mptcp/protocol.h @@ -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); diff --git a/net/mptcp/sched.c b/net/mptcp/sched.c index cac1cc1fa3b0..4ab0693c069c 100644 --- a/net/mptcp/sched.c +++ b/net/mptcp/sched.c @@ -16,6 +16,26 @@ 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); } |