diff options
Diffstat (limited to 'kernel/sched/idle_task.c')
| -rw-r--r-- | kernel/sched/idle_task.c | 16 | 
1 files changed, 16 insertions, 0 deletions
diff --git a/kernel/sched/idle_task.c b/kernel/sched/idle_task.c index b6baf370cae..b8ce7732834 100644 --- a/kernel/sched/idle_task.c +++ b/kernel/sched/idle_task.c @@ -13,6 +13,16 @@ select_task_rq_idle(struct task_struct *p, int sd_flag, int flags)  {  	return task_cpu(p); /* IDLE tasks as never migrated */  } + +static void pre_schedule_idle(struct rq *rq, struct task_struct *prev) +{ +	idle_exit_fair(rq); +} + +static void post_schedule_idle(struct rq *rq) +{ +	idle_enter_fair(rq); +}  #endif /* CONFIG_SMP */  /*   * Idle tasks are unconditionally rescheduled: @@ -25,6 +35,10 @@ static void check_preempt_curr_idle(struct rq *rq, struct task_struct *p, int fl  static struct task_struct *pick_next_task_idle(struct rq *rq)  {  	schedstat_inc(rq, sched_goidle); +#ifdef CONFIG_SMP +	/* Trigger the post schedule to do an idle_enter for CFS */ +	rq->post_schedule = 1; +#endif  	return rq->idle;  } @@ -86,6 +100,8 @@ const struct sched_class idle_sched_class = {  #ifdef CONFIG_SMP  	.select_task_rq		= select_task_rq_idle, +	.pre_schedule		= pre_schedule_idle, +	.post_schedule		= post_schedule_idle,  #endif  	.set_curr_task          = set_curr_task_idle,  |