cpuset: Make generate_sched_domains() work with partition
The generate_sched_domains() function is modified to make it work correctly with the newly introduced subparts_cpus mask for scheduling domains generation. Signed-off-by: Waiman Long <longman@redhat.com> Acked-by: Peter Zijlstra (Intel) <peterz@infradead.org> Signed-off-by: Tejun Heo <tj@kernel.org>
This commit is contained in:
parent
4b842da276
commit
0ccea8feb9
@ -769,13 +769,14 @@ static int generate_sched_domains(cpumask_var_t **domains,
|
||||
int ndoms = 0; /* number of sched domains in result */
|
||||
int nslot; /* next empty doms[] struct cpumask slot */
|
||||
struct cgroup_subsys_state *pos_css;
|
||||
bool root_load_balance = is_sched_load_balance(&top_cpuset);
|
||||
|
||||
doms = NULL;
|
||||
dattr = NULL;
|
||||
csa = NULL;
|
||||
|
||||
/* Special case for the 99% of systems with one, full, sched domain */
|
||||
if (is_sched_load_balance(&top_cpuset)) {
|
||||
if (root_load_balance && !top_cpuset.nr_subparts_cpus) {
|
||||
ndoms = 1;
|
||||
doms = alloc_sched_domains(ndoms);
|
||||
if (!doms)
|
||||
@ -798,6 +799,8 @@ static int generate_sched_domains(cpumask_var_t **domains,
|
||||
csn = 0;
|
||||
|
||||
rcu_read_lock();
|
||||
if (root_load_balance)
|
||||
csa[csn++] = &top_cpuset;
|
||||
cpuset_for_each_descendant_pre(cp, pos_css, &top_cpuset) {
|
||||
if (cp == &top_cpuset)
|
||||
continue;
|
||||
@ -808,6 +811,9 @@ static int generate_sched_domains(cpumask_var_t **domains,
|
||||
* parent's cpus, so just skip them, and then we call
|
||||
* update_domain_attr_tree() to calc relax_domain_level of
|
||||
* the corresponding sched domain.
|
||||
*
|
||||
* If root is load-balancing, we can skip @cp if it
|
||||
* is a subset of the root's effective_cpus.
|
||||
*/
|
||||
if (!cpumask_empty(cp->cpus_allowed) &&
|
||||
!(is_sched_load_balance(cp) &&
|
||||
@ -815,11 +821,16 @@ static int generate_sched_domains(cpumask_var_t **domains,
|
||||
housekeeping_cpumask(HK_FLAG_DOMAIN))))
|
||||
continue;
|
||||
|
||||
if (root_load_balance &&
|
||||
cpumask_subset(cp->cpus_allowed, top_cpuset.effective_cpus))
|
||||
continue;
|
||||
|
||||
if (is_sched_load_balance(cp))
|
||||
csa[csn++] = cp;
|
||||
|
||||
/* skip @cp's subtree */
|
||||
pos_css = css_rightmost_descendant(pos_css);
|
||||
/* skip @cp's subtree if not a partition root */
|
||||
if (!is_partition_root(cp))
|
||||
pos_css = css_rightmost_descendant(pos_css);
|
||||
}
|
||||
rcu_read_unlock();
|
||||
|
||||
@ -947,7 +958,12 @@ static void rebuild_sched_domains_locked(void)
|
||||
* passing doms with offlined cpu to partition_sched_domains().
|
||||
* Anyways, hotplug work item will rebuild sched domains.
|
||||
*/
|
||||
if (!cpumask_equal(top_cpuset.effective_cpus, cpu_active_mask))
|
||||
if (!top_cpuset.nr_subparts_cpus &&
|
||||
!cpumask_equal(top_cpuset.effective_cpus, cpu_active_mask))
|
||||
goto out;
|
||||
|
||||
if (top_cpuset.nr_subparts_cpus &&
|
||||
!cpumask_subset(top_cpuset.effective_cpus, cpu_active_mask))
|
||||
goto out;
|
||||
|
||||
/* Generate domain masks and attrs */
|
||||
@ -1367,11 +1383,15 @@ static void update_cpumasks_hier(struct cpuset *cs, struct tmpmasks *tmp)
|
||||
update_tasks_cpumask(cp);
|
||||
|
||||
/*
|
||||
* If the effective cpumask of any non-empty cpuset is changed,
|
||||
* we need to rebuild sched domains.
|
||||
* On legacy hierarchy, if the effective cpumask of any non-
|
||||
* empty cpuset is changed, we need to rebuild sched domains.
|
||||
* On default hierarchy, the cpuset needs to be a partition
|
||||
* root as well.
|
||||
*/
|
||||
if (!cpumask_empty(cp->cpus_allowed) &&
|
||||
is_sched_load_balance(cp))
|
||||
is_sched_load_balance(cp) &&
|
||||
(!cgroup_subsys_on_dfl(cpuset_cgrp_subsys) ||
|
||||
is_partition_root(cp)))
|
||||
need_rebuild_sched_domains = true;
|
||||
|
||||
rcu_read_lock();
|
||||
|
Loading…
Reference in New Issue
Block a user