staticinlinevoid
rq_sched_info_dequeue(struct rq *rq, unsignedlonglong delta)
{ if (rq)
rq->rq_sched_info.run_delay += delta;
} #define schedstat_enabled() static_branch_unlikely(&sched_schedstats) #define __schedstat_inc(var) do { var++; } while (0) #define schedstat_inc(var) do { if (schedstat_enabled()) { var++; } } while (0) #define __schedstat_add(var, amt) do { var += (amt); } while (0) #define schedstat_add(var, amt) do { if (schedstat_enabled()) { var += (amt); } } while (0) #define __schedstat_set(var, val) do { var = (val); } while (0) #define schedstat_set(var, val) do { if (schedstat_enabled()) { var = (val); } } while (0) #define schedstat_val(var) (var) #define schedstat_val_or_zero(var) ((schedstat_enabled()) ? (var) : 0)
staticinlinevoid
check_schedstat_required(void)
{ if (schedstat_enabled()) return;
/* Force schedstat enabled if a dependent tracepoint is active */ if (trace_sched_stat_wait_enabled() ||
trace_sched_stat_sleep_enabled() ||
trace_sched_stat_iowait_enabled() ||
trace_sched_stat_blocked_enabled() ||
trace_sched_stat_runtime_enabled())
printk_deferred_once("Scheduler tracepoints stat_sleep, stat_iowait, stat_blocked and stat_runtime require the kernel parameter schedstats=enable or kernel.sched_schedstats=1\n");
}
#else/* !CONFIG_SCHEDSTATS: */
staticinlinevoid rq_sched_info_arrive (struct rq *rq, unsignedlonglong delta) { } staticinlinevoid rq_sched_info_dequeue(struct rq *rq, unsignedlonglong delta) { } staticinlinevoid rq_sched_info_depart (struct rq *rq, unsignedlonglong delta) { } # define schedstat_enabled() 0 # define __schedstat_inc(var) do { } while (0) # define schedstat_inc(var) do { } while (0) # define __schedstat_add(var, amt) do { } while (0) # define schedstat_add(var, amt) do { } while (0) # define __schedstat_set(var, val) do { } while (0) # define schedstat_set(var, val) do { } while (0) # define schedstat_val(var) 0 # define schedstat_val_or_zero(var) 0
# define __update_stats_wait_start(rq, p, stats) do { } while (0) # define __update_stats_wait_end(rq, p, stats) do { } while (0) # define __update_stats_enqueue_sleeper(rq, p, stats) do { } while (0) # define check_schedstat_required() do { } while (0)
/* Same runqueue, nothing changed for psi */ if (flags & ENQUEUE_RESTORE) return;
/* psi_sched_switch() will handle the flags */ if (task_on_cpu(task_rq(p), p)) return;
if (p->se.sched_delayed) { /* CPU migration of "sleeping" task */
WARN_ON_ONCE(!(flags & ENQUEUE_MIGRATED)); if (p->in_memstall)
set |= TSK_MEMSTALL; if (p->in_iowait)
set |= TSK_IOWAIT;
} elseif (flags & ENQUEUE_MIGRATED) { /* CPU migration of runnable task */
set = TSK_RUNNING; if (p->in_memstall)
set |= TSK_MEMSTALL | TSK_MEMSTALL_RUNNING;
} else { /* Wakeup of new or sleeping task */ if (p->in_iowait)
clear |= TSK_IOWAIT;
set = TSK_RUNNING; if (p->in_memstall)
set |= TSK_MEMSTALL_RUNNING;
}
psi_task_change(p, clear, set);
}
staticinlinevoid psi_dequeue(struct task_struct *p, int flags)
{ if (static_branch_likely(&psi_disabled)) return;
/* Same runqueue, nothing changed for psi */ if (flags & DEQUEUE_SAVE) return;
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.