 16b269436b
			
		
	
	
	16b269436b
	
	
	
		
			
			Currently, cpudl::free_cpus contains all CPUs during init, see cpudl_init(). When calling cpudl_find(), we have to add rd->span to avoid selecting the cpu outside the current root domain, because cpus_allowed cannot be depended on when performing clustered scheduling using the cpuset, see find_later_rq(). This patch adds cpudl_set_freecpu() and cpudl_clear_freecpu() for changing cpudl::free_cpus when doing rq_online_dl()/rq_offline_dl(), so we can avoid the rd->span operation when calling cpudl_find() in find_later_rq(). Signed-off-by: Xunlei Pang <pang.xunlei@linaro.org> Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Cc: Juri Lelli <juri.lelli@gmail.com> Cc: Linus Torvalds <torvalds@linux-foundation.org> Link: http://lkml.kernel.org/r/1421642980-10045-1-git-send-email-pang.xunlei@linaro.org Signed-off-by: Ingo Molnar <mingo@kernel.org>
		
			
				
	
	
		
			32 lines
		
	
	
	
		
			668 B
			
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			32 lines
		
	
	
	
		
			668 B
			
		
	
	
	
		
			C
		
	
	
	
	
	
| #ifndef _LINUX_CPUDL_H
 | |
| #define _LINUX_CPUDL_H
 | |
| 
 | |
| #include <linux/sched.h>
 | |
| 
 | |
| #define IDX_INVALID     -1
 | |
| 
 | |
| struct cpudl_item {
 | |
| 	u64 dl;
 | |
| 	int cpu;
 | |
| 	int idx;
 | |
| };
 | |
| 
 | |
| struct cpudl {
 | |
| 	raw_spinlock_t lock;
 | |
| 	int size;
 | |
| 	cpumask_var_t free_cpus;
 | |
| 	struct cpudl_item *elements;
 | |
| };
 | |
| 
 | |
| 
 | |
| #ifdef CONFIG_SMP
 | |
| int cpudl_find(struct cpudl *cp, struct task_struct *p,
 | |
| 	       struct cpumask *later_mask);
 | |
| void cpudl_set(struct cpudl *cp, int cpu, u64 dl, int is_valid);
 | |
| int cpudl_init(struct cpudl *cp);
 | |
| void cpudl_set_freecpu(struct cpudl *cp, int cpu);
 | |
| void cpudl_clear_freecpu(struct cpudl *cp, int cpu);
 | |
| void cpudl_cleanup(struct cpudl *cp);
 | |
| #endif /* CONFIG_SMP */
 | |
| 
 | |
| #endif /* _LINUX_CPUDL_H */
 |