diff options
| author | Clark Williams <williams@redhat.com> | 2013-02-07 10:47:04 -0500 |
|---|---|---|
| committer | Ingo Molnar <mingo@kernel.org> | 2013-02-07 14:51:07 -0500 |
| commit | ce0dbbbb30aee6a835511d5be446462388ba9eee (patch) | |
| tree | c3d4d6f64a0fe7eec9283f4413d111a8d37d7053 | |
| parent | cf4aebc292fac7f34f8345664320e9d4a42ca76c (diff) | |
sched/rt: Add a tuning knob to allow changing SCHED_RR timeslice
Add a /proc/sys/kernel scheduler knob named
sched_rr_timeslice_ms that 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).
Signed-off-by: Clark Williams <williams@redhat.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Steven Rostedt <rostedt@goodmis.org>
Link: http://lkml.kernel.org/r/20130207094704.13751796@riff.lan
Signed-off-by: Ingo Molnar <mingo@kernel.org>
| -rw-r--r-- | include/linux/sched/sysctl.h | 15 | ||||
| -rw-r--r-- | kernel/sched/core.c | 19 | ||||
| -rw-r--r-- | kernel/sched/rt.c | 6 | ||||
| -rw-r--r-- | kernel/sysctl.c | 7 |
4 files changed, 44 insertions, 3 deletions
diff --git a/include/linux/sched/sysctl.h b/include/linux/sched/sysctl.h index bac914e458ca..d2bb0ae979d0 100644 --- a/include/linux/sched/sysctl.h +++ b/include/linux/sched/sysctl.h | |||
| @@ -73,6 +73,13 @@ static inline unsigned int get_sysctl_timer_migration(void) | |||
| 73 | return 1; | 73 | return 1; |
| 74 | } | 74 | } |
| 75 | #endif | 75 | #endif |
| 76 | |||
| 77 | /* | ||
| 78 | * control realtime throttling: | ||
| 79 | * | ||
| 80 | * /proc/sys/kernel/sched_rt_period_us | ||
| 81 | * /proc/sys/kernel/sched_rt_runtime_us | ||
| 82 | */ | ||
| 76 | extern unsigned int sysctl_sched_rt_period; | 83 | extern unsigned int sysctl_sched_rt_period; |
| 77 | extern int sysctl_sched_rt_runtime; | 84 | extern int sysctl_sched_rt_runtime; |
| 78 | 85 | ||
| @@ -90,7 +97,13 @@ extern unsigned int sysctl_sched_autogroup_enabled; | |||
| 90 | */ | 97 | */ |
| 91 | #define RR_TIMESLICE (100 * HZ / 1000) | 98 | #define RR_TIMESLICE (100 * HZ / 1000) |
| 92 | 99 | ||
| 93 | int sched_rt_handler(struct ctl_table *table, int write, | 100 | extern int sched_rr_timeslice; |
| 101 | |||
| 102 | extern int sched_rr_handler(struct ctl_table *table, int write, | ||
| 103 | void __user *buffer, size_t *lenp, | ||
| 104 | loff_t *ppos); | ||
| 105 | |||
| 106 | extern int sched_rt_handler(struct ctl_table *table, int write, | ||
| 94 | void __user *buffer, size_t *lenp, | 107 | void __user *buffer, size_t *lenp, |
| 95 | loff_t *ppos); | 108 | loff_t *ppos); |
| 96 | 109 | ||
diff --git a/kernel/sched/core.c b/kernel/sched/core.c index 1dff78a9e2ab..4a88f1d51563 100644 --- a/kernel/sched/core.c +++ b/kernel/sched/core.c | |||
| @@ -7509,6 +7509,25 @@ static int sched_rt_global_constraints(void) | |||
| 7509 | } | 7509 | } |
| 7510 | #endif /* CONFIG_RT_GROUP_SCHED */ | 7510 | #endif /* CONFIG_RT_GROUP_SCHED */ |
| 7511 | 7511 | ||
| 7512 | int sched_rr_handler(struct ctl_table *table, int write, | ||
| 7513 | void __user *buffer, size_t *lenp, | ||
| 7514 | loff_t *ppos) | ||
| 7515 | { | ||
| 7516 | int ret; | ||
| 7517 | static DEFINE_MUTEX(mutex); | ||
| 7518 | |||
| 7519 | mutex_lock(&mutex); | ||
| 7520 | ret = proc_dointvec(table, write, buffer, lenp, ppos); | ||
| 7521 | /* make sure that internally we keep jiffies */ | ||
| 7522 | /* also, writing zero resets timeslice to default */ | ||
| 7523 | if (!ret && write) { | ||
| 7524 | sched_rr_timeslice = sched_rr_timeslice <= 0 ? | ||
| 7525 | RR_TIMESLICE : msecs_to_jiffies(sched_rr_timeslice); | ||
| 7526 | } | ||
| 7527 | mutex_unlock(&mutex); | ||
| 7528 | return ret; | ||
| 7529 | } | ||
| 7530 | |||
| 7512 | int sched_rt_handler(struct ctl_table *table, int write, | 7531 | int sched_rt_handler(struct ctl_table *table, int write, |
| 7513 | void __user *buffer, size_t *lenp, | 7532 | void __user *buffer, size_t *lenp, |
| 7514 | loff_t *ppos) | 7533 | loff_t *ppos) |
diff --git a/kernel/sched/rt.c b/kernel/sched/rt.c index c25de141c576..fb0f77e402b6 100644 --- a/kernel/sched/rt.c +++ b/kernel/sched/rt.c | |||
| @@ -7,6 +7,8 @@ | |||
| 7 | 7 | ||
| 8 | #include <linux/slab.h> | 8 | #include <linux/slab.h> |
| 9 | 9 | ||
| 10 | int sched_rr_timeslice = RR_TIMESLICE; | ||
| 11 | |||
| 10 | static int do_sched_rt_period_timer(struct rt_bandwidth *rt_b, int overrun); | 12 | static int do_sched_rt_period_timer(struct rt_bandwidth *rt_b, int overrun); |
| 11 | 13 | ||
| 12 | struct rt_bandwidth def_rt_bandwidth; | 14 | struct rt_bandwidth def_rt_bandwidth; |
| @@ -2016,7 +2018,7 @@ static void task_tick_rt(struct rq *rq, struct task_struct *p, int queued) | |||
| 2016 | if (--p->rt.time_slice) | 2018 | if (--p->rt.time_slice) |
| 2017 | return; | 2019 | return; |
| 2018 | 2020 | ||
| 2019 | p->rt.time_slice = RR_TIMESLICE; | 2021 | p->rt.time_slice = sched_rr_timeslice; |
| 2020 | 2022 | ||
| 2021 | /* | 2023 | /* |
| 2022 | * Requeue to the end of queue if we (and all of our ancestors) are the | 2024 | * Requeue to the end of queue if we (and all of our ancestors) are the |
| @@ -2047,7 +2049,7 @@ static unsigned int get_rr_interval_rt(struct rq *rq, struct task_struct *task) | |||
| 2047 | * Time slice is 0 for SCHED_FIFO tasks | 2049 | * Time slice is 0 for SCHED_FIFO tasks |
| 2048 | */ | 2050 | */ |
| 2049 | if (task->policy == SCHED_RR) | 2051 | if (task->policy == SCHED_RR) |
| 2050 | return RR_TIMESLICE; | 2052 | return sched_rr_timeslice; |
| 2051 | else | 2053 | else |
| 2052 | return 0; | 2054 | return 0; |
| 2053 | } | 2055 | } |
diff --git a/kernel/sysctl.c b/kernel/sysctl.c index 7357e23aaf68..4fc9be955c71 100644 --- a/kernel/sysctl.c +++ b/kernel/sysctl.c | |||
| @@ -404,6 +404,13 @@ static struct ctl_table kern_table[] = { | |||
| 404 | .mode = 0644, | 404 | .mode = 0644, |
| 405 | .proc_handler = sched_rt_handler, | 405 | .proc_handler = sched_rt_handler, |
| 406 | }, | 406 | }, |
| 407 | { | ||
| 408 | .procname = "sched_rr_timeslice_ms", | ||
| 409 | .data = &sched_rr_timeslice, | ||
| 410 | .maxlen = sizeof(int), | ||
| 411 | .mode = 0644, | ||
| 412 | .proc_handler = sched_rr_handler, | ||
| 413 | }, | ||
| 407 | #ifdef CONFIG_SCHED_AUTOGROUP | 414 | #ifdef CONFIG_SCHED_AUTOGROUP |
| 408 | { | 415 | { |
| 409 | .procname = "sched_autogroup_enabled", | 416 | .procname = "sched_autogroup_enabled", |
