diff options
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/sched_fair.c | 33 | 
1 files changed, 11 insertions, 22 deletions
diff --git a/kernel/sched_fair.c b/kernel/sched_fair.c index ce514afd78f..6167336a237 100644 --- a/kernel/sched_fair.c +++ b/kernel/sched_fair.c @@ -347,17 +347,17 @@ static void __dequeue_entity(struct cfs_rq *cfs_rq, struct sched_entity *se)  	rb_erase(&se->run_node, &cfs_rq->tasks_timeline);  } -static inline struct rb_node *first_fair(struct cfs_rq *cfs_rq) -{ -	return cfs_rq->rb_leftmost; -} -  static struct sched_entity *__pick_next_entity(struct cfs_rq *cfs_rq)  { -	return rb_entry(first_fair(cfs_rq), struct sched_entity, run_node); +	struct rb_node *left = cfs_rq->rb_leftmost; + +	if (!left) +		return NULL; + +	return rb_entry(left, struct sched_entity, run_node);  } -static inline struct sched_entity *__pick_last_entity(struct cfs_rq *cfs_rq) +static struct sched_entity *__pick_last_entity(struct cfs_rq *cfs_rq)  {  	struct rb_node *last = rb_last(&cfs_rq->tasks_timeline); @@ -794,28 +794,16 @@ set_next_entity(struct cfs_rq *cfs_rq, struct sched_entity *se)  static int  wakeup_preempt_entity(struct sched_entity *curr, struct sched_entity *se); -static struct sched_entity * -pick_next(struct cfs_rq *cfs_rq, struct sched_entity *se) +static struct sched_entity *pick_next_entity(struct cfs_rq *cfs_rq)  { +	struct sched_entity *se = __pick_next_entity(cfs_rq); +  	if (!cfs_rq->next || wakeup_preempt_entity(cfs_rq->next, se) == 1)  		return se;  	return cfs_rq->next;  } -static struct sched_entity *pick_next_entity(struct cfs_rq *cfs_rq) -{ -	struct sched_entity *se = NULL; - -	if (first_fair(cfs_rq)) { -		se = __pick_next_entity(cfs_rq); -		se = pick_next(cfs_rq, se); -		set_next_entity(cfs_rq, se); -	} - -	return se; -} -  static void put_prev_entity(struct cfs_rq *cfs_rq, struct sched_entity *prev)  {  	/* @@ -1396,6 +1384,7 @@ static struct task_struct *pick_next_task_fair(struct rq *rq)  	do {  		se = pick_next_entity(cfs_rq); +		set_next_entity(cfs_rq, se);  		cfs_rq = group_cfs_rq(se);  	} while (cfs_rq);  | 
