diff options
Diffstat (limited to 'kernel/sched.c')
| -rw-r--r-- | kernel/sched.c | 59 |
1 files changed, 44 insertions, 15 deletions
diff --git a/kernel/sched.c b/kernel/sched.c index 3f6bd1112900..b18f231a4875 100644 --- a/kernel/sched.c +++ b/kernel/sched.c | |||
| @@ -75,7 +75,7 @@ | |||
| 75 | */ | 75 | */ |
| 76 | unsigned long long __attribute__((weak)) sched_clock(void) | 76 | unsigned long long __attribute__((weak)) sched_clock(void) |
| 77 | { | 77 | { |
| 78 | return (unsigned long long)jiffies * (1000000000 / HZ); | 78 | return (unsigned long long)jiffies * (NSEC_PER_SEC / HZ); |
| 79 | } | 79 | } |
| 80 | 80 | ||
| 81 | /* | 81 | /* |
| @@ -99,8 +99,8 @@ unsigned long long __attribute__((weak)) sched_clock(void) | |||
| 99 | /* | 99 | /* |
| 100 | * Some helpers for converting nanosecond timing to jiffy resolution | 100 | * Some helpers for converting nanosecond timing to jiffy resolution |
| 101 | */ | 101 | */ |
| 102 | #define NS_TO_JIFFIES(TIME) ((unsigned long)(TIME) / (1000000000 / HZ)) | 102 | #define NS_TO_JIFFIES(TIME) ((unsigned long)(TIME) / (NSEC_PER_SEC / HZ)) |
| 103 | #define JIFFIES_TO_NS(TIME) ((TIME) * (1000000000 / HZ)) | 103 | #define JIFFIES_TO_NS(TIME) ((TIME) * (NSEC_PER_SEC / HZ)) |
| 104 | 104 | ||
| 105 | #define NICE_0_LOAD SCHED_LOAD_SCALE | 105 | #define NICE_0_LOAD SCHED_LOAD_SCALE |
| 106 | #define NICE_0_SHIFT SCHED_LOAD_SHIFT | 106 | #define NICE_0_SHIFT SCHED_LOAD_SHIFT |
| @@ -460,7 +460,6 @@ enum { | |||
| 460 | SCHED_FEAT_TREE_AVG = 4, | 460 | SCHED_FEAT_TREE_AVG = 4, |
| 461 | SCHED_FEAT_APPROX_AVG = 8, | 461 | SCHED_FEAT_APPROX_AVG = 8, |
| 462 | SCHED_FEAT_WAKEUP_PREEMPT = 16, | 462 | SCHED_FEAT_WAKEUP_PREEMPT = 16, |
| 463 | SCHED_FEAT_PREEMPT_RESTRICT = 32, | ||
| 464 | }; | 463 | }; |
| 465 | 464 | ||
| 466 | const_debug unsigned int sysctl_sched_features = | 465 | const_debug unsigned int sysctl_sched_features = |
| @@ -468,12 +467,17 @@ const_debug unsigned int sysctl_sched_features = | |||
| 468 | SCHED_FEAT_START_DEBIT * 1 | | 467 | SCHED_FEAT_START_DEBIT * 1 | |
| 469 | SCHED_FEAT_TREE_AVG * 0 | | 468 | SCHED_FEAT_TREE_AVG * 0 | |
| 470 | SCHED_FEAT_APPROX_AVG * 0 | | 469 | SCHED_FEAT_APPROX_AVG * 0 | |
| 471 | SCHED_FEAT_WAKEUP_PREEMPT * 1 | | 470 | SCHED_FEAT_WAKEUP_PREEMPT * 1; |
| 472 | SCHED_FEAT_PREEMPT_RESTRICT * 1; | ||
| 473 | 471 | ||
| 474 | #define sched_feat(x) (sysctl_sched_features & SCHED_FEAT_##x) | 472 | #define sched_feat(x) (sysctl_sched_features & SCHED_FEAT_##x) |
| 475 | 473 | ||
| 476 | /* | 474 | /* |
| 475 | * Number of tasks to iterate in a single balance run. | ||
| 476 | * Limited because this is done with IRQs disabled. | ||
| 477 | */ | ||
| 478 | const_debug unsigned int sysctl_sched_nr_migrate = 32; | ||
| 479 | |||
| 480 | /* | ||
| 477 | * For kernel-internal use: high-speed (but slightly incorrect) per-cpu | 481 | * For kernel-internal use: high-speed (but slightly incorrect) per-cpu |
| 478 | * clock constructed from sched_clock(): | 482 | * clock constructed from sched_clock(): |
| 479 | */ | 483 | */ |
| @@ -2237,7 +2241,7 @@ balance_tasks(struct rq *this_rq, int this_cpu, struct rq *busiest, | |||
| 2237 | enum cpu_idle_type idle, int *all_pinned, | 2241 | enum cpu_idle_type idle, int *all_pinned, |
| 2238 | int *this_best_prio, struct rq_iterator *iterator) | 2242 | int *this_best_prio, struct rq_iterator *iterator) |
| 2239 | { | 2243 | { |
| 2240 | int pulled = 0, pinned = 0, skip_for_load; | 2244 | int loops = 0, pulled = 0, pinned = 0, skip_for_load; |
| 2241 | struct task_struct *p; | 2245 | struct task_struct *p; |
| 2242 | long rem_load_move = max_load_move; | 2246 | long rem_load_move = max_load_move; |
| 2243 | 2247 | ||
| @@ -2251,10 +2255,10 @@ balance_tasks(struct rq *this_rq, int this_cpu, struct rq *busiest, | |||
| 2251 | */ | 2255 | */ |
| 2252 | p = iterator->start(iterator->arg); | 2256 | p = iterator->start(iterator->arg); |
| 2253 | next: | 2257 | next: |
| 2254 | if (!p) | 2258 | if (!p || loops++ > sysctl_sched_nr_migrate) |
| 2255 | goto out; | 2259 | goto out; |
| 2256 | /* | 2260 | /* |
| 2257 | * To help distribute high priority tasks accross CPUs we don't | 2261 | * To help distribute high priority tasks across CPUs we don't |
| 2258 | * skip a task if it will be the highest priority task (i.e. smallest | 2262 | * skip a task if it will be the highest priority task (i.e. smallest |
| 2259 | * prio value) on its new queue regardless of its load weight | 2263 | * prio value) on its new queue regardless of its load weight |
| 2260 | */ | 2264 | */ |
| @@ -2271,8 +2275,7 @@ next: | |||
| 2271 | rem_load_move -= p->se.load.weight; | 2275 | rem_load_move -= p->se.load.weight; |
| 2272 | 2276 | ||
| 2273 | /* | 2277 | /* |
| 2274 | * We only want to steal up to the prescribed number of tasks | 2278 | * We only want to steal up to the prescribed amount of weighted load. |
| 2275 | * and the prescribed amount of weighted load. | ||
| 2276 | */ | 2279 | */ |
| 2277 | if (rem_load_move > 0) { | 2280 | if (rem_load_move > 0) { |
| 2278 | if (p->prio < *this_best_prio) | 2281 | if (p->prio < *this_best_prio) |
| @@ -4992,6 +4995,32 @@ void __cpuinit init_idle(struct task_struct *idle, int cpu) | |||
| 4992 | */ | 4995 | */ |
| 4993 | cpumask_t nohz_cpu_mask = CPU_MASK_NONE; | 4996 | cpumask_t nohz_cpu_mask = CPU_MASK_NONE; |
| 4994 | 4997 | ||
| 4998 | /* | ||
| 4999 | * Increase the granularity value when there are more CPUs, | ||
| 5000 | * because with more CPUs the 'effective latency' as visible | ||
| 5001 | * to users decreases. But the relationship is not linear, | ||
| 5002 | * so pick a second-best guess by going with the log2 of the | ||
| 5003 | * number of CPUs. | ||
| 5004 | * | ||
| 5005 | * This idea comes from the SD scheduler of Con Kolivas: | ||
| 5006 | */ | ||
| 5007 | static inline void sched_init_granularity(void) | ||
| 5008 | { | ||
| 5009 | unsigned int factor = 1 + ilog2(num_online_cpus()); | ||
| 5010 | const unsigned long limit = 200000000; | ||
| 5011 | |||
| 5012 | sysctl_sched_min_granularity *= factor; | ||
| 5013 | if (sysctl_sched_min_granularity > limit) | ||
| 5014 | sysctl_sched_min_granularity = limit; | ||
| 5015 | |||
| 5016 | sysctl_sched_latency *= factor; | ||
| 5017 | if (sysctl_sched_latency > limit) | ||
| 5018 | sysctl_sched_latency = limit; | ||
| 5019 | |||
| 5020 | sysctl_sched_wakeup_granularity *= factor; | ||
| 5021 | sysctl_sched_batch_wakeup_granularity *= factor; | ||
| 5022 | } | ||
| 5023 | |||
| 4995 | #ifdef CONFIG_SMP | 5024 | #ifdef CONFIG_SMP |
| 4996 | /* | 5025 | /* |
| 4997 | * This is how migration works: | 5026 | * This is how migration works: |
| @@ -5621,7 +5650,7 @@ static struct notifier_block __cpuinitdata migration_notifier = { | |||
| 5621 | .priority = 10 | 5650 | .priority = 10 |
| 5622 | }; | 5651 | }; |
| 5623 | 5652 | ||
| 5624 | int __init migration_init(void) | 5653 | void __init migration_init(void) |
| 5625 | { | 5654 | { |
| 5626 | void *cpu = (void *)(long)smp_processor_id(); | 5655 | void *cpu = (void *)(long)smp_processor_id(); |
| 5627 | int err; | 5656 | int err; |
| @@ -5631,8 +5660,6 @@ int __init migration_init(void) | |||
| 5631 | BUG_ON(err == NOTIFY_BAD); | 5660 | BUG_ON(err == NOTIFY_BAD); |
| 5632 | migration_call(&migration_notifier, CPU_ONLINE, cpu); | 5661 | migration_call(&migration_notifier, CPU_ONLINE, cpu); |
| 5633 | register_cpu_notifier(&migration_notifier); | 5662 | register_cpu_notifier(&migration_notifier); |
| 5634 | |||
| 5635 | return 0; | ||
| 5636 | } | 5663 | } |
| 5637 | #endif | 5664 | #endif |
| 5638 | 5665 | ||
| @@ -6688,10 +6715,12 @@ void __init sched_init_smp(void) | |||
| 6688 | /* Move init over to a non-isolated CPU */ | 6715 | /* Move init over to a non-isolated CPU */ |
| 6689 | if (set_cpus_allowed(current, non_isolated_cpus) < 0) | 6716 | if (set_cpus_allowed(current, non_isolated_cpus) < 0) |
| 6690 | BUG(); | 6717 | BUG(); |
| 6718 | sched_init_granularity(); | ||
| 6691 | } | 6719 | } |
| 6692 | #else | 6720 | #else |
| 6693 | void __init sched_init_smp(void) | 6721 | void __init sched_init_smp(void) |
| 6694 | { | 6722 | { |
| 6723 | sched_init_granularity(); | ||
| 6695 | } | 6724 | } |
| 6696 | #endif /* CONFIG_SMP */ | 6725 | #endif /* CONFIG_SMP */ |
| 6697 | 6726 | ||
| @@ -7228,7 +7257,7 @@ static u64 cpu_usage_read(struct cgroup *cgrp, struct cftype *cft) | |||
| 7228 | spin_unlock_irqrestore(&cpu_rq(i)->lock, flags); | 7257 | spin_unlock_irqrestore(&cpu_rq(i)->lock, flags); |
| 7229 | } | 7258 | } |
| 7230 | /* Convert from ns to ms */ | 7259 | /* Convert from ns to ms */ |
| 7231 | do_div(res, 1000000); | 7260 | do_div(res, NSEC_PER_MSEC); |
| 7232 | 7261 | ||
| 7233 | return res; | 7262 | return res; |
| 7234 | } | 7263 | } |
