Add sched_data pointer into mptcp_sock too.
Signed-off-by: Geliang Tang <geliang.tang@suse.com>
---
net/mptcp/protocol.c | 5 +++--
net/mptcp/protocol.h | 4 +++-
net/mptcp/sched.c | 13 ++++++++++++-
3 files changed, 18 insertions(+), 4 deletions(-)
diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c
index cbfa4c3ddc3a..380b7335618c 100644
--- a/net/mptcp/protocol.c
+++ b/net/mptcp/protocol.c
@@ -2825,7 +2825,8 @@ static int mptcp_init_sock(struct sock *sk)
return -ENOMEM;
ret = mptcp_init_sched(mptcp_sk(sk),
- mptcp_sched_find(mptcp_get_scheduler(net)));
+ mptcp_sched_find(mptcp_get_scheduler(net)),
+ GFP_KERNEL);
if (ret)
return ret;
@@ -3225,7 +3226,7 @@ struct sock *mptcp_sk_clone_init(const struct sock *sk,
msk->snd_una = msk->write_seq;
msk->wnd_end = msk->snd_nxt + req->rsk_rcv_wnd;
msk->setsockopt_seq = mptcp_sk(sk)->setsockopt_seq;
- mptcp_init_sched(msk, mptcp_sk(sk)->sched);
+ mptcp_init_sched(msk, mptcp_sk(sk)->sched, GFP_ATOMIC);
/* passive msk is created after the first/MPC subflow */
msk->subflow_id = 2;
diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h
index d2e59cf33f57..ac05fc317689 100644
--- a/net/mptcp/protocol.h
+++ b/net/mptcp/protocol.h
@@ -315,6 +315,7 @@ struct mptcp_sock {
*/
struct sock *first;
struct mptcp_pm_data pm;
+ struct mptcp_sched_data *sched_data;
struct mptcp_sched_ops *sched;
struct {
u32 space; /* bytes copied in last measurement window */
@@ -661,7 +662,8 @@ 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);
int mptcp_init_sched(struct mptcp_sock *msk,
- struct mptcp_sched_ops *sched);
+ struct mptcp_sched_ops *sched,
+ gfp_t gfp);
void mptcp_release_sched(struct mptcp_sock *msk);
void mptcp_subflow_set_scheduled(struct mptcp_subflow_context *subflow,
bool scheduled);
diff --git a/net/mptcp/sched.c b/net/mptcp/sched.c
index c7c167e48d72..a053a9504dfd 100644
--- a/net/mptcp/sched.c
+++ b/net/mptcp/sched.c
@@ -56,7 +56,8 @@ void mptcp_unregister_scheduler(struct mptcp_sched_ops *sched)
}
int mptcp_init_sched(struct mptcp_sock *msk,
- struct mptcp_sched_ops *sched)
+ struct mptcp_sched_ops *sched,
+ gfp_t gfp)
{
if (!sched)
goto out;
@@ -64,6 +65,12 @@ int mptcp_init_sched(struct mptcp_sock *msk,
if (!bpf_try_module_get(sched, sched->owner))
return -EBUSY;
+ msk->sched_data = kzalloc(sizeof(struct mptcp_sched_data), gfp);
+ if (!msk->sched_data) {
+ bpf_module_put(sched, sched->owner);
+ return -ENOMEM;
+ }
+
msk->sched = sched;
if (msk->sched->init)
msk->sched->init(msk);
@@ -81,6 +88,10 @@ void mptcp_release_sched(struct mptcp_sock *msk)
if (!sched)
return;
+ if (msk->sched_data) {
+ kfree(msk->sched_data);
+ msk->sched_data = NULL;
+ }
msk->sched = NULL;
if (sched->release)
sched->release(msk);
--
2.35.3