diff options
Diffstat (limited to 'kernel/sched/idle_task.c')
-rw-r--r-- | kernel/sched/idle_task.c | 27 |
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 | |||
17 | static 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 | |||
23 | static 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 | ||
36 | static struct task_struct *pick_next_task_idle(struct rq *rq) | 26 | static struct task_struct * |
27 | pick_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 | ||
59 | static void put_prev_task_idle(struct rq *rq, struct task_struct *prev) | 52 | static 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 | ||
63 | static void task_tick_idle(struct rq *rq, struct task_struct *curr, int queued) | 60 | static 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, |