mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	cgroup/cpuset: Enable update_tasks_cpumask() on top_cpuset
Previously, update_tasks_cpumask() is not supposed to be called with
top cpuset. With cpuset partition that takes CPUs away from the top
cpuset, adjusting the cpus_mask of the tasks in the top cpuset is
necessary. Percpu kthreads, however, are ignored.
Fixes: ee8dde0cd2 ("cpuset: Add new v2 cpuset.sched.partition flag")
Signed-off-by: Waiman Long <longman@redhat.com>
Signed-off-by: Tejun Heo <tj@kernel.org>
			
			
This commit is contained in:
		
							parent
							
								
									5251c6c436
								
							
						
					
					
						commit
						ec5fbdfb99
					
				
					 1 changed files with 11 additions and 7 deletions
				
			
		| 
						 | 
				
			
			@ -33,6 +33,7 @@
 | 
			
		|||
#include <linux/interrupt.h>
 | 
			
		||||
#include <linux/kernel.h>
 | 
			
		||||
#include <linux/kmod.h>
 | 
			
		||||
#include <linux/kthread.h>
 | 
			
		||||
#include <linux/list.h>
 | 
			
		||||
#include <linux/mempolicy.h>
 | 
			
		||||
#include <linux/mm.h>
 | 
			
		||||
| 
						 | 
				
			
			@ -1127,10 +1128,18 @@ static void update_tasks_cpumask(struct cpuset *cs)
 | 
			
		|||
{
 | 
			
		||||
	struct css_task_iter it;
 | 
			
		||||
	struct task_struct *task;
 | 
			
		||||
	bool top_cs = cs == &top_cpuset;
 | 
			
		||||
 | 
			
		||||
	css_task_iter_start(&cs->css, 0, &it);
 | 
			
		||||
	while ((task = css_task_iter_next(&it)))
 | 
			
		||||
	while ((task = css_task_iter_next(&it))) {
 | 
			
		||||
		/*
 | 
			
		||||
		 * Percpu kthreads in top_cpuset are ignored
 | 
			
		||||
		 */
 | 
			
		||||
		if (top_cs && (task->flags & PF_KTHREAD) &&
 | 
			
		||||
		    kthread_is_per_cpu(task))
 | 
			
		||||
			continue;
 | 
			
		||||
		set_cpus_allowed_ptr(task, cs->effective_cpus);
 | 
			
		||||
	}
 | 
			
		||||
	css_task_iter_end(&it);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -2092,12 +2101,7 @@ static int update_prstate(struct cpuset *cs, int new_prs)
 | 
			
		|||
		update_flag(CS_CPU_EXCLUSIVE, cs, 0);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * Update cpumask of parent's tasks except when it is the top
 | 
			
		||||
	 * cpuset as some system daemons cannot be mapped to other CPUs.
 | 
			
		||||
	 */
 | 
			
		||||
	if (parent != &top_cpuset)
 | 
			
		||||
		update_tasks_cpumask(parent);
 | 
			
		||||
	update_tasks_cpumask(parent);
 | 
			
		||||
 | 
			
		||||
	if (parent->child_ecpus_count)
 | 
			
		||||
		update_sibling_cpumasks(parent, cs, &tmpmask);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue