|
@@ -6877,15 +6877,17 @@ cpu_attach_domain(struct sched_domain *sd, struct root_domain *rd, int cpu)
|
|
|
struct sched_domain *tmp;
|
|
|
|
|
|
/* Remove the sched domains which do not contribute to scheduling. */
|
|
|
- for (tmp = sd; tmp; tmp = tmp->parent) {
|
|
|
+ for (tmp = sd; tmp; ) {
|
|
|
struct sched_domain *parent = tmp->parent;
|
|
|
if (!parent)
|
|
|
break;
|
|
|
+
|
|
|
if (sd_parent_degenerate(tmp, parent)) {
|
|
|
tmp->parent = parent->parent;
|
|
|
if (parent->parent)
|
|
|
parent->parent->child = tmp;
|
|
|
- }
|
|
|
+ } else
|
|
|
+ tmp = tmp->parent;
|
|
|
}
|
|
|
|
|
|
if (sd && sd_degenerate(sd)) {
|
|
@@ -7674,6 +7676,7 @@ static int __build_sched_domains(const cpumask_t *cpu_map,
|
|
|
error:
|
|
|
free_sched_groups(cpu_map, tmpmask);
|
|
|
SCHED_CPUMASK_FREE((void *)allmasks);
|
|
|
+ kfree(rd);
|
|
|
return -ENOMEM;
|
|
|
#endif
|
|
|
}
|