mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +02:00 
			
		
		
		
	sched/deadline: Fix migration of SCHED_DEADLINE tasks
Commit:9d51426242("sched/deadline: Reduce rq lock contention by eliminating locking of non-feasible target") broke select_task_rq_dl() and find_lock_later_rq(), because it introduced a comparison between the local task's deadline and dl.earliest_dl.curr of the remote queue. However, if the remote runqueue does not contain any SCHED_DEADLINE task its earliest_dl.curr is 0 (always smaller than the deadline of the local task) and the remote runqueue is not selected for pushing. As a result, if an application creates multiple SCHED_DEADLINE threads, they will never be pushed to runqueues that do not already contain SCHED_DEADLINE tasks. This patch fixes the issue by checking if dl.dl_nr_running == 0. Signed-off-by: Luca Abeni <luca.abeni@unitn.it> Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Cc: Juri Lelli <juri.lelli@arm.com> Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: Mike Galbraith <efault@gmx.de> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: Wanpeng Li <wanpeng.li@linux.intel.com> Fixes:9d51426242("sched/deadline: Reduce rq lock contention by eliminating locking of non-feasible target") Link: http://lkml.kernel.org/r/1444982781-15608-1-git-send-email-luca.abeni@unitn.it Signed-off-by: Ingo Molnar <mingo@kernel.org>
This commit is contained in:
		
							parent
							
								
									0baabb385e
								
							
						
					
					
						commit
						5aa5050787
					
				
					 1 changed files with 5 additions and 3 deletions
				
			
		| 
						 | 
				
			
			@ -1066,8 +1066,9 @@ select_task_rq_dl(struct task_struct *p, int cpu, int sd_flag, int flags)
 | 
			
		|||
		int target = find_later_rq(p);
 | 
			
		||||
 | 
			
		||||
		if (target != -1 &&
 | 
			
		||||
				dl_time_before(p->dl.deadline,
 | 
			
		||||
					cpu_rq(target)->dl.earliest_dl.curr))
 | 
			
		||||
				(dl_time_before(p->dl.deadline,
 | 
			
		||||
					cpu_rq(target)->dl.earliest_dl.curr) ||
 | 
			
		||||
				(cpu_rq(target)->dl.dl_nr_running == 0)))
 | 
			
		||||
			cpu = target;
 | 
			
		||||
	}
 | 
			
		||||
	rcu_read_unlock();
 | 
			
		||||
| 
						 | 
				
			
			@ -1417,7 +1418,8 @@ static struct rq *find_lock_later_rq(struct task_struct *task, struct rq *rq)
 | 
			
		|||
 | 
			
		||||
		later_rq = cpu_rq(cpu);
 | 
			
		||||
 | 
			
		||||
		if (!dl_time_before(task->dl.deadline,
 | 
			
		||||
		if (later_rq->dl.dl_nr_running &&
 | 
			
		||||
		    !dl_time_before(task->dl.deadline,
 | 
			
		||||
					later_rq->dl.earliest_dl.curr)) {
 | 
			
		||||
			/*
 | 
			
		||||
			 * Target rq has tasks of equal or earlier deadline,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue