Skip to content

Commit 1730b2b

Browse files
geliangtangkuba-moo
authored andcommitted
mptcp: add sched in mptcp_sock
This patch adds a new struct member sched in struct mptcp_sock. And two helpers mptcp_init_sched() and mptcp_release_sched() to init and release it. Init it with the sysctl scheduler in mptcp_init_sock(), copy the scheduler from the parent in mptcp_sk_clone(), and release it in __mptcp_destroy_sock(). Acked-by: Paolo Abeni <[email protected]> Reviewed-by: Mat Martineau <[email protected]> Signed-off-by: Geliang Tang <[email protected]> Signed-off-by: Mat Martineau <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Jakub Kicinski <[email protected]>
1 parent e3b2870 commit 1730b2b

File tree

3 files changed

+45
-0
lines changed

3 files changed

+45
-0
lines changed

net/mptcp/protocol.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2697,6 +2697,7 @@ static void mptcp_ca_reset(struct sock *sk)
26972697
static int mptcp_init_sock(struct sock *sk)
26982698
{
26992699
struct net *net = sock_net(sk);
2700+
int ret;
27002701

27012702
__mptcp_init_sock(sk);
27022703

@@ -2706,6 +2707,11 @@ static int mptcp_init_sock(struct sock *sk)
27062707
if (unlikely(!net->mib.mptcp_statistics) && !mptcp_mib_alloc(net))
27072708
return -ENOMEM;
27082709

2710+
ret = mptcp_init_sched(mptcp_sk(sk),
2711+
mptcp_sched_find(mptcp_get_scheduler(net)));
2712+
if (ret)
2713+
return ret;
2714+
27092715
set_bit(SOCK_CUSTOM_SOCKOPT, &sk->sk_socket->flags);
27102716

27112717
/* fetch the ca name; do it outside __mptcp_init_sock(), so that clone will
@@ -2851,6 +2857,7 @@ static void __mptcp_destroy_sock(struct sock *sk)
28512857
mptcp_stop_timer(sk);
28522858
sk_stop_timer(sk, &sk->sk_timer);
28532859
msk->pm.status = 0;
2860+
mptcp_release_sched(msk);
28542861

28552862
sk->sk_prot->destroy(sk);
28562863

@@ -3105,6 +3112,7 @@ struct sock *mptcp_sk_clone_init(const struct sock *sk,
31053112
msk->snd_una = msk->write_seq;
31063113
msk->wnd_end = msk->snd_nxt + req->rsk_rcv_wnd;
31073114
msk->setsockopt_seq = mptcp_sk(sk)->setsockopt_seq;
3115+
mptcp_init_sched(msk, mptcp_sk(sk)->sched);
31083116

31093117
/* passive msk is created after the first/MPC subflow */
31103118
msk->subflow_id = 2;

net/mptcp/protocol.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -312,6 +312,7 @@ struct mptcp_sock {
312312
* lock as such sock is freed after close().
313313
*/
314314
struct mptcp_pm_data pm;
315+
struct mptcp_sched_ops *sched;
315316
struct {
316317
u32 space; /* bytes copied in last measurement window */
317318
u32 copied; /* bytes copied in this measurement window */
@@ -659,6 +660,9 @@ void mptcp_info2sockaddr(const struct mptcp_addr_info *info,
659660
struct mptcp_sched_ops *mptcp_sched_find(const char *name);
660661
int mptcp_register_scheduler(struct mptcp_sched_ops *sched);
661662
void mptcp_unregister_scheduler(struct mptcp_sched_ops *sched);
663+
int mptcp_init_sched(struct mptcp_sock *msk,
664+
struct mptcp_sched_ops *sched);
665+
void mptcp_release_sched(struct mptcp_sock *msk);
662666

663667
static inline bool __tcp_can_send(const struct sock *ssk)
664668
{

net/mptcp/sched.c

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,3 +54,36 @@ void mptcp_unregister_scheduler(struct mptcp_sched_ops *sched)
5454
list_del_rcu(&sched->list);
5555
spin_unlock(&mptcp_sched_list_lock);
5656
}
57+
58+
int mptcp_init_sched(struct mptcp_sock *msk,
59+
struct mptcp_sched_ops *sched)
60+
{
61+
if (!sched)
62+
goto out;
63+
64+
if (!bpf_try_module_get(sched, sched->owner))
65+
return -EBUSY;
66+
67+
msk->sched = sched;
68+
if (msk->sched->init)
69+
msk->sched->init(msk);
70+
71+
pr_debug("sched=%s", msk->sched->name);
72+
73+
out:
74+
return 0;
75+
}
76+
77+
void mptcp_release_sched(struct mptcp_sock *msk)
78+
{
79+
struct mptcp_sched_ops *sched = msk->sched;
80+
81+
if (!sched)
82+
return;
83+
84+
msk->sched = NULL;
85+
if (sched->release)
86+
sched->release(msk);
87+
88+
bpf_module_put(sched, sched->owner);
89+
}

0 commit comments

Comments
 (0)