@@ -133,6 +133,24 @@ static int proc_scheduler(struct ctl_table *ctl, int write,
133133 return ret ;
134134}
135135
136+ static int proc_available_schedulers (struct ctl_table * ctl ,
137+ int write , void * buffer ,
138+ size_t * lenp , loff_t * ppos )
139+ {
140+ struct ctl_table tbl = { .maxlen = MPTCP_SCHED_BUF_MAX , };
141+ int ret ;
142+
143+ tbl .data = kmalloc (tbl .maxlen , GFP_USER );
144+ if (!tbl .data )
145+ return - ENOMEM ;
146+
147+ mptcp_get_available_schedulers (tbl .data , MPTCP_SCHED_BUF_MAX );
148+ ret = proc_dostring (& tbl , write , buffer , lenp , ppos );
149+ kfree (tbl .data );
150+
151+ return ret ;
152+ }
153+
136154static struct ctl_table mptcp_sysctl_table [] = {
137155 {
138156 .procname = "enabled" ,
@@ -187,6 +205,12 @@ static struct ctl_table mptcp_sysctl_table[] = {
187205 .mode = 0644 ,
188206 .proc_handler = proc_scheduler ,
189207 },
208+ {
209+ .procname = "available_schedulers" ,
210+ .maxlen = MPTCP_SCHED_BUF_MAX ,
211+ .mode = 0644 ,
212+ .proc_handler = proc_available_schedulers ,
213+ },
190214 {
191215 .procname = "close_timeout" ,
192216 .maxlen = sizeof (unsigned int ),
@@ -214,7 +238,8 @@ static int mptcp_pernet_new_table(struct net *net, struct mptcp_pernet *pernet)
214238 table [4 ].data = & pernet -> stale_loss_cnt ;
215239 table [5 ].data = & pernet -> pm_type ;
216240 table [6 ].data = & pernet -> scheduler ;
217- table [7 ].data = & pernet -> close_timeout ;
241+ /* table[7] is for available_schedulers which is read-only info */
242+ table [8 ].data = & pernet -> close_timeout ;
218243
219244 hdr = register_net_sysctl_sz (net , MPTCP_SYSCTL_PATH , table ,
220245 ARRAY_SIZE (mptcp_sysctl_table ));
0 commit comments