sched_class
const struct sched_class *sched_class;
if ((flags & DEQUEUE_CLASS) && p->sched_class->switching_from)
p->sched_class->switching_from(rq, p);
.class = p->sched_class,
if (p->sched_class->get_prio)
ctx->prio = p->sched_class->get_prio(rq, p);
if ((flags & DEQUEUE_CLASS) && p->sched_class->switched_from)
p->sched_class->switched_from(rq, p);
WARN_ON_ONCE(p->sched_class != ctx->class && !(ctx->flags & ENQUEUE_CLASS));
if ((ctx->flags & ENQUEUE_CLASS) && p->sched_class->switching_to)
p->sched_class->switching_to(rq, p);
if (p->sched_class->switched_to)
p->sched_class->switched_to(rq, p);
if (sched_class_above(p->sched_class, ctx->class)) {
rq->next_class = p->sched_class;
if (sched_class_above(ctx->class, p->sched_class))
p->sched_class->prio_changed(rq, p, ctx->prio);
if (p->sched_class != &fair_sched_class)
if (update_load && p->sched_class->reweight_task)
p->sched_class->reweight_task(task_rq(p), p, &lw);
if (unlikely(!p->sched_class->uclamp_enabled))
if (unlikely(!p->sched_class->uclamp_enabled))
if (p->sched_class == &stop_sched_class) /* trumps deadline */
if (p->sched_class == &idle_sched_class)
p->sched_class->enqueue_task(rq, p, flags);
return p->sched_class->dequeue_task(rq, p, flags);
if (p->sched_class == rq->next_class) {
} else if (sched_class_above(p->sched_class, rq->next_class)) {
rq->next_class = p->sched_class;
if (p->sched_class->find_lock_rq)
lowest_rq = p->sched_class->find_lock_rq(p, rq);
p->sched_class->set_cpus_allowed(p, ctx);
p->sched_class == &fair_sched_class &&
if (p->sched_class->migrate_task_rq)
p->sched_class->migrate_task_rq(p, new_cpu);
if (p->sched_class->task_is_throttled)
return p->sched_class->task_is_throttled(p, cpu);
cpu = p->sched_class->select_task_rq(p, cpu, *wake_flags);
stop->sched_class = &stop_sched_class;
old_stop->sched_class = &rt_sched_class;
if (p->sched_class->task_woken) {
p->sched_class->task_woken(rq, p);
if (p->sched_class == &stop_sched_class)
p->sched_class = &rt_sched_class;
p->sched_class = &ext_sched_class;
p->sched_class = &fair_sched_class;
if (p->sched_class->task_fork)
p->sched_class->task_fork(p);
if (p->sched_class->task_woken) {
p->sched_class->task_woken(rq, p);
if (prev->sched_class->task_dead)
prev->sched_class->task_dead(prev);
dest_cpu = p->sched_class->select_task_rq(p, task_cpu(p), WF_EXEC);
p->sched_class->update_curr(rq);
donor->sched_class->task_tick(rq, donor, 0);
curr->sched_class->task_tick(rq, curr, 0);
const struct sched_class *start_class = prev->sched_class;
const struct sched_class *class;
const struct sched_class *class;
if (likely(!sched_class_above(prev->sched_class, &fair_sched_class) &&
const struct sched_class *class;
rq->next_class = next->sched_class;
const struct sched_class *__setscheduler_class(int policy, int prio)
const struct sched_class *prev_class, *next_class;
prev_class = p->sched_class;
p->sched_class = next_class;
idle->sched_class = &idle_sched_class;
const struct sched_class *class;
const struct sched_class *class;
rq->donor->sched_class->task_tick(rq, rq->donor, 1);
if (tsk->sched_class->task_change_group)
tsk->sched_class->task_change_group(tsk);
rq->donor->sched_class->update_curr(rq);
rq->donor->sched_class->update_curr(rq);
if (p->sched_class != &dl_sched_class)
if (rq->donor->sched_class != &dl_sched_class)
rq->curr->sched_class == &ext_sched_class) {
if (preempt || sched_class_above(&ext_sched_class, rq->curr->sched_class))
if (sched_class_above(p->sched_class, dst_rq->curr->sched_class))
bool prev_on_scx = prev->sched_class == &ext_sched_class;
preempt_reason_from_class(const struct sched_class *class)
const struct sched_class *next_class = next->sched_class;
if (next && sched_class_above(&ext_sched_class, next->sched_class)) {
if (next && next->sched_class != &ext_sched_class)
prev->sched_class != &ext_sched_class)) {
static const struct sched_class *scx_setscheduler_class(struct task_struct *p)
if (p->sched_class == &stop_sched_class)
if (p->sched_class == &ext_sched_class) {
if (p->sched_class != &ext_sched_class)
if (unlikely(p->sched_class != &ext_sched_class))
const struct sched_class *old_class = p->sched_class;
const struct sched_class *new_class = scx_setscheduler_class(p);
p->sched_class = new_class;
rq->curr->sched_class == &idle_sched_class;
rq->curr->sched_class);
if (rq->curr->sched_class == &ext_sched_class)
const struct sched_class *old_class = p->sched_class;
const struct sched_class *new_class = scx_setscheduler_class(p);
p->sched_class = new_class;
const struct sched_class *cur_class;
cur_class = rq->curr->sched_class;
struct sched_class *class;
if (copy_from_kernel_nofault(&class, &p->sched_class, sizeof(class)) ||
if (p->sched_class != &idle_sched_class)
return scx_enabled() && p->sched_class == &ext_sched_class;
if (p->sched_class != &fair_sched_class) {
if (p->sched_class != &fair_sched_class)
const struct sched_class fair_sched_class;
if (p->sched_class != &fair_sched_class)
if (!hrtick_enabled_fair(rq) || donor->sched_class != &fair_sched_class)
if (p->sched_class != &fair_sched_class)
if (prev->sched_class != &fair_sched_class)
if (p->sched_class != &fair_sched_class)
const struct sched_class *curr_class = rq->donor->sched_class;
if (p->sched_class != &rt_sched_class)
if (rq->donor->sched_class != &rt_sched_class)
if (rq->donor->sched_class != &rt_sched_class)
if (donor->sched_class != &rt_sched_class)
const struct sched_class *next_class;
extern const struct sched_class ext_sched_class;
prev->sched_class->put_prev_task(rq, prev, NULL);
next->sched_class->set_next_task(rq, next, false);
prev->sched_class->put_prev_task(rq, prev, next);
next->sched_class->set_next_task(rq, next, true);
const struct sched_class name##_sched_class \
__aligned(__alignof__(struct sched_class)) \
extern struct sched_class __sched_class_highest[];
extern struct sched_class __sched_class_lowest[];
extern const struct sched_class stop_sched_class;
extern const struct sched_class dl_sched_class;
extern const struct sched_class rt_sched_class;
extern const struct sched_class fair_sched_class;
extern const struct sched_class idle_sched_class;
static inline const struct sched_class *next_active_class(const struct sched_class *class)
static inline void rq_modified_begin(struct rq *rq, const struct sched_class *class)
static inline bool rq_modified_above(struct rq *rq, const struct sched_class *class)
extern const struct sched_class *__setscheduler_class(int policy, int prio);
const struct sched_class *class;
rq->donor->sched_class->yield_task(rq);
if (!curr->sched_class->yield_to_task)
if (curr->sched_class != p->sched_class)
yielded = curr->sched_class->yield_to_task(rq, p);
if (p->sched_class->get_rr_interval)
time_slice = p->sched_class->get_rr_interval(rq, p);
const struct sched_class *prev_class, *next_class;
prev_class = p->sched_class;
p->sched_class = next_class;
struct kwork_class *sched_class;
sched_class = get_kwork_class(kwork, KWORK_CLASS_SCHED);
if (sched_class) {
sched_work = find_work_by_id(&sched_class->work_root,