diff --git a/kernel/cgroup/cpuset.c b/kernel/cgroup/cpuset.c index 4116c983de3064e6c0b3c0cb2816d0644579ef1d..5e8bdb4593151220899d2f874839a16f65f755b4 100644 --- a/kernel/cgroup/cpuset.c +++ b/kernel/cgroup/cpuset.c @@ -997,6 +997,7 @@ static void rebuild_sched_domains_locked(void) cpumask_var_t *doms; struct cpuset *cs; int ndoms; + int i; lockdep_assert_cpus_held(); percpu_rwsem_assert_held(&cpuset_rwsem); @@ -1038,6 +1039,12 @@ static void rebuild_sched_domains_locked(void) /* Generate domain masks and attrs */ ndoms = generate_sched_domains(&doms, &attr); + /* guarantee no CPU offlining in doms */ + for (i = 0; i < ndoms; ++i) { + if (doms && !cpumask_subset(doms[i], cpu_active_mask)) + return; + } + /* Have scheduler rebuild the domains */ partition_and_rebuild_sched_domains(ndoms, doms, attr); }