sched: add a tuning knob to allow changing RR tmeslice
Subsystems (2)
PATCH 1/1 sched: add a tuning knob to allow changing RR tmeslice
Subject: [PATCH] sched: add a tuning knob to allow changing RR timeslice
User wanted a facility simliar to the ability on Solaris to adjust the SCHED_RR timeslice value. Add a /proc/sys/kernel scheduler knob named sched_rr_timeslice_ms which allows global changing of the SCHED_RR timeslice value. User visable value is in milliseconds but is stored as jiffies. Setting to 0 (zero) resets to the default (currently 100ms).
Patch against tip/master, currently 3.7-rc3.
--- include/linux/sched.h | 6 +++++- kernel/sched.c | 19 +++++++++++++++++++ kernel/sched_rt.c | 4 ++-- kernel/sysctl.c | 8 ++++++++ 4 files changed, 34 insertions(+), 3 deletions(-)
include/linux/sched.h +5 -1
@@ -2097,11 +2097,15 @@ static inline unsigned int get_sysctl_timer_migration(void)#endif extern unsigned int sysctl_sched_rt_period;extern int sysctl_sched_rt_runtime; -int sched_rt_handler (struct ctl_table *table,int write,void __user *buffer,size_t *lenp,loff_t *ppos); +extern int sched_rr_timeslice; +extern int sched_rr_handler (struct ctl_table *table,int write, +void __user *buffer,size_t *lenp, +loff_t *ppos); +#ifdef CONFIG_SCHED_AUTOGROUP extern unsigned int sysctl_sched_autogroup_enabled;
kernel/sched.c +19 -0
@@ -120,6 +120,7 @@* Timeslices get refilled after they expire. */ #define DEF_TIMESLICE (100 * HZ / 1000) +int sched_rr_timeslice =DEF_TIMESLICE ;/* * single value that denotes runtime == period, ie unlimited time.
@@ -9614,6 +9615,24 @@ static int sched_rt_global_constraints(void) }#endif /* CONFIG_RT_GROUP_SCHED */ +int sched_rr_handler (struct ctl_table *table,int write, +void __user *buffer,size_t *lenp, +loff_t *ppos) +{ +int ret; +static DEFINE_MUTEX (mutex); + +mutex_lock (&mutex); + ret =proc_dointvec (table, write, buffer, lenp, ppos); +/* make sure that internally we keep jiffies */ +/* also, writing zero resets timeslice to default */ +if (!ret && write) + sched_rr_timeslice = sched_rr_timeslice <=0 ? +DEF_TIMESLICE :msecs_to_jiffies (sched_rr_timeslice); +mutex_unlock (&mutex); +return ret; +} +int sched_rt_handler (struct ctl_table *table,int write,void __user *buffer,size_t *lenp,loff_t *ppos)
kernel/sched_rt.c +2 -2
@@ -1791,7 +1791,7 @@ static void task_tick_rt(struct rq *rq, struct task_struct *p, int queued)if (--p->rt.time_slice)return ; - p->rt.time_slice =DEF_TIMESLICE ; + p->rt.time_slice = sched_rr_timeslice;/* * Requeue to the end of queue if we are not the only element
@@ -1819,7 +1819,7 @@ static unsigned int get_rr_interval_rt(struct rq *rq, struct task_struct *task)* Time slice is 0 for SCHED_FIFO tasks */ if (task->policy ==SCHED_RR ) -return DEF_TIMESLICE ; +return sched_rr_timeslice;else return 0 ; }
kernel/sysctl.c +8 -0
@@ -362,6 +362,14 @@ static struct ctl_table kern_table[] = { .mode = 0644, .proc_handler = sched_rt_handler, }, + { + .procname = "sched_rr_timeslice_ms", + .data = &sched_rr_timeslice, + .maxlen = sizeof(int), + .mode = 0644, + .proc_handler = sched_rr_handler, + }, + #ifdef CONFIG_SCHED_AUTOGROUP { .procname = "sched_autogroup_enabled",
Signature · 1 line
1.7.11.7
Steven Rostedt
reviewerQuoted 8 lines · Clark Williams
Subject: [PATCH] sched: add a tuning knob to allow changing RR timeslice
User wanted a facility simliar to the ability on Solaris to adjust the
SCHED_RRtimeslice value. Add a/proc/sys/kernelscheduler knob namedsched_rr_timeslice_mswhich allows global changing of theSCHED_RRtimeslice value. User visable value is in milliseconds but is stored as jiffies. Setting to 0 (zero) resets to the default (currently 100ms).
Hmm, has this been ignored?
I guess the real question, is it still needed (or wanted)?
-- Steve
Quoted 109 lines
Patch against tip/master, currently 3.7-rc3.
Signed-off-by Clark Williams <[email protected]>--- include/linux/sched.h | 6 +++++- kernel/sched.c | 19 +++++++++++++++++++ kernel/sched_rt.c | 4 ++-- kernel/sysctl.c | 8 ++++++++ 4 files changed, 34 insertions(+), 3 deletions(-)include/linux/sched.h +5
-1@@ -2097,11 +2097,15 @@ static inline unsigned int get_sysctl_timer_migration(void)#endif extern unsigned int sysctl_sched_rt_period;extern int sysctl_sched_rt_runtime; -int sched_rt_handler (struct ctl_table *table,int write,void __user *buffer,size_t *lenp,loff_t *ppos); +extern int sched_rr_timeslice; +extern int sched_rr_handler (struct ctl_table *table,int write, +void __user *buffer,size_t *lenp, +loff_t *ppos); +#ifdef CONFIG_SCHED_AUTOGROUP extern unsigned int sysctl_sched_autogroup_enabled;kernel/sched.c +19
-0@@ -120,6 +120,7 @@* Timeslices get refilled after they expire. */ #define DEF_TIMESLICE (100 * HZ / 1000) +int sched_rr_timeslice =DEF_TIMESLICE ;/* * single value that denotes runtime == period, ie unlimited time. @@ -9614,6 +9615,24 @@ static int sched_rt_global_constraints(void) }#endif /* CONFIG_RT_GROUP_SCHED */ +int sched_rr_handler (struct ctl_table *table,int write, +void __user *buffer,size_t *lenp, +loff_t *ppos) +{ +int ret; +static DEFINE_MUTEX (mutex); + +mutex_lock (&mutex); + ret =proc_dointvec (table, write, buffer, lenp, ppos); +/* make sure that internally we keep jiffies */ +/* also, writing zero resets timeslice to default */ +if (!ret && write) + sched_rr_timeslice = sched_rr_timeslice <=0 ? +DEF_TIMESLICE :msecs_to_jiffies (sched_rr_timeslice); +mutex_unlock (&mutex); +return ret; +} +int sched_rt_handler (struct ctl_table *table,int write,void __user *buffer,size_t *lenp,loff_t *ppos)kernel/sched_rt.c +2
-2@@ -1791,7 +1791,7 @@ static void task_tick_rt(struct rq *rq, struct task_struct *p, int queued)if (--p->rt.time_slice)return ; - p->rt.time_slice =DEF_TIMESLICE ; + p->rt.time_slice = sched_rr_timeslice;/* * Requeue to the end of queue if we are not the only element @@ -1819,7 +1819,7 @@ static unsigned int get_rr_interval_rt(struct rq *rq, struct task_struct *task)* Time slice is 0 for SCHED_FIFO tasks */ if (task->policy ==SCHED_RR ) -return DEF_TIMESLICE ; +return sched_rr_timeslice;else return 0 ; }kernel/sysctl.c +8
-0@@ -362,6 +362,14 @@ static struct ctl_table kern_table[] = { .mode = 0644, .proc_handler = sched_rt_handler, }, + { + .procname = "sched_rr_timeslice_ms", + .data = &sched_rr_timeslice, + .maxlen = sizeof(int), + .mode = 0644, + .proc_handler = sched_rr_handler, + }, + #ifdef CONFIG_SCHED_AUTOGROUP { .procname = "sched_autogroup_enabled",
Quoted 10 lines · On Wed, 23 Jan 2013 15:09:38 -0500 Steven Rostedt <[email protected]> wrote:
Quoted 8 lines · Clark Williams
Subject: [PATCH] sched: add a tuning knob to allow changing RR timeslice
User wanted a facility simliar to the ability on Solaris to adjust the
SCHED_RRtimeslice value. Add a/proc/sys/kernelscheduler knob namedsched_rr_timeslice_mswhich allows global changing of theSCHED_RRtimeslice value. User visable value is in milliseconds but is stored as jiffies. Setting to 0 (zero) resets to the default (currently 100ms).
Quoted 4 lines
Hmm, has this been ignored?
I guess the real question, is it still needed (or wanted)?
Yes, we've got a couple of customers that have been asking for it.
Quoted 113 lines
-- Steve
Quoted 109 lines
Patch against tip/master, currently 3.7-rc3.
Signed-off-by Clark Williams <[email protected]>--- include/linux/sched.h | 6 +++++- kernel/sched.c | 19 +++++++++++++++++++ kernel/sched_rt.c | 4 ++-- kernel/sysctl.c | 8 ++++++++ 4 files changed, 34 insertions(+), 3 deletions(-)include/linux/sched.h +5
-1@@ -2097,11 +2097,15 @@ static inline unsigned int get_sysctl_timer_migration(void)#endif extern unsigned int sysctl_sched_rt_period;extern int sysctl_sched_rt_runtime; -int sched_rt_handler (struct ctl_table *table,int write,void __user *buffer,size_t *lenp,loff_t *ppos); +extern int sched_rr_timeslice; +extern int sched_rr_handler (struct ctl_table *table,int write, +void __user *buffer,size_t *lenp, +loff_t *ppos); +#ifdef CONFIG_SCHED_AUTOGROUP extern unsigned int sysctl_sched_autogroup_enabled;kernel/sched.c +19
-0@@ -120,6 +120,7 @@* Timeslices get refilled after they expire. */ #define DEF_TIMESLICE (100 * HZ / 1000) +int sched_rr_timeslice =DEF_TIMESLICE ;/* * single value that denotes runtime == period, ie unlimited time. @@ -9614,6 +9615,24 @@ static int sched_rt_global_constraints(void) }#endif /* CONFIG_RT_GROUP_SCHED */ +int sched_rr_handler (struct ctl_table *table,int write, +void __user *buffer,size_t *lenp, +loff_t *ppos) +{ +int ret; +static DEFINE_MUTEX (mutex); + +mutex_lock (&mutex); + ret =proc_dointvec (table, write, buffer, lenp, ppos); +/* make sure that internally we keep jiffies */ +/* also, writing zero resets timeslice to default */ +if (!ret && write) + sched_rr_timeslice = sched_rr_timeslice <=0 ? +DEF_TIMESLICE :msecs_to_jiffies (sched_rr_timeslice); +mutex_unlock (&mutex); +return ret; +} +int sched_rt_handler (struct ctl_table *table,int write,void __user *buffer,size_t *lenp,loff_t *ppos)kernel/sched_rt.c +2
-2@@ -1791,7 +1791,7 @@ static void task_tick_rt(struct rq *rq, struct task_struct *p, int queued)if (--p->rt.time_slice)return ; - p->rt.time_slice =DEF_TIMESLICE ; + p->rt.time_slice = sched_rr_timeslice;/* * Requeue to the end of queue if we are not the only element @@ -1819,7 +1819,7 @@ static unsigned int get_rr_interval_rt(struct rq *rq, struct task_struct *task)* Time slice is 0 for SCHED_FIFO tasks */ if (task->policy ==SCHED_RR ) -return DEF_TIMESLICE ; +return sched_rr_timeslice;else return 0 ; }kernel/sysctl.c +8
-0@@ -362,6 +362,14 @@ static struct ctl_table kern_table[] = { .mode = 0644, .proc_handler = sched_rt_handler, }, + { + .procname = "sched_rr_timeslice_ms", + .data = &sched_rr_timeslice, + .maxlen = sizeof(int), + .mode = 0644, + .proc_handler = sched_rr_handler, + }, + #ifdef CONFIG_SCHED_AUTOGROUP { .procname = "sched_autogroup_enabled",