sched_stoptask.c 2.1 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11
/*
 * stop-task scheduling class.
 *
 * The stop task is the highest priority task in the system, it preempts
 * everything and will be preempted by nothing.
 *
 * See kernel/stop_machine.c
 */

#ifdef CONFIG_SMP
static int
12
select_task_rq_stop(struct task_struct *p, int sd_flag, int flags)
13 14 15 16 17 18 19 20
{
	return task_cpu(p); /* stop tasks as never migrate */
}
#endif /* CONFIG_SMP */

static void
check_preempt_curr_stop(struct rq *rq, struct task_struct *p, int flags)
{
21
	/* we're never preempted */
22 23 24 25 26 27
}

static struct task_struct *pick_next_task_stop(struct rq *rq)
{
	struct task_struct *stop = rq->stop;

P
Peter Zijlstra 已提交
28
	if (stop && stop->on_rq)
29 30 31 32 33 34 35 36
		return stop;

	return NULL;
}

static void
enqueue_task_stop(struct rq *rq, struct task_struct *p, int flags)
{
37
	inc_nr_running(rq);
38 39 40 41 42
}

static void
dequeue_task_stop(struct rq *rq, struct task_struct *p, int flags)
{
43
	dec_nr_running(rq);
44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
}

static void yield_task_stop(struct rq *rq)
{
	BUG(); /* the stop task should never yield, its pointless. */
}

static void put_prev_task_stop(struct rq *rq, struct task_struct *prev)
{
}

static void task_tick_stop(struct rq *rq, struct task_struct *curr, int queued)
{
}

static void set_curr_task_stop(struct rq *rq)
{
}

P
Peter Zijlstra 已提交
63
static void switched_to_stop(struct rq *rq, struct task_struct *p)
64 65 66 67
{
	BUG(); /* its impossible to change to this class */
}

P
Peter Zijlstra 已提交
68 69
static void
prio_changed_stop(struct rq *rq, struct task_struct *p, int oldprio)
70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106
{
	BUG(); /* how!?, what priority? */
}

static unsigned int
get_rr_interval_stop(struct rq *rq, struct task_struct *task)
{
	return 0;
}

/*
 * Simple, special scheduling class for the per-CPU stop tasks:
 */
static const struct sched_class stop_sched_class = {
	.next			= &rt_sched_class,

	.enqueue_task		= enqueue_task_stop,
	.dequeue_task		= dequeue_task_stop,
	.yield_task		= yield_task_stop,

	.check_preempt_curr	= check_preempt_curr_stop,

	.pick_next_task		= pick_next_task_stop,
	.put_prev_task		= put_prev_task_stop,

#ifdef CONFIG_SMP
	.select_task_rq		= select_task_rq_stop,
#endif

	.set_curr_task          = set_curr_task_stop,
	.task_tick		= task_tick_stop,

	.get_rr_interval	= get_rr_interval_stop,

	.prio_changed		= prio_changed_stop,
	.switched_to		= switched_to_stop,
};