diff options
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/cpuset.c | 10 | ||||
| -rw-r--r-- | kernel/rcupreempt.c | 2 | ||||
| -rw-r--r-- | kernel/sched.c | 34 | ||||
| -rw-r--r-- | kernel/sched_rt.c | 63 | ||||
| -rw-r--r-- | kernel/sched_stats.h | 6 | ||||
| -rw-r--r-- | kernel/softlockup.c | 15 |
6 files changed, 91 insertions, 39 deletions
diff --git a/kernel/cpuset.c b/kernel/cpuset.c index 039baa4cd90c..9fceb97e989c 100644 --- a/kernel/cpuset.c +++ b/kernel/cpuset.c | |||
| @@ -1037,8 +1037,8 @@ int current_cpuset_is_being_rebound(void) | |||
| 1037 | 1037 | ||
| 1038 | static int update_relax_domain_level(struct cpuset *cs, s64 val) | 1038 | static int update_relax_domain_level(struct cpuset *cs, s64 val) |
| 1039 | { | 1039 | { |
| 1040 | if ((int)val < 0) | 1040 | if (val < -1 || val >= SD_LV_MAX) |
| 1041 | val = -1; | 1041 | return -EINVAL; |
| 1042 | 1042 | ||
| 1043 | if (val != cs->relax_domain_level) { | 1043 | if (val != cs->relax_domain_level) { |
| 1044 | cs->relax_domain_level = val; | 1044 | cs->relax_domain_level = val; |
| @@ -1890,6 +1890,12 @@ static void common_cpu_mem_hotplug_unplug(void) | |||
| 1890 | top_cpuset.mems_allowed = node_states[N_HIGH_MEMORY]; | 1890 | top_cpuset.mems_allowed = node_states[N_HIGH_MEMORY]; |
| 1891 | scan_for_empty_cpusets(&top_cpuset); | 1891 | scan_for_empty_cpusets(&top_cpuset); |
| 1892 | 1892 | ||
| 1893 | /* | ||
| 1894 | * Scheduler destroys domains on hotplug events. | ||
| 1895 | * Rebuild them based on the current settings. | ||
| 1896 | */ | ||
| 1897 | rebuild_sched_domains(); | ||
| 1898 | |||
| 1893 | cgroup_unlock(); | 1899 | cgroup_unlock(); |
| 1894 | } | 1900 | } |
| 1895 | 1901 | ||
diff --git a/kernel/rcupreempt.c b/kernel/rcupreempt.c index e1cdf196a515..5e02b7740702 100644 --- a/kernel/rcupreempt.c +++ b/kernel/rcupreempt.c | |||
| @@ -217,8 +217,6 @@ long rcu_batches_completed(void) | |||
| 217 | } | 217 | } |
| 218 | EXPORT_SYMBOL_GPL(rcu_batches_completed); | 218 | EXPORT_SYMBOL_GPL(rcu_batches_completed); |
| 219 | 219 | ||
| 220 | EXPORT_SYMBOL_GPL(rcu_batches_completed_bh); | ||
| 221 | |||
| 222 | void __rcu_read_lock(void) | 220 | void __rcu_read_lock(void) |
| 223 | { | 221 | { |
| 224 | int idx; | 222 | int idx; |
diff --git a/kernel/sched.c b/kernel/sched.c index 96fbbbf3722c..27eaa47d438a 100644 --- a/kernel/sched.c +++ b/kernel/sched.c | |||
| @@ -1146,6 +1146,7 @@ static enum hrtimer_restart hrtick(struct hrtimer *timer) | |||
| 1146 | return HRTIMER_NORESTART; | 1146 | return HRTIMER_NORESTART; |
| 1147 | } | 1147 | } |
| 1148 | 1148 | ||
| 1149 | #ifdef CONFIG_SMP | ||
| 1149 | static void hotplug_hrtick_disable(int cpu) | 1150 | static void hotplug_hrtick_disable(int cpu) |
| 1150 | { | 1151 | { |
| 1151 | struct rq *rq = cpu_rq(cpu); | 1152 | struct rq *rq = cpu_rq(cpu); |
| @@ -1201,6 +1202,7 @@ static void init_hrtick(void) | |||
| 1201 | { | 1202 | { |
| 1202 | hotcpu_notifier(hotplug_hrtick, 0); | 1203 | hotcpu_notifier(hotplug_hrtick, 0); |
| 1203 | } | 1204 | } |
| 1205 | #endif /* CONFIG_SMP */ | ||
| 1204 | 1206 | ||
| 1205 | static void init_rq_hrtick(struct rq *rq) | 1207 | static void init_rq_hrtick(struct rq *rq) |
| 1206 | { | 1208 | { |
| @@ -6928,7 +6930,12 @@ static int default_relax_domain_level = -1; | |||
| 6928 | 6930 | ||
| 6929 | static int __init setup_relax_domain_level(char *str) | 6931 | static int __init setup_relax_domain_level(char *str) |
| 6930 | { | 6932 | { |
| 6931 | default_relax_domain_level = simple_strtoul(str, NULL, 0); | 6933 | unsigned long val; |
| 6934 | |||
| 6935 | val = simple_strtoul(str, NULL, 0); | ||
| 6936 | if (val < SD_LV_MAX) | ||
| 6937 | default_relax_domain_level = val; | ||
| 6938 | |||
| 6932 | return 1; | 6939 | return 1; |
| 6933 | } | 6940 | } |
| 6934 | __setup("relax_domain_level=", setup_relax_domain_level); | 6941 | __setup("relax_domain_level=", setup_relax_domain_level); |
| @@ -7287,6 +7294,18 @@ void __attribute__((weak)) arch_update_cpu_topology(void) | |||
| 7287 | } | 7294 | } |
| 7288 | 7295 | ||
| 7289 | /* | 7296 | /* |
| 7297 | * Free current domain masks. | ||
| 7298 | * Called after all cpus are attached to NULL domain. | ||
| 7299 | */ | ||
| 7300 | static void free_sched_domains(void) | ||
| 7301 | { | ||
| 7302 | ndoms_cur = 0; | ||
| 7303 | if (doms_cur != &fallback_doms) | ||
| 7304 | kfree(doms_cur); | ||
| 7305 | doms_cur = &fallback_doms; | ||
| 7306 | } | ||
| 7307 | |||
| 7308 | /* | ||
| 7290 | * Set up scheduler domains and groups. Callers must hold the hotplug lock. | 7309 | * Set up scheduler domains and groups. Callers must hold the hotplug lock. |
| 7291 | * For now this just excludes isolated cpus, but could be used to | 7310 | * For now this just excludes isolated cpus, but could be used to |
| 7292 | * exclude other special cases in the future. | 7311 | * exclude other special cases in the future. |
| @@ -7433,6 +7452,7 @@ int arch_reinit_sched_domains(void) | |||
| 7433 | get_online_cpus(); | 7452 | get_online_cpus(); |
| 7434 | mutex_lock(&sched_domains_mutex); | 7453 | mutex_lock(&sched_domains_mutex); |
| 7435 | detach_destroy_domains(&cpu_online_map); | 7454 | detach_destroy_domains(&cpu_online_map); |
| 7455 | free_sched_domains(); | ||
| 7436 | err = arch_init_sched_domains(&cpu_online_map); | 7456 | err = arch_init_sched_domains(&cpu_online_map); |
| 7437 | mutex_unlock(&sched_domains_mutex); | 7457 | mutex_unlock(&sched_domains_mutex); |
| 7438 | put_online_cpus(); | 7458 | put_online_cpus(); |
| @@ -7518,6 +7538,7 @@ static int update_sched_domains(struct notifier_block *nfb, | |||
| 7518 | case CPU_DOWN_PREPARE: | 7538 | case CPU_DOWN_PREPARE: |
| 7519 | case CPU_DOWN_PREPARE_FROZEN: | 7539 | case CPU_DOWN_PREPARE_FROZEN: |
| 7520 | detach_destroy_domains(&cpu_online_map); | 7540 | detach_destroy_domains(&cpu_online_map); |
| 7541 | free_sched_domains(); | ||
| 7521 | return NOTIFY_OK; | 7542 | return NOTIFY_OK; |
| 7522 | 7543 | ||
| 7523 | case CPU_UP_CANCELED: | 7544 | case CPU_UP_CANCELED: |
| @@ -7536,8 +7557,16 @@ static int update_sched_domains(struct notifier_block *nfb, | |||
| 7536 | return NOTIFY_DONE; | 7557 | return NOTIFY_DONE; |
| 7537 | } | 7558 | } |
| 7538 | 7559 | ||
| 7560 | #ifndef CONFIG_CPUSETS | ||
| 7561 | /* | ||
| 7562 | * Create default domain partitioning if cpusets are disabled. | ||
| 7563 | * Otherwise we let cpusets rebuild the domains based on the | ||
| 7564 | * current setup. | ||
| 7565 | */ | ||
| 7566 | |||
| 7539 | /* The hotplug lock is already held by cpu_up/cpu_down */ | 7567 | /* The hotplug lock is already held by cpu_up/cpu_down */ |
| 7540 | arch_init_sched_domains(&cpu_online_map); | 7568 | arch_init_sched_domains(&cpu_online_map); |
| 7569 | #endif | ||
| 7541 | 7570 | ||
| 7542 | return NOTIFY_OK; | 7571 | return NOTIFY_OK; |
| 7543 | } | 7572 | } |
| @@ -7677,7 +7706,6 @@ static void init_tg_rt_entry(struct task_group *tg, struct rt_rq *rt_rq, | |||
| 7677 | else | 7706 | else |
| 7678 | rt_se->rt_rq = parent->my_q; | 7707 | rt_se->rt_rq = parent->my_q; |
| 7679 | 7708 | ||
| 7680 | rt_se->rt_rq = &rq->rt; | ||
| 7681 | rt_se->my_q = rt_rq; | 7709 | rt_se->my_q = rt_rq; |
| 7682 | rt_se->parent = parent; | 7710 | rt_se->parent = parent; |
| 7683 | INIT_LIST_HEAD(&rt_se->run_list); | 7711 | INIT_LIST_HEAD(&rt_se->run_list); |
| @@ -8399,7 +8427,7 @@ static unsigned long to_ratio(u64 period, u64 runtime) | |||
| 8399 | #ifdef CONFIG_CGROUP_SCHED | 8427 | #ifdef CONFIG_CGROUP_SCHED |
| 8400 | static int __rt_schedulable(struct task_group *tg, u64 period, u64 runtime) | 8428 | static int __rt_schedulable(struct task_group *tg, u64 period, u64 runtime) |
| 8401 | { | 8429 | { |
| 8402 | struct task_group *tgi, *parent = tg->parent; | 8430 | struct task_group *tgi, *parent = tg ? tg->parent : NULL; |
| 8403 | unsigned long total = 0; | 8431 | unsigned long total = 0; |
| 8404 | 8432 | ||
| 8405 | if (!parent) { | 8433 | if (!parent) { |
diff --git a/kernel/sched_rt.c b/kernel/sched_rt.c index 3432d573205d..1dad5bbb59b6 100644 --- a/kernel/sched_rt.c +++ b/kernel/sched_rt.c | |||
| @@ -449,13 +449,19 @@ void dec_rt_tasks(struct sched_rt_entity *rt_se, struct rt_rq *rt_rq) | |||
| 449 | #endif | 449 | #endif |
| 450 | } | 450 | } |
| 451 | 451 | ||
| 452 | static void enqueue_rt_entity(struct sched_rt_entity *rt_se) | 452 | static void __enqueue_rt_entity(struct sched_rt_entity *rt_se) |
| 453 | { | 453 | { |
| 454 | struct rt_rq *rt_rq = rt_rq_of_se(rt_se); | 454 | struct rt_rq *rt_rq = rt_rq_of_se(rt_se); |
| 455 | struct rt_prio_array *array = &rt_rq->active; | 455 | struct rt_prio_array *array = &rt_rq->active; |
| 456 | struct rt_rq *group_rq = group_rt_rq(rt_se); | 456 | struct rt_rq *group_rq = group_rt_rq(rt_se); |
| 457 | 457 | ||
| 458 | if (group_rq && rt_rq_throttled(group_rq)) | 458 | /* |
| 459 | * Don't enqueue the group if its throttled, or when empty. | ||
| 460 | * The latter is a consequence of the former when a child group | ||
| 461 | * get throttled and the current group doesn't have any other | ||
| 462 | * active members. | ||
| 463 | */ | ||
| 464 | if (group_rq && (rt_rq_throttled(group_rq) || !group_rq->rt_nr_running)) | ||
| 459 | return; | 465 | return; |
| 460 | 466 | ||
| 461 | list_add_tail(&rt_se->run_list, array->queue + rt_se_prio(rt_se)); | 467 | list_add_tail(&rt_se->run_list, array->queue + rt_se_prio(rt_se)); |
| @@ -464,7 +470,7 @@ static void enqueue_rt_entity(struct sched_rt_entity *rt_se) | |||
| 464 | inc_rt_tasks(rt_se, rt_rq); | 470 | inc_rt_tasks(rt_se, rt_rq); |
| 465 | } | 471 | } |
| 466 | 472 | ||
| 467 | static void dequeue_rt_entity(struct sched_rt_entity *rt_se) | 473 | static void __dequeue_rt_entity(struct sched_rt_entity *rt_se) |
