aboutsummaryrefslogtreecommitdiffstats
path: root/kernel
diff options
context:
space:
mode:
Diffstat (limited to 'kernel')
-rw-r--r--kernel/cpuset.c10
-rw-r--r--kernel/rcupreempt.c2
-rw-r--r--kernel/sched.c34
-rw-r--r--kernel/sched_rt.c63
-rw-r--r--kernel/sched_stats.h6
-rw-r--r--kernel/softlockup.c15
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
1038static int update_relax_domain_level(struct cpuset *cs, s64 val) 1038static 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}
218EXPORT_SYMBOL_GPL(rcu_batches_completed); 218EXPORT_SYMBOL_GPL(rcu_batches_completed);
219 219
220EXPORT_SYMBOL_GPL(rcu_batches_completed_bh);
221
222void __rcu_read_lock(void) 220void __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
1149static void hotplug_hrtick_disable(int cpu) 1150static 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
1205static void init_rq_hrtick(struct rq *rq) 1207static void init_rq_hrtick(struct rq *rq)
1206{ 1208{
@@ -6928,7 +6930,12 @@ static int default_relax_domain_level = -1;
6928 6930
6929static int __init setup_relax_domain_level(char *str) 6931static 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 */
7300static 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
8400static int __rt_schedulable(struct task_group *tg, u64 period, u64 runtime) 8428static 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
452static void enqueue_rt_entity(struct sched_rt_entity *rt_se) 452static 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
467static void dequeue_rt_entity(struct sched_rt_entity *rt_se) 473static void __dequeue_rt_entity(struct sched_rt_entity *rt_se)