Merge tag 'v3.3.7' into 3.3/master
[zen-stable.git] / kernel / sched / stop_task.c
blob7b386e86fd2352c1a0fef2be23672a9c8ef194db
1 #include "sched.h"
3 /*
4 * stop-task scheduling class.
6 * The stop task is the highest priority task in the system, it preempts
7 * everything and will be preempted by nothing.
9 * See kernel/stop_machine.c
12 #ifdef CONFIG_SMP
13 static int
14 select_task_rq_stop(struct task_struct *p, int sd_flag, int flags)
16 return task_cpu(p); /* stop tasks as never migrate */
18 #endif /* CONFIG_SMP */
20 static void
21 check_preempt_curr_stop(struct rq *rq, struct task_struct *p, int flags)
23 /* we're never preempted */
26 static struct task_struct *pick_next_task_stop(struct rq *rq)
28 struct task_struct *stop = rq->stop;
30 if (stop && stop->on_rq)
31 return stop;
33 return NULL;
36 static void
37 enqueue_task_stop(struct rq *rq, struct task_struct *p, int flags)
39 inc_nr_running(rq);
42 static void
43 dequeue_task_stop(struct rq *rq, struct task_struct *p, int flags)
45 dec_nr_running(rq);
48 static void yield_task_stop(struct rq *rq)
50 BUG(); /* the stop task should never yield, its pointless. */
53 static void put_prev_task_stop(struct rq *rq, struct task_struct *prev)
57 static void task_tick_stop(struct rq *rq, struct task_struct *curr, int queued)
61 static void set_curr_task_stop(struct rq *rq)
65 static void switched_to_stop(struct rq *rq, struct task_struct *p)
67 BUG(); /* its impossible to change to this class */
70 static void
71 prio_changed_stop(struct rq *rq, struct task_struct *p, int oldprio)
73 BUG(); /* how!?, what priority? */
76 static unsigned int
77 get_rr_interval_stop(struct rq *rq, struct task_struct *task)
79 return 0;
83 * Simple, special scheduling class for the per-CPU stop tasks:
85 const struct sched_class stop_sched_class = {
86 .next = &rt_sched_class,
88 .enqueue_task = enqueue_task_stop,
89 .dequeue_task = dequeue_task_stop,
90 .yield_task = yield_task_stop,
92 .check_preempt_curr = check_preempt_curr_stop,
94 .pick_next_task = pick_next_task_stop,
95 .put_prev_task = put_prev_task_stop,
97 #ifdef CONFIG_SMP
98 .select_task_rq = select_task_rq_stop,
99 #endif
101 .set_curr_task = set_curr_task_stop,
102 .task_tick = task_tick_stop,
104 .get_rr_interval = get_rr_interval_stop,
106 .prio_changed = prio_changed_stop,
107 .switched_to = switched_to_stop,