Scheduler
include/sch/sched.h View source View on GitHubStructs
Section titled “Structs”idle_thread_data
Section titled “idle_thread_data”struct idle_thread_data {
_Atomic uint64_t last_entry_ms;
uint64_t last_exit_ms;
}; scheduler
Section titled “scheduler”struct scheduler {
atomic_bool tick_enabled;
time_t tick_duration_ms;
struct list_head urgent_threads;
struct rbt thread_rbt;
struct rbt completed_rbt;
struct list_head rt_threads;
struct list_head bg_threads;
struct rbt climb_threads;
_Atomic uint8_t queue_bitmap;
struct thread *current;
struct thread *drop_last_ref;
size_t thread_count[THREAD_PRIO_CLASS_COUNT];
size_t total_thread_count;
size_t total_weight;
bool period_enabled;
uint64_t current_period;
time_t period_ms;
time_t period_start_ms;
uint64_t core_id;
atomic_bool being_robbed;
atomic_bool stealing_work;
struct spinlock lock;
struct thread *idle_thread;
struct idle_thread_data idle_thread_data;
struct scheduler *other_locked;
struct rt_scheduler_percpu *rt;
}; scheduler_data
Section titled “scheduler_data”struct scheduler_data {
uint32_t max_concurrent_stealers;
_Atomic uint32_t active_stealers;
_Atomic uint32_t total_threads;
_Atomic int64_t steal_min_diff;
}; Functions
Section titled “Functions”scheduler_init
Section titled “scheduler_init”void scheduler_init(); scheduler_select_best_for_thread
Section titled “scheduler_select_best_for_thread”struct scheduler * scheduler_select_best_for_thread(struct thread *t); scheduler_add_thread
Section titled “scheduler_add_thread”void scheduler_add_thread(struct scheduler *sched, struct thread *thread, bool lock_held); scheduler_remove_thread
Section titled “scheduler_remove_thread”void scheduler_remove_thread(struct scheduler *sched, struct thread *t, bool lock_held); schedule
Section titled “schedule”void schedule(void); k_sch_main
Section titled “k_sch_main”void k_sch_main(void * *); scheduler_idle_main
Section titled “scheduler_idle_main”void scheduler_idle_main(void * *); scheduler_yield
Section titled “scheduler_yield”void scheduler_yield(); scheduler_period_start
Section titled “scheduler_period_start”void scheduler_period_start(struct scheduler *s, uint64_t now_ms); switch_context
Section titled “switch_context”void switch_context(struct cpu_context *old, struct cpu_context *new); load_context
Section titled “load_context”void load_context(struct cpu_context *new); save_context
Section titled “save_context”void save_context(struct cpu_context *new); scheduler_can_steal_work
Section titled “scheduler_can_steal_work”bool scheduler_can_steal_work(struct scheduler *sched); scheduler_can_take_thread
Section titled “scheduler_can_take_thread”bool scheduler_can_take_thread(size_t core, struct thread *target); scheduler_compute_steal_threshold
Section titled “scheduler_compute_steal_threshold”uint64_t scheduler_compute_steal_threshold(); scheduler_try_do_steal
Section titled “scheduler_try_do_steal”struct thread * scheduler_try_do_steal(struct scheduler *sched); scheduler_pick_victim
Section titled “scheduler_pick_victim”struct scheduler * scheduler_pick_victim(struct scheduler *self); scheduler_steal_work
Section titled “scheduler_steal_work”struct thread * scheduler_steal_work(struct scheduler *new, struct scheduler *victim); scheduler_try_push_to_idle_core
Section titled “scheduler_try_push_to_idle_core”size_t scheduler_try_push_to_idle_core(struct scheduler *sched); scheduler_tick_enable
Section titled “scheduler_tick_enable”void scheduler_tick_enable(); scheduler_tick_disable
Section titled “scheduler_tick_disable”void scheduler_tick_disable(); scheduler_timer_isr
Section titled “scheduler_timer_isr”enum irq_result scheduler_timer_isr(void *ctx, uint8_t vector, struct irq_context *rsp); scheduler_self_in_resched
Section titled “scheduler_self_in_resched”bool scheduler_self_in_resched(); scheduler_mark_self_in_resched
Section titled “scheduler_mark_self_in_resched”bool scheduler_mark_self_in_resched(bool new); scheduler_mark_core_needs_resched
Section titled “scheduler_mark_core_needs_resched”bool scheduler_mark_core_needs_resched(struct core *c, bool new); scheduler_mark_self_needs_resched
Section titled “scheduler_mark_self_needs_resched”bool scheduler_mark_self_needs_resched(bool new); scheduler_self_needs_resched
Section titled “scheduler_self_needs_resched”bool scheduler_self_needs_resched(void); scheduler_mark_self_idle
Section titled “scheduler_mark_self_idle”void scheduler_mark_self_idle(bool new); scheduler_resched_if_needed
Section titled “scheduler_resched_if_needed”void scheduler_resched_if_needed(void); scheduler_core_idle
Section titled “scheduler_core_idle”bool scheduler_core_idle(struct core *c); scheduler_force_resched
Section titled “scheduler_force_resched”void scheduler_force_resched(struct scheduler *sched); scheduler_preemption_disabled
Section titled “scheduler_preemption_disabled”bool scheduler_preemption_disabled(void); Variables
Section titled “Variables”scheduler_data
Section titled “scheduler_data”extern struct scheduler_data scheduler_data; Macros
Section titled “Macros”WORK_STEAL_THRESHOLD
Section titled “WORK_STEAL_THRESHOLD”#define WORK_STEAL_THRESHOLD \
75ULL /* How little work the core needs to be \
* doing to try to steal work from another \
* core. This means "% of the average" \
*/ SCHEDULER_DEFAULT_WORK_STEAL_MIN_DIFF
Section titled “SCHEDULER_DEFAULT_WORK_STEAL_MIN_DIFF”#define SCHEDULER_DEFAULT_WORK_STEAL_MIN_DIFF 130 TICKS_FOR_PRIO
Section titled “TICKS_FOR_PRIO”#define TICKS_FOR_PRIO(level) (level == THREAD_PRIO_LOW ? 64 : 1ULL << level)