mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	sched: fix crash in sys_sched_rr_get_interval()
Luiz Fernando N. Capitulino reported that sched_rr_get_interval() crashes for SCHED_OTHER tasks that are on an idle runqueue. The fix is to return a 0 timeslice for tasks that are on an idle runqueue. (and which are not running, obviously) this also shrinks the code a bit: text data bss dec hex filename 47903 3934 336 52173 cbcd sched.o.before 47885 3934 336 52155 cbbb sched.o.after Reported-by: Luiz Fernando N. Capitulino <lcapitulino@mandriva.com.br> Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
		
							parent
							
								
									09b56adc98
								
							
						
					
					
						commit
						77034937dc
					
				
					 1 changed files with 9 additions and 5 deletions
				
			
		| 
						 | 
				
			
			@ -4850,17 +4850,21 @@ long sys_sched_rr_get_interval(pid_t pid, struct timespec __user *interval)
 | 
			
		|||
	if (retval)
 | 
			
		||||
		goto out_unlock;
 | 
			
		||||
 | 
			
		||||
	if (p->policy == SCHED_FIFO)
 | 
			
		||||
		time_slice = 0;
 | 
			
		||||
	else if (p->policy == SCHED_RR)
 | 
			
		||||
	/*
 | 
			
		||||
	 * Time slice is 0 for SCHED_FIFO tasks and for SCHED_OTHER
 | 
			
		||||
	 * tasks that are on an otherwise idle runqueue:
 | 
			
		||||
	 */
 | 
			
		||||
	time_slice = 0;
 | 
			
		||||
	if (p->policy == SCHED_RR) {
 | 
			
		||||
		time_slice = DEF_TIMESLICE;
 | 
			
		||||
	else {
 | 
			
		||||
	} else {
 | 
			
		||||
		struct sched_entity *se = &p->se;
 | 
			
		||||
		unsigned long flags;
 | 
			
		||||
		struct rq *rq;
 | 
			
		||||
 | 
			
		||||
		rq = task_rq_lock(p, &flags);
 | 
			
		||||
		time_slice = NS_TO_JIFFIES(sched_slice(cfs_rq_of(se), se));
 | 
			
		||||
		if (rq->cfs.load.weight)
 | 
			
		||||
			time_slice = NS_TO_JIFFIES(sched_slice(&rq->cfs, se));
 | 
			
		||||
		task_rq_unlock(rq, &flags);
 | 
			
		||||
	}
 | 
			
		||||
	read_unlock(&tasklist_lock);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue