diff options
Diffstat (limited to 'kernel/cpuset.c')
| -rw-r--r-- | kernel/cpuset.c | 31 |
1 files changed, 16 insertions, 15 deletions
diff --git a/kernel/cpuset.c b/kernel/cpuset.c index fc7f4748d34a..ee14e3a35a29 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 | /* |
| @@ -2444,20 +2453,12 @@ static struct cpuset *nearest_hardwall_ancestor(struct cpuset *cs) | |||
| 2444 | * @node: is this an allowed node? | 2453 | * @node: is this an allowed node? |
| 2445 | * @gfp_mask: memory allocation flags | 2454 | * @gfp_mask: memory allocation flags |
| 2446 | * | 2455 | * |
| 2447 | * If we're in interrupt, yes, we can always allocate. If __GFP_THISNODE is | 2456 | * If we're in interrupt, yes, we can always allocate. If @node is set in |
| 2448 | * set, yes, we can always allocate. If node is in our task's mems_allowed, | 2457 | * current's mems_allowed, yes. If it's not a __GFP_HARDWALL request and this |
| 2449 | * yes. If it's not a __GFP_HARDWALL request and this node is in the nearest | 2458 | * node is set in the nearest hardwalled cpuset ancestor to current's cpuset, |
| 2450 | * hardwalled cpuset ancestor to this task's cpuset, yes. If the task has been | 2459 | * yes. If current has access to memory reserves due to TIF_MEMDIE, yes. |
| 2451 | * OOM killed and has access to memory reserves as specified by the TIF_MEMDIE | ||
| 2452 | * flag, yes. | ||
| 2453 | * Otherwise, no. | 2460 | * Otherwise, no. |
| 2454 | * | 2461 | * |
| 2455 | * The __GFP_THISNODE placement logic is really handled elsewhere, | ||
| 2456 | * by forcibly using a zonelist starting at a specified node, and by | ||
| 2457 | * (in get_page_from_freelist()) refusing to consider the zones for | ||
| 2458 | * any node on the zonelist except the first. By the time any such | ||
| 2459 | * calls get to this routine, we should just shut up and say 'yes'. | ||
| 2460 | * | ||
| 2461 | * GFP_USER allocations are marked with the __GFP_HARDWALL bit, | 2462 | * GFP_USER allocations are marked with the __GFP_HARDWALL bit, |
| 2462 | * and do not allow allocations outside the current tasks cpuset | 2463 | * and do not allow allocations outside the current tasks cpuset |
| 2463 | * unless the task has been OOM killed as is marked TIF_MEMDIE. | 2464 | * unless the task has been OOM killed as is marked TIF_MEMDIE. |
| @@ -2493,7 +2494,7 @@ int __cpuset_node_allowed(int node, gfp_t gfp_mask) | |||
| 2493 | int allowed; /* is allocation in zone z allowed? */ | 2494 | int allowed; /* is allocation in zone z allowed? */ |
| 2494 | unsigned long flags; | 2495 | unsigned long flags; |
| 2495 | 2496 | ||
| 2496 | if (in_interrupt() || (gfp_mask & __GFP_THISNODE)) | 2497 | if (in_interrupt()) |
| 2497 | return 1; | 2498 | return 1; |
| 2498 | if (node_isset(node, current->mems_allowed)) | 2499 | if (node_isset(node, current->mems_allowed)) |
| 2499 | return 1; | 2500 | return 1; |
