File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change @@ -2697,6 +2697,7 @@ static void mptcp_ca_reset(struct sock *sk)
26972697static 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 ;
Original file line number Diff line number Diff 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,
659660struct mptcp_sched_ops * mptcp_sched_find (const char * name );
660661int mptcp_register_scheduler (struct mptcp_sched_ops * sched );
661662void 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
663667static inline bool __tcp_can_send (const struct sock * ssk )
664668{
Original file line number Diff line number Diff 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+ }
You can’t perform that action at this time.
0 commit comments