diff options
| -rw-r--r-- | include/linux/sched.h | 11 | ||||
| -rw-r--r-- | kernel/sched.c | 15 | ||||
| -rw-r--r-- | kernel/sched_debug.c | 10 | ||||
| -rw-r--r-- | kernel/sched_fair.c | 13 | ||||
| -rw-r--r-- | kernel/sysctl.c | 14 |
5 files changed, 61 insertions, 2 deletions
diff --git a/include/linux/sched.h b/include/linux/sched.h index 4b1ebd3280c6..ee9f200d12d3 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h | |||
| @@ -1902,13 +1902,22 @@ extern unsigned int sysctl_sched_wakeup_granularity; | |||
| 1902 | extern unsigned int sysctl_sched_shares_ratelimit; | 1902 | extern unsigned int sysctl_sched_shares_ratelimit; |
| 1903 | extern unsigned int sysctl_sched_shares_thresh; | 1903 | extern unsigned int sysctl_sched_shares_thresh; |
| 1904 | extern unsigned int sysctl_sched_child_runs_first; | 1904 | extern unsigned int sysctl_sched_child_runs_first; |
| 1905 | |||
| 1906 | enum sched_tunable_scaling { | ||
| 1907 | SCHED_TUNABLESCALING_NONE, | ||
| 1908 | SCHED_TUNABLESCALING_LOG, | ||
| 1909 | SCHED_TUNABLESCALING_LINEAR, | ||
| 1910 | SCHED_TUNABLESCALING_END, | ||
| 1911 | }; | ||
| 1912 | extern enum sched_tunable_scaling sysctl_sched_tunable_scaling; | ||
| 1913 | |||
| 1905 | #ifdef CONFIG_SCHED_DEBUG | 1914 | #ifdef CONFIG_SCHED_DEBUG |
| 1906 | extern unsigned int sysctl_sched_migration_cost; | 1915 | extern unsigned int sysctl_sched_migration_cost; |
| 1907 | extern unsigned int sysctl_sched_nr_migrate; | 1916 | extern unsigned int sysctl_sched_nr_migrate; |
| 1908 | extern unsigned int sysctl_sched_time_avg; | 1917 | extern unsigned int sysctl_sched_time_avg; |
| 1909 | extern unsigned int sysctl_timer_migration; | 1918 | extern unsigned int sysctl_timer_migration; |
| 1910 | 1919 | ||
| 1911 | int sched_nr_latency_handler(struct ctl_table *table, int write, | 1920 | int sched_proc_update_handler(struct ctl_table *table, int write, |
| 1912 | void __user *buffer, size_t *length, | 1921 | void __user *buffer, size_t *length, |
| 1913 | loff_t *ppos); | 1922 | loff_t *ppos); |
| 1914 | #endif | 1923 | #endif |
diff --git a/kernel/sched.c b/kernel/sched.c index b54ecf84b6be..116efed962c6 100644 --- a/kernel/sched.c +++ b/kernel/sched.c | |||
| @@ -7033,7 +7033,20 @@ cpumask_var_t nohz_cpu_mask; | |||
| 7033 | static void update_sysctl(void) | 7033 | static void update_sysctl(void) |
| 7034 | { | 7034 | { |
| 7035 | unsigned int cpus = min(num_online_cpus(), 8U); | 7035 | unsigned int cpus = min(num_online_cpus(), 8U); |
| 7036 | unsigned int factor = 1 + ilog2(cpus); | 7036 | unsigned int factor; |
| 7037 | |||
| 7038 | switch (sysctl_sched_tunable_scaling) { | ||
| 7039 | case SCHED_TUNABLESCALING_NONE: | ||
| 7040 | factor = 1; | ||
| 7041 | break; | ||
| 7042 | case SCHED_TUNABLESCALING_LINEAR: | ||
| 7043 | factor = cpus; | ||
| 7044 | break; | ||
| 7045 | case SCHED_TUNABLESCALING_LOG: | ||
| 7046 | default: | ||
| 7047 | factor = 1 + ilog2(cpus); | ||
| 7048 | break; | ||
| 7049 | } | ||
| 7037 | 7050 | ||
| 7038 | #define SET_SYSCTL(name) \ | 7051 | #define SET_SYSCTL(name) \ |
| 7039 | (sysctl_##name = (factor) * normalized_sysctl_##name) | 7052 | (sysctl_##name = (factor) * normalized_sysctl_##name) |
diff --git a/kernel/sched_debug.c b/kernel/sched_debug.c index 5fda66615fee..0fc5287fe80f 100644 --- a/kernel/sched_debug.c +++ b/kernel/sched_debug.c | |||
| @@ -309,6 +309,12 @@ static void print_cpu(struct seq_file *m, int cpu) | |||
| 309 | print_rq(m, rq, cpu); | 309 | print_rq(m, rq, cpu); |
| 310 | } | 310 | } |
| 311 | 311 | ||
| 312 | static const char *sched_tunable_scaling_names[] = { | ||
| 313 | "none", | ||
| 314 | "logaritmic", | ||
| 315 | "linear" | ||
| 316 | }; | ||
| 317 | |||
| 312 | static int sched_debug_show(struct seq_file *m, void *v) | 318 | static int sched_debug_show(struct seq_file *m, void *v) |
| 313 | { | 319 | { |
| 314 | u64 now = ktime_to_ns(ktime_get()); | 320 | u64 now = ktime_to_ns(ktime_get()); |
| @@ -334,6 +340,10 @@ static int sched_debug_show(struct seq_file *m, void *v) | |||
| 334 | #undef PN | 340 | #undef PN |
| 335 | #undef P | 341 | #undef P |
| 336 | 342 | ||
| 343 | SEQ_printf(m, " .%-40s: %d (%s)\n", "sysctl_sched_tunable_scaling", | ||
| 344 | sysctl_sched_tunable_scaling, | ||
| 345 | sched_tunable_scaling_names[sysctl_sched_tunable_scaling]); | ||
| 346 | |||
| 337 | for_each_online_cpu(cpu) | 347 | for_each_online_cpu(cpu) |
| 338 | print_cpu(m, cpu); | 348 | print_cpu(m, cpu); |
| 339 | 349 | ||
diff --git a/kernel/sched_fair.c b/kernel/sched_fair.c index 71b3458245e5..455106d318a8 100644 --- a/kernel/sched_fair.c +++ b/kernel/sched_fair.c | |||
| @@ -21,6 +21,7 @@ | |||
| 21 | */ | 21 | */ |
| 22 | 22 | ||
| 23 | #include <linux/latencytop.h> | 23 | #include <linux/latencytop.h> |
| 24 | #include <linux/sched.h> | ||
| 24 | 25 | ||
| 25 | /* | 26 | /* |
| 26 | * Targeted preemption latency for CPU-bound tasks: | 27 | * Targeted preemption latency for CPU-bound tasks: |
| @@ -38,6 +39,18 @@ unsigned int sysctl_sched_latency = 5000000ULL; | |||
| 38 | unsigned int normalized_sysctl_sched_latency = 5000000ULL; | 39 | unsigned int normalized_sysctl_sched_latency = 5000000ULL; |
| 39 | 40 | ||
| 40 | /* | 41 | /* |
| 42 | * The initial- and re-scaling of tunables is configurable | ||
| 43 | * (default SCHED_TUNABLESCALING_LOG = *(1+ilog(ncpus)) | ||
| 44 | * | ||
| 45 | * Options are: | ||
| 46 | * SCHED_TUNABLESCALING_NONE - unscaled, always *1 | ||
| 47 | * SCHED_TUNABLESCALING_LOG - scaled logarithmical, *1+ilog(ncpus) | ||
| 48 | * SCHED_TUNABLESCALING_LINEAR - scaled linear, *ncpus | ||
| 49 | */ | ||
| 50 | enum sched_tunable_scaling sysctl_sched_tunable_scaling | ||
| 51 | = SCHED_TUNABLESCALING_LOG; | ||
| 52 | |||
| 53 | /* | ||
| 41 | * Minimal preemption granularity for CPU-bound tasks: | 54 | * Minimal preemption granularity for CPU-bound tasks: |
| 42 | * (default: 1 msec * (1 + ilog(ncpus)), units: nanoseconds) | 55 | * (default: 1 msec * (1 + ilog(ncpus)), units: nanoseconds) |
| 43 | */ | 56 | */ |
diff --git a/kernel/sysctl.c b/kernel/sysctl.c index e5cc53514caa..d10406e5fdfe 100644 --- a/kernel/sysctl.c +++ b/kernel/sysctl.c | |||
| @@ -251,6 +251,8 @@ static int min_sched_granularity_ns = 100000; /* 100 usecs */ | |||
| 251 | static int max_sched_granularity_ns = NSEC_PER_SEC; /* 1 second */ | 251 | static int max_sched_granularity_ns = NSEC_PER_SEC; /* 1 second */ |
| 252 | static int min_wakeup_granularity_ns; /* 0 usecs */ | 252 | static int min_wakeup_granularity_ns; /* 0 usecs */ |
| 253 | static int max_wakeup_granularity_ns = NSEC_PER_SEC; /* 1 second */ | 253 | static int max_wakeup_granularity_ns = NSEC_PER_SEC; /* 1 second */ |
| 254 | static int min_sched_tunable_scaling = SCHED_TUNABLESCALING_NONE; | ||
| 255 | static int max_sched_tunable_scaling = SCHED_TUNABLESCALING_END-1; | ||
| 254 | #endif | 256 | #endif |
| 255 | 257 | ||
| 256 | static struct ctl_table kern_table[] = { | 258 | static struct ctl_table kern_table[] = { |
| @@ -306,6 +308,18 @@ static struct ctl_table kern_table[] = { | |||
| 306 | }, | 308 | }, |
| 307 | { | 309 | { |
| 308 | .ctl_name = CTL_UNNUMBERED, | 310 | .ctl_name = CTL_UNNUMBERED, |
| 311 | .procname = "sched_tunable_scaling", | ||
| 312 | .data = &sysctl_sched_tunable_scaling, | ||
| 313 | .maxlen = sizeof(enum sched_tunable_scaling), | ||
| 314 | .mode = 0644, | ||
| 315 | .proc_handler = &proc_dointvec_minmax, | ||
| 316 | .strategy = &sysctl_intvec, | ||
| 317 | .extra1 = &min_sched_tunable_scaling, | ||
| 318 | .extra2 = &max_sched_tunable_scaling, | ||
| 319 | }, | ||
| 320 | |||
| 321 | { | ||
| 322 | .ctl_name = CTL_UNNUMBERED, | ||
| 309 | .procname = "sched_shares_thresh", | 323 | .procname = "sched_shares_thresh", |
| 310 | .data = &sysctl_sched_shares_thresh, | 324 | .data = &sysctl_sched_shares_thresh, |
| 311 | .maxlen = sizeof(unsigned int), | 325 | .maxlen = sizeof(unsigned int), |
