|
@@ -622,6 +622,7 @@ static int generate_sched_domains(cpumask_var_t **domains,
|
|
|
int csn; /* how many cpuset ptrs in csa so far */
|
|
|
int i, j, k; /* indices for partition finding loops */
|
|
|
cpumask_var_t *doms; /* resulting partition; i.e. sched domains */
|
|
|
+ cpumask_var_t non_isolated_cpus; /* load balanced CPUs */
|
|
|
struct sched_domain_attr *dattr; /* attributes for custom domains */
|
|
|
int ndoms = 0; /* number of sched domains in result */
|
|
|
int nslot; /* next empty doms[] struct cpumask slot */
|
|
@@ -631,6 +632,10 @@ static int generate_sched_domains(cpumask_var_t **domains,
|
|
|
dattr = NULL;
|
|
|
csa = NULL;
|
|
|
|
|
|
+ if (!alloc_cpumask_var(&non_isolated_cpus, GFP_KERNEL))
|
|
|
+ goto done;
|
|
|
+ cpumask_andnot(non_isolated_cpus, cpu_possible_mask, cpu_isolated_map);
|
|
|
+
|
|
|
/* Special case for the 99% of systems with one, full, sched domain */
|
|
|
if (is_sched_load_balance(&top_cpuset)) {
|
|
|
ndoms = 1;
|
|
@@ -643,7 +648,8 @@ static int generate_sched_domains(cpumask_var_t **domains,
|
|
|
*dattr = SD_ATTR_INIT;
|
|
|
update_domain_attr_tree(dattr, &top_cpuset);
|
|
|
}
|
|
|
- cpumask_copy(doms[0], top_cpuset.effective_cpus);
|
|
|
+ cpumask_and(doms[0], top_cpuset.effective_cpus,
|
|
|
+ non_isolated_cpus);
|
|
|
|
|
|
goto done;
|
|
|
}
|
|
@@ -666,7 +672,8 @@ static int generate_sched_domains(cpumask_var_t **domains,
|
|
|
* the corresponding sched domain.
|
|
|
*/
|
|
|
if (!cpumask_empty(cp->cpus_allowed) &&
|
|
|
- !is_sched_load_balance(cp))
|
|
|
+ !(is_sched_load_balance(cp) &&
|
|
|
+ cpumask_intersects(cp->cpus_allowed, non_isolated_cpus)))
|
|
|
continue;
|
|
|
|
|
|
if (is_sched_load_balance(cp))
|
|
@@ -748,6 +755,7 @@ restart:
|
|
|
|
|
|
if (apn == b->pn) {
|
|
|
cpumask_or(dp, dp, b->effective_cpus);
|
|
|
+ cpumask_and(dp, dp, non_isolated_cpus);
|
|
|
if (dattr)
|
|
|
update_domain_attr_tree(dattr + nslot, b);
|
|
|
|
|
@@ -760,6 +768,7 @@ restart:
|
|
|
BUG_ON(nslot != ndoms);
|
|
|
|
|
|
done:
|
|
|
+ free_cpumask_var(non_isolated_cpus);
|
|
|
kfree(csa);
|
|
|
|
|
|
/*
|