mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	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
					
				
					 1 changed files with 27 additions and 7 deletions
				
			
		| 
						 | 
				
			
			@ -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 a new issue