sched: fix sched_slice()
Impact: fix bad-interactivity buglet Fix sched_slice() to emit a sane result whether a task is currently enqueued or not. Signed-off-by: Mike Galbraith <efault@gmx.de> Tested-by: Jayson King <dev@jaysonking.com> Signed-off-by: Ingo Molnar <mingo@elte.hu> kernel/sched_fair.c | 30 ++++++++++++------------------ 1 file changed, 12 insertions(+), 18 deletions(-)
This commit is contained in:
		
							parent
							
								
									b58602a4ba
								
							
						
					
					
						commit
						0a582440ff
					
				| @ -385,20 +385,6 @@ int sched_nr_latency_handler(struct ctl_table *table, int write, | ||||
| } | ||||
| #endif | ||||
| 
 | ||||
| /*
 | ||||
|  * delta *= P[w / rw] | ||||
|  */ | ||||
| static inline unsigned long | ||||
| calc_delta_weight(unsigned long delta, struct sched_entity *se) | ||||
| { | ||||
| 	for_each_sched_entity(se) { | ||||
| 		delta = calc_delta_mine(delta, | ||||
| 				se->load.weight, &cfs_rq_of(se)->load); | ||||
| 	} | ||||
| 
 | ||||
| 	return delta; | ||||
| } | ||||
| 
 | ||||
| /*
 | ||||
|  * delta /= w | ||||
|  */ | ||||
| @ -440,12 +426,20 @@ static u64 __sched_period(unsigned long nr_running) | ||||
|  */ | ||||
| static u64 sched_slice(struct cfs_rq *cfs_rq, struct sched_entity *se) | ||||
| { | ||||
| 	unsigned long nr_running = cfs_rq->nr_running; | ||||
| 	u64 slice = __sched_period(cfs_rq->nr_running + !se->on_rq); | ||||
| 
 | ||||
| 	if (unlikely(!se->on_rq)) | ||||
| 		nr_running++; | ||||
| 	for_each_sched_entity(se) { | ||||
| 		struct load_weight *load = &cfs_rq->load; | ||||
| 
 | ||||
| 	return calc_delta_weight(__sched_period(nr_running), se); | ||||
| 		if (unlikely(!se->on_rq)) { | ||||
| 			struct load_weight lw = cfs_rq->load; | ||||
| 
 | ||||
| 			update_load_add(&lw, se->load.weight); | ||||
| 			load = &lw; | ||||
| 		} | ||||
| 		slice = calc_delta_mine(slice, se->load.weight, load); | ||||
| 	} | ||||
| 	return slice; | ||||
| } | ||||
| 
 | ||||
| /*
 | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user