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), |