1#include "sched.h" 2 3/* 4 * stop-task scheduling class. 5 * 6 * The stop task is the highest priority task in the system, it preempts 7 * everything and will be preempted by nothing. 8 * 9 * See kernel/stop_machine.c 10 */ 11 12#ifdef CONFIG_SMP 13static int 14select_task_rq_stop(struct task_struct *p, int cpu, int sd_flag, int flags) 15{ 16 return task_cpu(p); /* stop tasks as never migrate */ 17} 18#endif /* CONFIG_SMP */ 19 20static void 21check_preempt_curr_stop(struct rq *rq, struct task_struct *p, int flags) 22{ 23 /* we're never preempted */ 24} 25 26static struct task_struct * 27pick_next_task_stop(struct rq *rq, struct task_struct *prev) 28{ 29 struct task_struct *stop = rq->stop; 30 31 if (!stop || !task_on_rq_queued(stop)) 32 return NULL; 33 34 put_prev_task(rq, prev); 35 36 stop->se.exec_start = rq_clock_task(rq); 37 38 return stop; 39} 40 41static void 42enqueue_task_stop(struct rq *rq, struct task_struct *p, int flags) 43{ 44 add_nr_running(rq, 1); 45} 46 47static void 48dequeue_task_stop(struct rq *rq, struct task_struct *p, int flags) 49{ 50 sub_nr_running(rq, 1); 51} 52 53static void yield_task_stop(struct rq *rq) 54{ 55 BUG(); /* the stop task should never yield, its pointless. */ 56} 57 58static void put_prev_task_stop(struct rq *rq, struct task_struct *prev) 59{ 60 struct task_struct *curr = rq->curr; 61 u64 delta_exec; 62 63 delta_exec = rq_clock_task(rq) - curr->se.exec_start; 64 if (unlikely((s64)delta_exec < 0)) 65 delta_exec = 0; 66 67 schedstat_set(curr->se.statistics.exec_max, 68 max(curr->se.statistics.exec_max, delta_exec)); 69 70 curr->se.sum_exec_runtime += delta_exec; 71 account_group_exec_runtime(curr, delta_exec); 72 73 curr->se.exec_start = rq_clock_task(rq); 74 cpuacct_charge(curr, delta_exec); 75} 76 77static void task_tick_stop(struct rq *rq, struct task_struct *curr, int queued) 78{ 79} 80 81static void set_curr_task_stop(struct rq *rq) 82{ 83 struct task_struct *stop = rq->stop; 84 85 stop->se.exec_start = rq_clock_task(rq); 86} 87 88static void switched_to_stop(struct rq *rq, struct task_struct *p) 89{ 90 BUG(); /* its impossible to change to this class */ 91} 92 93static void 94prio_changed_stop(struct rq *rq, struct task_struct *p, int oldprio) 95{ 96 BUG(); /* how!?, what priority? */ 97} 98 99static unsigned int 100get_rr_interval_stop(struct rq *rq, struct task_struct *task) 101{ 102 return 0; 103} 104 105static void update_curr_stop(struct rq *rq) 106{ 107} 108 109/* 110 * Simple, special scheduling class for the per-CPU stop tasks: 111 */ 112const struct sched_class stop_sched_class = { 113 .next = &dl_sched_class, 114 115 .enqueue_task = enqueue_task_stop, 116 .dequeue_task = dequeue_task_stop, 117 .yield_task = yield_task_stop, 118 119 .check_preempt_curr = check_preempt_curr_stop, 120 121 .pick_next_task = pick_next_task_stop, 122 .put_prev_task = put_prev_task_stop, 123 124#ifdef CONFIG_SMP 125 .select_task_rq = select_task_rq_stop, 126#endif 127 128 .set_curr_task = set_curr_task_stop, 129 .task_tick = task_tick_stop, 130 131 .get_rr_interval = get_rr_interval_stop, 132 133 .prio_changed = prio_changed_stop, 134 .switched_to = switched_to_stop, 135 .update_curr = update_curr_stop, 136}; 137