diff options
-rw-r--r-- | kernel/cpuset.c | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/kernel/cpuset.c b/kernel/cpuset.c index fc7f4748d34a..c68f0721df10 100644 --- a/kernel/cpuset.c +++ b/kernel/cpuset.c | |||
@@ -622,6 +622,7 @@ static int generate_sched_domains(cpumask_var_t **domains, | |||
622 | int csn; /* how many cpuset ptrs in csa so far */ | 622 | int csn; /* how many cpuset ptrs in csa so far */ |
623 | int i, j, k; /* indices for partition finding loops */ | 623 | int i, j, k; /* indices for partition finding loops */ |
624 | cpumask_var_t *doms; /* resulting partition; i.e. sched domains */ | 624 | cpumask_var_t *doms; /* resulting partition; i.e. sched domains */ |
625 | cpumask_var_t non_isolated_cpus; /* load balanced CPUs */ | ||
625 | struct sched_domain_attr *dattr; /* attributes for custom domains */ | 626 | struct sched_domain_attr *dattr; /* attributes for custom domains */ |
626 | int ndoms = 0; /* number of sched domains in result */ | 627 | int ndoms = 0; /* number of sched domains in result */ |
627 | int nslot; /* next empty doms[] struct cpumask slot */ | 628 | int nslot; /* next empty doms[] struct cpumask slot */ |
@@ -631,6 +632,10 @@ static int generate_sched_domains(cpumask_var_t **domains, | |||
631 | dattr = NULL; | 632 | dattr = NULL; |
632 | csa = NULL; | 633 | csa = NULL; |
633 | 634 | ||
635 | if (!alloc_cpumask_var(&non_isolated_cpus, GFP_KERNEL)) | ||
636 | goto done; | ||
637 | cpumask_andnot(non_isolated_cpus, cpu_possible_mask, cpu_isolated_map); | ||
638 | |||
634 | /* Special case for the 99% of systems with one, full, sched domain */ | 639 | /* Special case for the 99% of systems with one, full, sched domain */ |
635 | if (is_sched_load_balance(&top_cpuset)) { | 640 | if (is_sched_load_balance(&top_cpuset)) { |
636 | ndoms = 1; | 641 | ndoms = 1; |
@@ -643,7 +648,8 @@ static int generate_sched_domains(cpumask_var_t **domains, | |||
643 | *dattr = SD_ATTR_INIT; | 648 | *dattr = SD_ATTR_INIT; |
644 | update_domain_attr_tree(dattr, &top_cpuset); | 649 | update_domain_attr_tree(dattr, &top_cpuset); |
645 | } | 650 | } |
646 | cpumask_copy(doms[0], top_cpuset.effective_cpus); | 651 | cpumask_and(doms[0], top_cpuset.effective_cpus, |
652 | non_isolated_cpus); | ||
647 | 653 | ||
648 | goto done; | 654 | goto done; |
649 | } | 655 | } |
@@ -666,7 +672,8 @@ static int generate_sched_domains(cpumask_var_t **domains, | |||
666 | * the corresponding sched domain. | 672 | * the corresponding sched domain. |
667 | */ | 673 | */ |
668 | if (!cpumask_empty(cp->cpus_allowed) && | 674 | if (!cpumask_empty(cp->cpus_allowed) && |
669 | !is_sched_load_balance(cp)) | 675 | !(is_sched_load_balance(cp) && |
676 | cpumask_intersects(cp->cpus_allowed, non_isolated_cpus))) | ||
670 | continue; | 677 | continue; |
671 | 678 | ||
672 | if (is_sched_load_balance(cp)) | 679 | if (is_sched_load_balance(cp)) |
@@ -748,6 +755,7 @@ restart: | |||
748 | 755 | ||
749 | if (apn == b->pn) { | 756 | if (apn == b->pn) { |
750 | cpumask_or(dp, dp, b->effective_cpus); | 757 | cpumask_or(dp, dp, b->effective_cpus); |
758 | cpumask_and(dp, dp, non_isolated_cpus); | ||
751 | if (dattr) | 759 | if (dattr) |
752 | update_domain_attr_tree(dattr + nslot, b); | 760 | update_domain_attr_tree(dattr + nslot, b); |
753 | 761 | ||
@@ -760,6 +768,7 @@ restart: | |||
760 | BUG_ON(nslot != ndoms); | 768 | BUG_ON(nslot != ndoms); |
761 | 769 | ||
762 | done: | 770 | done: |
771 | free_cpumask_var(non_isolated_cpus); | ||
763 | kfree(csa); | 772 | kfree(csa); |
764 | 773 | ||
765 | /* | 774 | /* |