aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--kernel/sched.c28
-rw-r--r--kernel/sched_fair.c18
2 files changed, 37 insertions, 9 deletions
diff --git a/kernel/sched.c b/kernel/sched.c
index 3f6bd1112900..69cae271c63b 100644
--- a/kernel/sched.c
+++ b/kernel/sched.c
@@ -4992,6 +4992,32 @@ void __cpuinit init_idle(struct task_struct *idle, int cpu)
4992 */ 4992 */
4993cpumask_t nohz_cpu_mask = CPU_MASK_NONE; 4993cpumask_t nohz_cpu_mask = CPU_MASK_NONE;
4994 4994
4995/*
4996 * Increase the granularity value when there are more CPUs,
4997 * because with more CPUs the 'effective latency' as visible
4998 * to users decreases. But the relationship is not linear,
4999 * so pick a second-best guess by going with the log2 of the
5000 * number of CPUs.
5001 *
5002 * This idea comes from the SD scheduler of Con Kolivas:
5003 */
5004static inline void sched_init_granularity(void)
5005{
5006 unsigned int factor = 1 + ilog2(num_online_cpus());
5007 const unsigned long limit = 200000000;
5008
5009 sysctl_sched_min_granularity *= factor;
5010 if (sysctl_sched_min_granularity > limit)
5011 sysctl_sched_min_granularity = limit;
5012
5013 sysctl_sched_latency *= factor;
5014 if (sysctl_sched_latency > limit)
5015 sysctl_sched_latency = limit;
5016
5017 sysctl_sched_wakeup_granularity *= factor;
5018 sysctl_sched_batch_wakeup_granularity *= factor;
5019}
5020
4995#ifdef CONFIG_SMP 5021#ifdef CONFIG_SMP
4996/* 5022/*
4997 * This is how migration works: 5023 * This is how migration works:
@@ -6688,10 +6714,12 @@ void __init sched_init_smp(void)
6688 /* Move init over to a non-isolated CPU */ 6714 /* Move init over to a non-isolated CPU */
6689 if (set_cpus_allowed(current, non_isolated_cpus) < 0) 6715 if (set_cpus_allowed(current, non_isolated_cpus) < 0)
6690 BUG(); 6716 BUG();
6717 sched_init_granularity();
6691} 6718}
6692#else 6719#else
6693void __init sched_init_smp(void) 6720void __init sched_init_smp(void)
6694{ 6721{
6722 sched_init_granularity();
6695} 6723}
6696#endif /* CONFIG_SMP */ 6724#endif /* CONFIG_SMP */
6697 6725
diff --git a/kernel/sched_fair.c b/kernel/sched_fair.c
index c495dcf7031b..7264814ba62a 100644
--- a/kernel/sched_fair.c
+++ b/kernel/sched_fair.c
@@ -22,7 +22,7 @@
22 22
23/* 23/*
24 * Targeted preemption latency for CPU-bound tasks: 24 * Targeted preemption latency for CPU-bound tasks:
25 * (default: 20ms, units: nanoseconds) 25 * (default: 20ms * ilog(ncpus), units: nanoseconds)
26 * 26 *
27 * NOTE: this latency value is not the same as the concept of 27 * NOTE: this latency value is not the same as the concept of
28 * 'timeslice length' - timeslices in CFS are of variable length 28 * 'timeslice length' - timeslices in CFS are of variable length
@@ -32,18 +32,18 @@
32 * (to see the precise effective timeslice length of your workload, 32 * (to see the precise effective timeslice length of your workload,
33 * run vmstat and monitor the context-switches (cs) field) 33 * run vmstat and monitor the context-switches (cs) field)
34 */ 34 */
35const_debug unsigned int sysctl_sched_latency = 20000000ULL; 35unsigned int sysctl_sched_latency = 20000000ULL;
36 36
37/* 37/*
38 * Minimal preemption granularity for CPU-bound tasks: 38 * Minimal preemption granularity for CPU-bound tasks:
39 * (default: 1 msec, units: nanoseconds) 39 * (default: 1 msec * ilog(ncpus), units: nanoseconds)
40 */ 40 */
41const_debug unsigned int sysctl_sched_min_granularity = 1000000ULL; 41unsigned int sysctl_sched_min_granularity = 1000000ULL;
42 42
43/* 43/*
44 * is kept at sysctl_sched_latency / sysctl_sched_min_granularity 44 * is kept at sysctl_sched_latency / sysctl_sched_min_granularity
45 */ 45 */
46const_debug unsigned int sched_nr_latency = 20; 46unsigned int sched_nr_latency = 20;
47 47
48/* 48/*
49 * After fork, child runs first. (default) If set to 0 then 49 * After fork, child runs first. (default) If set to 0 then
@@ -61,23 +61,23 @@ unsigned int __read_mostly sysctl_sched_compat_yield;
61 61
62/* 62/*
63 * SCHED_BATCH wake-up granularity. 63 * SCHED_BATCH wake-up granularity.
64 * (default: 10 msec, units: nanoseconds) 64 * (default: 10 msec * ilog(ncpus), units: nanoseconds)
65 * 65 *
66 * This option delays the preemption effects of decoupled workloads 66 * This option delays the preemption effects of decoupled workloads
67 * and reduces their over-scheduling. Synchronous workloads will still 67 * and reduces their over-scheduling. Synchronous workloads will still
68 * have immediate wakeup/sleep latencies. 68 * have immediate wakeup/sleep latencies.
69 */ 69 */
70const_debug unsigned int sysctl_sched_batch_wakeup_granularity = 10000000UL; 70unsigned int sysctl_sched_batch_wakeup_granularity = 10000000UL;
71 71
72/* 72/*
73 * SCHED_OTHER wake-up granularity. 73 * SCHED_OTHER wake-up granularity.
74 * (default: 10 msec, units: nanoseconds) 74 * (default: 10 msec * ilog(ncpus), units: nanoseconds)
75 * 75 *
76 * This option delays the preemption effects of decoupled workloads 76 * This option delays the preemption effects of decoupled workloads
77 * and reduces their over-scheduling. Synchronous workloads will still 77 * and reduces their over-scheduling. Synchronous workloads will still
78 * have immediate wakeup/sleep latencies. 78 * have immediate wakeup/sleep latencies.
79 */ 79 */
80const_debug unsigned int sysctl_sched_wakeup_granularity = 10000000UL; 80unsigned int sysctl_sched_wakeup_granularity = 10000000UL;
81 81
82const_debug unsigned int sysctl_sched_migration_cost = 500000UL; 82const_debug unsigned int sysctl_sched_migration_cost = 500000UL;
83 83