aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/sched/idle_task.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/sched/idle_task.c')
-rw-r--r--kernel/sched/idle_task.c27
1 files changed, 11 insertions, 16 deletions
diff --git a/kernel/sched/idle_task.c b/kernel/sched/idle_task.c
index 516c3d9ceea1..f7d03af79a5b 100644
--- a/kernel/sched/idle_task.c
+++ b/kernel/sched/idle_task.c
@@ -13,18 +13,8 @@ select_task_rq_idle(struct task_struct *p, int cpu, int sd_flag, int flags)
13{ 13{
14 return task_cpu(p); /* IDLE tasks as never migrated */ 14 return task_cpu(p); /* IDLE tasks as never migrated */
15} 15}
16
17static void pre_schedule_idle(struct rq *rq, struct task_struct *prev)
18{
19 idle_exit_fair(rq);
20 rq_last_tick_reset(rq);
21}
22
23static void post_schedule_idle(struct rq *rq)
24{
25 idle_enter_fair(rq);
26}
27#endif /* CONFIG_SMP */ 16#endif /* CONFIG_SMP */
17
28/* 18/*
29 * Idle tasks are unconditionally rescheduled: 19 * Idle tasks are unconditionally rescheduled:
30 */ 20 */
@@ -33,12 +23,15 @@ static void check_preempt_curr_idle(struct rq *rq, struct task_struct *p, int fl
33 resched_task(rq->idle); 23 resched_task(rq->idle);
34} 24}
35 25
36static struct task_struct *pick_next_task_idle(struct rq *rq) 26static struct task_struct *
27pick_next_task_idle(struct rq *rq, struct task_struct *prev)
37{ 28{
29 if (prev)
30 prev->sched_class->put_prev_task(rq, prev);
31
38 schedstat_inc(rq, sched_goidle); 32 schedstat_inc(rq, sched_goidle);
39#ifdef CONFIG_SMP 33#ifdef CONFIG_SMP
40 /* Trigger the post schedule to do an idle_enter for CFS */ 34 idle_enter_fair(rq);
41 rq->post_schedule = 1;
42#endif 35#endif
43 return rq->idle; 36 return rq->idle;
44} 37}
@@ -58,6 +51,10 @@ dequeue_task_idle(struct rq *rq, struct task_struct *p, int flags)
58 51
59static void put_prev_task_idle(struct rq *rq, struct task_struct *prev) 52static void put_prev_task_idle(struct rq *rq, struct task_struct *prev)
60{ 53{
54#ifdef CONFIG_SMP
55 idle_exit_fair(rq);
56 rq_last_tick_reset(rq);
57#endif
61} 58}
62 59
63static void task_tick_idle(struct rq *rq, struct task_struct *curr, int queued) 60static void task_tick_idle(struct rq *rq, struct task_struct *curr, int queued)
@@ -101,8 +98,6 @@ const struct sched_class idle_sched_class = {
101 98
102#ifdef CONFIG_SMP 99#ifdef CONFIG_SMP
103 .select_task_rq = select_task_rq_idle, 100 .select_task_rq = select_task_rq_idle,
104 .pre_schedule = pre_schedule_idle,
105 .post_schedule = post_schedule_idle,
106#endif 101#endif
107 102
108 .set_curr_task = set_curr_task_idle, 103 .set_curr_task = set_curr_task_idle,