1/* @title: Scheduling domains */
2#pragma once
3#include <smp/domain.h>
4#include <stdint.h>
5
6/* per-group: cluster of CPUs in one domain node */
7struct scheduler_group {
8 struct cpu_mask cpus; /* CPUs in this group (copy of topology_node->cpus) */
9 struct cpu_mask idle; /* idle map (mirrors topology_node->idle) */
10 uint64_t load; /* aggregated load metric for group (normalized) */
11 uint32_t capacity; /* capacity hint for the group (sum of CPU capacities) */
12
13 int32_t parent_index; /* index into sched_domain->groups for parent
14 group (-1 none) */
15 int32_t topo_index; /* index of topology_node used to build this group */
16};
17
18/* per-domain: list of groups at same level */
19struct scheduler_domain {
20 enum topology_level level; /* which topology level this domain maps to */
21 struct scheduler_group *groups; /* array */
22 size_t ngroups;
23 struct scheduler_domain
24 *parent; /* pointer to parent domain (higher level) */
25};
26
27void scheduler_domains_init(void);
28void scheduler_domain_mark_self_idle(bool idle);
29int32_t scheduler_push_target(struct core *from);
30int32_t scheduler_find_idle_cpu_near(struct core *from);
31int32_t scheduler_group_find_idle_cpu(struct scheduler_group *g);
32struct scheduler_group *scheduler_domain_find_sibling_group(struct core *c,
33 size_t domain_idx);
34