Branch data Line data Source code
1 : : #include "sched.h"
2 : :
3 : : /*
4 : : * idle-task scheduling class.
5 : : *
6 : : * (NOTE: these are not related to SCHED_IDLE tasks which are
7 : : * handled in sched/fair.c)
8 : : */
9 : :
10 : : #ifdef CONFIG_SMP
11 : : static int
12 : 0 : select_task_rq_idle(struct task_struct *p, int cpu, int sd_flag, int flags)
13 : : {
14 : 0 : return task_cpu(p); /* IDLE tasks as never migrated */
15 : : }
16 : :
17 : 0 : static void pre_schedule_idle(struct rq *rq, struct task_struct *prev)
18 : : {
19 : 6094891 : idle_exit_fair(rq);
20 : : rq_last_tick_reset(rq);
21 : 6095557 : }
22 : :
23 : 0 : static void post_schedule_idle(struct rq *rq)
24 : : {
25 : 6095039 : idle_enter_fair(rq);
26 : 6085916 : }
27 : : #endif /* CONFIG_SMP */
28 : : /*
29 : : * Idle tasks are unconditionally rescheduled:
30 : : */
31 : 0 : static void check_preempt_curr_idle(struct rq *rq, struct task_struct *p, int flags)
32 : : {
33 : 0 : resched_task(rq->idle);
34 : 0 : }
35 : :
36 : 0 : static struct task_struct *pick_next_task_idle(struct rq *rq)
37 : : {
38 : 6095437 : schedstat_inc(rq, sched_goidle);
39 : : #ifdef CONFIG_SMP
40 : : /* Trigger the post schedule to do an idle_enter for CFS */
41 : 6095437 : rq->post_schedule = 1;
42 : : #endif
43 : 6095437 : return rq->idle;
44 : : }
45 : :
46 : : /*
47 : : * It is not legal to sleep in the idle task - print a warning
48 : : * message if some code attempts to do it:
49 : : */
50 : : static void
51 : 0 : dequeue_task_idle(struct rq *rq, struct task_struct *p, int flags)
52 : : {
53 : : raw_spin_unlock_irq(&rq->lock);
54 : 0 : printk(KERN_ERR "bad: scheduling from the idle thread!\n");
55 : 0 : dump_stack();
56 : 0 : raw_spin_lock_irq(&rq->lock);
57 : 0 : }
58 : :
59 : 0 : static void put_prev_task_idle(struct rq *rq, struct task_struct *prev)
60 : : {
61 : 6095840 : }
62 : :
63 : 0 : static void task_tick_idle(struct rq *rq, struct task_struct *curr, int queued)
64 : : {
65 : 1368193 : }
66 : :
67 : 0 : static void set_curr_task_idle(struct rq *rq)
68 : : {
69 : 0 : }
70 : :
71 : 0 : static void switched_to_idle(struct rq *rq, struct task_struct *p)
72 : : {
73 : 0 : BUG();
74 : : }
75 : :
76 : : static void
77 : 0 : prio_changed_idle(struct rq *rq, struct task_struct *p, int oldprio)
78 : : {
79 : 0 : BUG();
80 : : }
81 : :
82 : 0 : static unsigned int get_rr_interval_idle(struct rq *rq, struct task_struct *task)
83 : : {
84 : 0 : return 0;
85 : : }
86 : :
87 : : /*
88 : : * Simple, special scheduling class for the per-CPU idle tasks:
89 : : */
90 : : const struct sched_class idle_sched_class = {
91 : : /* .next is NULL */
92 : : /* no enqueue/yield_task for idle tasks */
93 : :
94 : : /* dequeue is not valid, we print a debug message there: */
95 : : .dequeue_task = dequeue_task_idle,
96 : :
97 : : .check_preempt_curr = check_preempt_curr_idle,
98 : :
99 : : .pick_next_task = pick_next_task_idle,
100 : : .put_prev_task = put_prev_task_idle,
101 : :
102 : : #ifdef CONFIG_SMP
103 : : .select_task_rq = select_task_rq_idle,
104 : : .pre_schedule = pre_schedule_idle,
105 : : .post_schedule = post_schedule_idle,
106 : : #endif
107 : :
108 : : .set_curr_task = set_curr_task_idle,
109 : : .task_tick = task_tick_idle,
110 : :
111 : : .get_rr_interval = get_rr_interval_idle,
112 : :
113 : : .prio_changed = prio_changed_idle,
114 : : .switched_to = switched_to_idle,
115 : : };
|