diff options
Diffstat (limited to 'kernel/cpuset.c')
| -rw-r--r-- | kernel/cpuset.c | 45 |
1 files changed, 20 insertions, 25 deletions
diff --git a/kernel/cpuset.c b/kernel/cpuset.c index b5cb469d2545..ba401fab459f 100644 --- a/kernel/cpuset.c +++ b/kernel/cpuset.c | |||
| @@ -537,8 +537,7 @@ update_domain_attr_tree(struct sched_domain_attr *dattr, struct cpuset *c) | |||
| 537 | * element of the partition (one sched domain) to be passed to | 537 | * element of the partition (one sched domain) to be passed to |
| 538 | * partition_sched_domains(). | 538 | * partition_sched_domains(). |
| 539 | */ | 539 | */ |
| 540 | /* FIXME: see the FIXME in partition_sched_domains() */ | 540 | static int generate_sched_domains(cpumask_var_t **domains, |
| 541 | static int generate_sched_domains(struct cpumask **domains, | ||
| 542 | struct sched_domain_attr **attributes) | 541 | struct sched_domain_attr **attributes) |
| 543 | { | 542 | { |
| 544 | LIST_HEAD(q); /* queue of cpusets to be scanned */ | 543 | LIST_HEAD(q); /* queue of cpusets to be scanned */ |
| @@ -546,7 +545,7 @@ static int generate_sched_domains(struct cpumask **domains, | |||
| 546 | struct cpuset **csa; /* array of all cpuset ptrs */ | 545 | struct cpuset **csa; /* array of all cpuset ptrs */ |
| 547 | int csn; /* how many cpuset ptrs in csa so far */ | 546 | int csn; /* how many cpuset ptrs in csa so far */ |
| 548 | int i, j, k; /* indices for partition finding loops */ | 547 | int i, j, k; /* indices for partition finding loops */ |
| 549 | struct cpumask *doms; /* resulting partition; i.e. sched domains */ | 548 | cpumask_var_t *doms; /* resulting partition; i.e. sched domains */ |
| 550 | struct sched_domain_attr *dattr; /* attributes for custom domains */ | 549 | struct sched_domain_attr *dattr; /* attributes for custom domains */ |
| 551 | int ndoms = 0; /* number of sched domains in result */ | 550 | int ndoms = 0; /* number of sched domains in result */ |
| 552 | int nslot; /* next empty doms[] struct cpumask slot */ | 551 | int nslot; /* next empty doms[] struct cpumask slot */ |
| @@ -557,7 +556,8 @@ static int generate_sched_domains(struct cpumask **domains, | |||
| 557 | 556 | ||
| 558 | /* Special case for the 99% of systems with one, full, sched domain */ | 557 | /* Special case for the 99% of systems with one, full, sched domain */ |
| 559 | if (is_sched_load_balance(&top_cpuset)) { | 558 | if (is_sched_load_balance(&top_cpuset)) { |
| 560 | doms = kmalloc(cpumask_size(), GFP_KERNEL); | 559 | ndoms = 1; |
| 560 | doms = alloc_sched_domains(ndoms); | ||
| 561 | if (!doms) | 561 | if (!doms) |
| 562 | goto done; | 562 | goto done; |
| 563 | 563 | ||
| @@ -566,9 +566,8 @@ static int generate_sched_domains(struct cpumask **domains, | |||
| 566 | *dattr = SD_ATTR_INIT; | 566 | *dattr = SD_ATTR_INIT; |
| 567 | update_domain_attr_tree(dattr, &top_cpuset); | 567 | update_domain_attr_tree(dattr, &top_cpuset); |
| 568 | } | 568 | } |
| 569 | cpumask_copy(doms, top_cpuset.cpus_allowed); | 569 | cpumask_copy(doms[0], top_cpuset.cpus_allowed); |
| 570 | 570 | ||
| 571 | ndoms = 1; | ||
| 572 | goto done; | 571 | goto done; |
| 573 | } | 572 | } |
| 574 | 573 | ||
| @@ -636,7 +635,7 @@ restart: | |||
| 636 | * Now we know how many domains to create. | 635 | * Now we know how many domains to create. |
| 637 | * Convert <csn, csa> to <ndoms, doms> and populate cpu masks. | 636 | * Convert <csn, csa> to <ndoms, doms> and populate cpu masks. |
| 638 | */ | 637 | */ |
| 639 | doms = kmalloc(ndoms * cpumask_size(), GFP_KERNEL); | 638 | doms = alloc_sched_domains(ndoms); |
| 640 | if (!doms) | 639 | if (!doms) |
| 641 | goto done; | 640 | goto done; |
| 642 | 641 | ||
| @@ -656,7 +655,7 @@ restart: | |||
| 656 | continue; | 655 | continue; |
| 657 | } | 656 | } |
| 658 | 657 | ||
| 659 | dp = doms + nslot; | 658 | dp = doms[nslot]; |
| 660 | 659 | ||
| 661 | if (nslot == ndoms) { | 660 | if (nslot == ndoms) { |
| 662 | static int warnings = 10; | 661 | static int warnings = 10; |
| @@ -718,7 +717,7 @@ done: | |||
| 718 | static void do_rebuild_sched_domains(struct work_struct *unused) | 717 | static void do_rebuild_sched_domains(struct work_struct *unused) |
| 719 | { | 718 | { |
| 720 | struct sched_domain_attr *attr; | 719 | struct sched_domain_attr *attr; |
| 721 | struct cpumask *doms; | 720 | cpumask_var_t *doms; |
| 722 | int ndoms; | 721 | int ndoms; |
| 723 | 722 | ||
| 724 | get_online_cpus(); | 723 | get_online_cpus(); |
| @@ -738,7 +737,7 @@ static void do_rebuild_sched_domains(struct work_struct *unused) | |||
| 738 | { | 737 | { |
| 739 | } | 738 | } |
| 740 | 739 | ||
| 741 | static int generate_sched_domains(struct cpumask **domains, | 740 | static int generate_sched_domains(cpumask_var_t **domains, |
| 742 | struct sched_domain_attr **attributes) | 741 | struct sched_domain_attr **attributes) |
| 743 | { | 742 | { |
| 744 | *domains = NULL; | 743 | *domains = NULL; |
| @@ -873,7 +872,7 @@ static int update_cpumask(struct cpuset *cs, struct cpuset *trialcs, | |||
| 873 | if (retval < 0) | 872 | if (retval < 0) |
| 874 | return retval; | 873 | return retval; |
| 875 | 874 | ||
| 876 | if (!cpumask_subset(trialcs->cpus_allowed, cpu_online_mask)) | 875 | if (!cpumask_subset(trialcs->cpus_allowed, cpu_active_mask)) |
| 877 | return -EINVAL; | 876 | return -EINVAL; |
| 878 | } | 877 | } |
| 879 | retval = validate_change(cs, trialcs); | 878 | retval = validate_change(cs, trialcs); |
| @@ -2011,7 +2010,7 @@ static void scan_for_empty_cpusets(struct cpuset *root) | |||
| 2011 | } | 2010 | } |
| 2012 | 2011 | ||
| 2013 | /* Continue past cpusets with all cpus, mems online */ | 2012 | /* Continue past cpusets with all cpus, mems online */ |
| 2014 | if (cpumask_subset(cp->cpus_allowed, cpu_online_mask) && | 2013 | if (cpumask_subset(cp->cpus_allowed, cpu_active_mask) && |
| 2015 | nodes_subset(cp->mems_allowed, node_states[N_HIGH_MEMORY])) | 2014 | nodes_subset(cp->mems_allowed, node_states[N_HIGH_MEMORY])) |
| 2016 | continue; | 2015 | continue; |
| 2017 | 2016 | ||
| @@ -2020,7 +2019,7 @@ static void scan_for_empty_cpusets(struct cpuset *root) | |||
| 2020 | /* Remove offline cpus and mems from this cpuset. */ | 2019 | /* Remove offline cpus and mems from this cpuset. */ |
| 2021 | mutex_lock(&callback_mutex); | 2020 | mutex_lock(&callback_mutex); |
| 2022 | cpumask_and(cp->cpus_allowed, cp->cpus_allowed, | 2021 | cpumask_and(cp->cpus_allowed, cp->cpus_allowed, |
| 2023 | cpu_online_mask); | 2022 | cpu_active_mask); |
| 2024 | nodes_and(cp->mems_allowed, cp->mems_allowed, | 2023 | nodes_and(cp->mems_allowed, cp->mems_allowed, |
| 2025 | node_states[N_HIGH_MEMORY]); | 2024 | node_states[N_HIGH_MEMORY]); |
| 2026 | mutex_unlock(&callback_mutex); | 2025 | mutex_unlock(&callback_mutex); |
| @@ -2052,14 +2051,16 @@ static int cpuset_track_online_cpus(struct notifier_block *unused_nb, | |||
| 2052 | unsigned long phase, void *unused_cpu) | 2051 | unsigned long phase, void *unused_cpu) |
| 2053 | { | 2052 | { |
| 2054 | struct sched_domain_attr *attr; | 2053 | struct sched_domain_attr *attr; |
| 2055 | struct cpumask *doms; | 2054 | cpumask_var_t *doms; |
| 2056 | int ndoms; | 2055 | int ndoms; |
| 2057 | 2056 | ||
| 2058 | switch (phase) { | 2057 | switch (phase) { |
| 2059 | case CPU_ONLINE: | 2058 | case CPU_ONLINE: |
| 2060 | case CPU_ONLINE_FROZEN: | 2059 | case CPU_ONLINE_FROZEN: |
| 2061 | case CPU_DEAD: | 2060 | case CPU_DOWN_PREPARE: |
| 2062 | case CPU_DEAD_FROZEN: | 2061 | case CPU_DOWN_PREPARE_FROZEN: |
| 2062 | case CPU_DOWN_FAILED: | ||
| 2063 | case CPU_DOWN_FAILED_FROZEN: | ||
| 2063 | break; | 2064 | break; |
| 2064 | 2065 | ||
| 2065 | default: | 2066 | default: |
| @@ -2068,7 +2069,7 @@ static int cpuset_track_online_cpus(struct notifier_block *unused_nb, | |||
| 2068 | 2069 | ||
| 2069 | cgroup_lock(); | 2070 | cgroup_lock(); |
| 2070 | mutex_lock(&callback_mutex); | 2071 | mutex_lock(&callback_mutex); |
| 2071 | cpumask_copy(top_cpuset.cpus_allowed, cpu_online_mask); | 2072 | cpumask_copy(top_cpuset.cpus_allowed, cpu_active_mask); |
| 2072 | mutex_unlock(&callback_mutex); | 2073 | mutex_unlock(&callback_mutex); |
| 2073 | scan_for_empty_cpusets(&top_cpuset); | 2074 | scan_for_empty_cpusets(&top_cpuset); |
| 2074 | ndoms = generate_sched_domains(&doms, &attr); | 2075 | ndoms = generate_sched_domains(&doms, &attr); |
| @@ -2115,7 +2116,7 @@ static int cpuset_track_online_nodes(struct notifier_block *self, | |||
| 2115 | 2116 | ||
| 2116 | void __init cpuset_init_smp(void) | 2117 | void __init cpuset_init_smp(void) |
| 2117 | { | 2118 | { |
| 2118 | cpumask_copy(top_cpuset.cpus_allowed, cpu_online_mask); | 2119 | cpumask_copy(top_cpuset.cpus_allowed, cpu_active_mask); |
| 2119 | top_cpuset.mems_allowed = node_states[N_HIGH_MEMORY]; | 2120 | top_cpuset.mems_allowed = node_states[N_HIGH_MEMORY]; |
| 2120 | 2121 | ||
| 2121 | hotcpu_notifier(cpuset_track_online_cpus, 0); | 2122 | hotcpu_notifier(cpuset_track_online_cpus, 0); |
| @@ -2537,15 +2538,9 @@ const struct file_operations proc_cpuset_operations = { | |||
| 2537 | }; | 2538 | }; |
| 2538 | #endif /* CONFIG_PROC_PID_CPUSET */ | 2539 | #endif /* CONFIG_PROC_PID_CPUSET */ |
| 2539 | 2540 | ||
| 2540 | /* Display task cpus_allowed, mems_allowed in /proc/<pid>/status file. */ | 2541 | /* Display task mems_allowed in /proc/<pid>/status file. */ |
| 2541 | void cpuset_task_status_allowed(struct seq_file *m, struct task_struct *task) | 2542 | void cpuset_task_status_allowed(struct seq_file *m, struct task_struct *task) |
| 2542 | { | 2543 | { |
| 2543 | seq_printf(m, "Cpus_allowed:\t"); | ||
| 2544 | seq_cpumask(m, &task->cpus_allowed); | ||
| 2545 | seq_printf(m, "\n"); | ||
| 2546 | seq_printf(m, "Cpus_allowed_list:\t"); | ||
| 2547 | seq_cpumask_list(m, &task->cpus_allowed); | ||
| 2548 | seq_printf(m, "\n"); | ||
| 2549 | seq_printf(m, "Mems_allowed:\t"); | 2544 | seq_printf(m, "Mems_allowed:\t"); |
| 2550 | seq_nodemask(m, &task->mems_allowed); | 2545 | seq_nodemask(m, &task->mems_allowed); |
| 2551 | seq_printf(m, "\n"); | 2546 | seq_printf(m, "\n"); |
