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 | /* |
