ax_task/sched/system/cpu/remote/
mod.rs1use super::*;
4
5mod deadline;
6mod delivery;
7mod idle_pull;
8mod ktimer;
9mod lifecycle;
10mod load_summary;
11mod owner;
12mod run_queue;
13mod scheduler;
14
15pub(crate) use deadline::{
16 CpuDeadlineActivityGuard, CpuDeadlineBase, CpuDeadlinePublicationGuard, CpuDeadlineReadGuard,
17 CpuDeadlineState, DeadlineBaseGuardSource, KtimerClaimClass, SchedulerDeadlinePublicationState,
18 SchedulerNonTimerDeadlines,
19};
20pub(crate) use delivery::PreparedMigrationDelivery;
21pub(crate) use idle_pull::IdlePullReservation;
22pub use lifecycle::CpuLifecycleState;
23pub(crate) use lifecycle::{CpuRemotePublication, OwnedCpuRemotePublication};
24pub(crate) use load_summary::RunQueueLoadPublication;
25pub use owner::CpuLocalOwnerBorrow;
26pub(in crate::sched::system::cpu) use run_queue::RqCurrentUpdate;
27pub(crate) use run_queue::{
28 CpuRunQueueState, EqualRtWakeAction, OwnerRqEnqueue, RunQueueDomainPublication,
29 RunQueueGuardSource, WakePreemptionContext, WakePreemptionDecision,
30};
31pub(crate) use scheduler::{RescheduleKind, SchedulerRequestClaim, SchedulerRequestScope};
32
33#[derive(Debug)]
39pub struct CpuRemote {
40 owner: CpuId,
41 run_queue: IrqTicketLock<CpuRunQueueState>,
42 rt_bandwidth: IrqTicketLock<RtRunQueueBandwidth>,
43 deadline: CpuDeadlineBase,
44 deadline_extra_bw_scaled: AtomicU64,
46 owner_state: owner::OwnerState,
47 publication: lifecycle::CpuPublicationState,
48 scheduler_request: scheduler::SchedulerRequestState,
49 ktimer: ktimer::KtimerWorkerState,
50 load: load_summary::RemoteLoadState,
51 idle_pull: idle_pull::IdlePullState,
52 delivery: delivery::RemoteDeliveryState,
53}
54
55impl CpuRemote {
56 pub(crate) fn create(owner: CpuId, config: TaskSystemConfig) -> Arc<Self> {
57 let deadline_max_bw_scaled = u64::from(config.deadline_cap_percent())
58 * crate::sched::algorithm::DEADLINE_UTILIZATION_SCALE
59 / 100;
60 Arc::new(Self {
61 owner,
62 run_queue: IrqTicketLock::new(CpuRunQueueState::new(owner, config)),
63 rt_bandwidth: IrqTicketLock::new(RtRunQueueBandwidth::offline()),
64 deadline: CpuDeadlineBase::new(config),
65 deadline_extra_bw_scaled: AtomicU64::new(deadline_max_bw_scaled),
66 owner_state: owner::OwnerState::new(),
67 publication: lifecycle::CpuPublicationState::new(),
68 scheduler_request: scheduler::SchedulerRequestState::new(),
69 ktimer: ktimer::KtimerWorkerState::new(),
70 load: load_summary::RemoteLoadState::new(),
71 idle_pull: idle_pull::IdlePullState::new(),
72 delivery: delivery::RemoteDeliveryState::new(),
73 })
74 }
75
76 pub(crate) fn lock_run_queue(
82 &self,
83 source: RunQueueGuardSource,
84 ) -> IrqTicketGuard<'_, CpuRunQueueState> {
85 self.run_queue.lock(source.irq_guard_source())
86 }
87
88 pub(crate) fn lock_run_queue_nested<'a>(
90 &'a self,
91 owner: &'a IrqOwner<'_>,
92 ) -> IrqTicketGuard<'a, CpuRunQueueState> {
93 self.run_queue.lock_nested(owner)
94 }
95
96 pub(crate) unsafe fn lock_run_queue_irq_disabled(
105 &self,
106 ) -> IrqTicketGuard<'_, CpuRunQueueState> {
107 unsafe { self.run_queue.lock_irq_disabled() }
109 }
110
111 pub(crate) fn read_deadline_base(
117 &self,
118 source: DeadlineBaseGuardSource,
119 ) -> CpuDeadlineReadGuard<'_> {
120 self.deadline.read(source)
121 }
122
123 pub(crate) fn read_active_deadline_base(
126 &self,
127 source: DeadlineBaseGuardSource,
128 ) -> Option<CpuDeadlineReadGuard<'_>> {
129 self.deadline.read_if_active(source)
130 }
131
132 pub(crate) fn lock_deadline_publication(&self) -> CpuDeadlinePublicationGuard<'_> {
137 self.deadline.lock_publication()
138 }
139
140 pub(crate) fn deadline_publication_snapshot_matches(
141 &self,
142 non_timer: SchedulerNonTimerDeadlines,
143 ) -> bool {
144 self.deadline.publication_snapshot_matches(non_timer)
145 }
146
147 pub(crate) fn lock_deadline_activity(
150 &self,
151 source: DeadlineBaseGuardSource,
152 ) -> CpuDeadlineActivityGuard<'_> {
153 self.deadline.lock_activity(source)
154 }
155
156 pub(crate) fn lock_active_deadline_activity(
158 &self,
159 source: DeadlineBaseGuardSource,
160 ) -> Option<CpuDeadlineActivityGuard<'_>> {
161 self.deadline.lock_activity_if_active(source)
162 }
163
164 pub(crate) fn lock_rt_bandwidth(&self) -> IrqTicketGuard<'_, RtRunQueueBandwidth> {
167 self.rt_bandwidth
168 .lock(crate::runtime::IrqGuardSource::CpuRtBandwidthTicket)
169 }
170
171 pub(crate) fn publish_deadline_extra_bw(&self, extra_bw_scaled: u64) {
172 self.deadline_extra_bw_scaled
173 .store(extra_bw_scaled, Ordering::Release);
174 }
175
176 pub(crate) fn deadline_extra_bw_scaled(&self) -> u64 {
177 self.deadline_extra_bw_scaled.load(Ordering::Acquire)
178 }
179}