use super::*;
mod deadline;
mod delivery;
mod idle_pull;
mod ktimer;
mod lifecycle;
mod load_summary;
mod owner;
mod run_queue;
mod scheduler;
pub(crate) use deadline::{
CpuDeadlineActivityGuard, CpuDeadlineBase, CpuDeadlinePublicationGuard, CpuDeadlineReadGuard,
CpuDeadlineState, DeadlineBaseGuardSource, KtimerClaimClass, SchedulerDeadlinePublicationState,
SchedulerNonTimerDeadlines,
};
pub(crate) use delivery::PreparedMigrationDelivery;
pub(crate) use idle_pull::IdlePullReservation;
pub use lifecycle::CpuLifecycleState;
pub(crate) use lifecycle::{CpuRemotePublication, OwnedCpuRemotePublication};
pub(crate) use load_summary::RunQueueLoadPublication;
pub use owner::CpuLocalOwnerBorrow;
pub(in crate::sched::system::cpu) use run_queue::RqCurrentUpdate;
pub(crate) use run_queue::{
CpuRunQueueState, EqualRtWakeAction, OwnerRqEnqueue, RunQueueDomainPublication,
RunQueueGuardSource, WakePreemptionContext, WakePreemptionDecision,
};
pub(crate) use scheduler::{RescheduleKind, SchedulerRequestClaim, SchedulerRequestScope};
#[derive(Debug)]
pub struct CpuRemote {
owner: CpuId,
run_queue: IrqTicketLock<CpuRunQueueState>,
rt_bandwidth: IrqTicketLock<RtRunQueueBandwidth>,
deadline: CpuDeadlineBase,
deadline_extra_bw_scaled: AtomicU64,
owner_state: owner::OwnerState,
publication: lifecycle::CpuPublicationState,
scheduler_request: scheduler::SchedulerRequestState,
ktimer: ktimer::KtimerWorkerState,
load: load_summary::RemoteLoadState,
idle_pull: idle_pull::IdlePullState,
delivery: delivery::RemoteDeliveryState,
}
impl CpuRemote {
pub(crate) fn create(owner: CpuId, config: TaskSystemConfig) -> Arc<Self> {
let deadline_max_bw_scaled = u64::from(config.deadline_cap_percent())
* crate::sched::algorithm::DEADLINE_UTILIZATION_SCALE
/ 100;
Arc::new(Self {
owner,
run_queue: IrqTicketLock::new(CpuRunQueueState::new(owner, config)),
rt_bandwidth: IrqTicketLock::new(RtRunQueueBandwidth::offline()),
deadline: CpuDeadlineBase::new(config),
deadline_extra_bw_scaled: AtomicU64::new(deadline_max_bw_scaled),
owner_state: owner::OwnerState::new(),
publication: lifecycle::CpuPublicationState::new(),
scheduler_request: scheduler::SchedulerRequestState::new(),
ktimer: ktimer::KtimerWorkerState::new(),
load: load_summary::RemoteLoadState::new(),
idle_pull: idle_pull::IdlePullState::new(),
delivery: delivery::RemoteDeliveryState::new(),
})
}
pub(crate) fn lock_run_queue(
&self,
source: RunQueueGuardSource,
) -> IrqTicketGuard<'_, CpuRunQueueState> {
self.run_queue.lock(source.irq_guard_source())
}
pub(crate) fn lock_run_queue_nested<'a>(
&'a self,
owner: &'a IrqOwner<'_>,
) -> IrqTicketGuard<'a, CpuRunQueueState> {
self.run_queue.lock_nested(owner)
}
pub(crate) unsafe fn lock_run_queue_irq_disabled(
&self,
) -> IrqTicketGuard<'_, CpuRunQueueState> {
unsafe { self.run_queue.lock_irq_disabled() }
}
pub(crate) fn read_deadline_base(
&self,
source: DeadlineBaseGuardSource,
) -> CpuDeadlineReadGuard<'_> {
self.deadline.read(source)
}
pub(crate) fn read_active_deadline_base(
&self,
source: DeadlineBaseGuardSource,
) -> Option<CpuDeadlineReadGuard<'_>> {
self.deadline.read_if_active(source)
}
pub(crate) fn lock_deadline_publication(&self) -> CpuDeadlinePublicationGuard<'_> {
self.deadline.lock_publication()
}
pub(crate) fn deadline_publication_snapshot_matches(
&self,
non_timer: SchedulerNonTimerDeadlines,
) -> bool {
self.deadline.publication_snapshot_matches(non_timer)
}
pub(crate) fn lock_deadline_activity(
&self,
source: DeadlineBaseGuardSource,
) -> CpuDeadlineActivityGuard<'_> {
self.deadline.lock_activity(source)
}
pub(crate) fn lock_active_deadline_activity(
&self,
source: DeadlineBaseGuardSource,
) -> Option<CpuDeadlineActivityGuard<'_>> {
self.deadline.lock_activity_if_active(source)
}
pub(crate) fn lock_rt_bandwidth(&self) -> IrqTicketGuard<'_, RtRunQueueBandwidth> {
self.rt_bandwidth
.lock(crate::runtime::IrqGuardSource::CpuRtBandwidthTicket)
}
pub(crate) fn publish_deadline_extra_bw(&self, extra_bw_scaled: u64) {
self.deadline_extra_bw_scaled
.store(extra_bw_scaled, Ordering::Release);
}
pub(crate) fn deadline_extra_bw_scaled(&self) -> u64 {
self.deadline_extra_bw_scaled.load(Ordering::Acquire)
}
}