linux/kernel/sched/stop_task.c
<<
>>
Prefs
   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 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 *pick_next_task_stop(struct rq *rq)
  27{
  28        struct task_struct *stop = rq->stop;
  29
  30        if (stop && stop->on_rq)
  31                return stop;
  32
  33        return NULL;
  34}
  35
  36static void
  37enqueue_task_stop(struct rq *rq, struct task_struct *p, int flags)
  38{
  39        inc_nr_running(rq);
  40}
  41
  42static void
  43dequeue_task_stop(struct rq *rq, struct task_struct *p, int flags)
  44{
  45        dec_nr_running(rq);
  46}
  47
  48static void yield_task_stop(struct rq *rq)
  49{
  50        BUG(); /* the stop task should never yield, its pointless. */
  51}
  52
  53static void put_prev_task_stop(struct rq *rq, struct task_struct *prev)
  54{
  55}
  56
  57static void task_tick_stop(struct rq *rq, struct task_struct *curr, int queued)
  58{
  59}
  60
  61static void set_curr_task_stop(struct rq *rq)
  62{
  63}
  64
  65static void switched_to_stop(struct rq *rq, struct task_struct *p)
  66{
  67        BUG(); /* its impossible to change to this class */
  68}
  69
  70static void
  71prio_changed_stop(struct rq *rq, struct task_struct *p, int oldprio)
  72{
  73        BUG(); /* how!?, what priority? */
  74}
  75
  76static unsigned int
  77get_rr_interval_stop(struct rq *rq, struct task_struct *task)
  78{
  79        return 0;
  80}
  81
  82/*
  83 * Simple, special scheduling class for the per-CPU stop tasks:
  84 */
  85const struct sched_class stop_sched_class = {
  86        .next                   = &rt_sched_class,
  87
  88        .enqueue_task           = enqueue_task_stop,
  89        .dequeue_task           = dequeue_task_stop,
  90        .yield_task             = yield_task_stop,
  91
  92        .check_preempt_curr     = check_preempt_curr_stop,
  93
  94        .pick_next_task         = pick_next_task_stop,
  95        .put_prev_task          = put_prev_task_stop,
  96
  97#ifdef CONFIG_SMP
  98        .select_task_rq         = select_task_rq_stop,
  99#endif
 100
 101        .set_curr_task          = set_curr_task_stop,
 102        .task_tick              = task_tick_stop,
 103
 104        .get_rr_interval        = get_rr_interval_stop,
 105
 106        .prio_changed           = prio_changed_stop,
 107        .switched_to            = switched_to_stop,
 108};
 109