Clean up the implementation of scheduling class

This commit is contained in:
Zejun Zhao
2025-01-22 11:48:10 +08:00
committed by Tate, Hongliang Tian
parent 3f951e0c0c
commit c2f48a41db
7 changed files with 47 additions and 36 deletions

View File

@ -57,7 +57,7 @@ impl TryFrom<i8> for Nice {
/// ///
/// It is an integer in the range of [0, 139]. Here we follow the Linux /// It is an integer in the range of [0, 139]. Here we follow the Linux
/// priority mappings: the relation between [`Priority`] and [`Nice`] is /// priority mappings: the relation between [`Priority`] and [`Nice`] is
/// as such - prio = nice + 120 while the priority of [0, 100] are /// as such - prio = nice + 120 while the priority of [0, 99] are
/// reserved for real-time tasks. /// reserved for real-time tasks.
#[derive(Clone, Copy, Debug, Eq, PartialEq, PartialOrd, Ord)] #[derive(Clone, Copy, Debug, Eq, PartialEq, PartialOrd, Ord)]
pub struct Priority(PriorityRange); pub struct Priority(PriorityRange);
@ -70,18 +70,12 @@ define_atomic_version_of_integer_like_type!(Priority, try_from = true, {
}); });
impl Priority { impl Priority {
pub const MIN_NORMAL: Self = Self::new(PriorityRange::new(100));
pub const fn new(range: PriorityRange) -> Self { pub const fn new(range: PriorityRange) -> Self {
Self(range) Self(range)
} }
pub const fn default_real_time() -> Self {
Self::new(PriorityRange::new(50))
}
pub const fn idle() -> Self {
Self::new(PriorityRange::new(PriorityRange::MAX))
}
pub const fn range(&self) -> &PriorityRange { pub const fn range(&self) -> &PriorityRange {
&self.0 &self.0
} }
@ -92,14 +86,14 @@ impl Priority {
} }
impl From<Nice> for Priority { impl From<Nice> for Priority {
fn from(value: Nice) -> Self { fn from(nice: Nice) -> Self {
Self::new(PriorityRange::new(value.range().get() as u8 + 120)) Self::new(PriorityRange::new((nice.range().get() as i16 + 120) as u8))
} }
} }
impl From<Priority> for Nice { impl From<Priority> for Nice {
fn from(priority: Priority) -> Self { fn from(priority: Priority) -> Self {
Self::new(NiceRange::new((priority.range().get() - 100) as i8 - 20)) Self::new(NiceRange::new(((priority.range().get() as i16 - 100) - 20) as i8))
} }
} }

View File

@ -1,9 +1,9 @@
// SPDX-License-Identifier: MPL-2.0 // SPDX-License-Identifier: MPL-2.0
use alloc::{collections::binary_heap::BinaryHeap, sync::Arc}; use alloc::{collections::BinaryHeap, sync::Arc};
use core::{ use core::{
cmp::{self, Reverse}, cmp::{self, Reverse},
sync::atomic::{AtomicU64, Ordering::*}, sync::atomic::{AtomicU64, Ordering::Relaxed},
}; };
use ostd::{ use ostd::{

View File

@ -1,6 +1,13 @@
// SPDX-License-Identifier: MPL-2.0 // SPDX-License-Identifier: MPL-2.0
use super::*; use alloc::sync::Arc;
use ostd::task::{
scheduler::{EnqueueFlags, UpdateFlags},
Task,
};
use super::{CurrentRuntime, SchedAttr, SchedClassRq};
/// The per-cpu run queue for the IDLE scheduling class. /// The per-cpu run queue for the IDLE scheduling class.
/// ///

View File

@ -3,9 +3,10 @@
#![warn(unused)] #![warn(unused)]
use alloc::{boxed::Box, sync::Arc}; use alloc::{boxed::Box, sync::Arc};
use core::{fmt, sync::atomic::AtomicU64}; use core::fmt;
use ostd::{ use ostd::{
arch::read_tsc as sched_clock,
cpu::{all_cpus, AtomicCpuSet, CpuId, PinCurrentCpu}, cpu::{all_cpus, AtomicCpuSet, CpuId, PinCurrentCpu},
sync::SpinLock, sync::SpinLock,
task::{ task::{
@ -18,6 +19,9 @@ use ostd::{
trap::disable_local, trap::disable_local,
}; };
use super::{priority::Nice, stats::SchedulerStats};
use crate::thread::{AsThread, Thread};
mod policy; mod policy;
mod time; mod time;
@ -26,15 +30,7 @@ mod idle;
mod real_time; mod real_time;
mod stop; mod stop;
use ostd::arch::read_tsc as sched_clock; use self::policy::{SchedPolicy, SchedPolicyKind, SchedPolicyState};
pub use self::policy::*;
use self::policy::{SchedPolicyKind, SchedPolicyState};
use super::{
priority::{Nice, RangedU8},
stats::SchedulerStats,
};
use crate::thread::{AsThread, Thread};
type SchedEntity = (Arc<Task>, Arc<Thread>); type SchedEntity = (Arc<Task>, Arc<Thread>);

View File

@ -6,8 +6,8 @@ use atomic_integer_wrapper::define_atomic_version_of_integer_like_type;
use int_to_c_enum::TryFromInt; use int_to_c_enum::TryFromInt;
use ostd::sync::SpinLock; use ostd::sync::SpinLock;
pub use super::real_time::RealTimePolicy; pub use super::real_time::{RealTimePolicy, RtPrio};
use crate::sched::priority::{Nice, Priority, RangedU8}; use crate::sched::priority::{Nice, Priority};
/// The User-chosen scheduling policy. /// The User-chosen scheduling policy.
/// ///
@ -35,13 +35,12 @@ pub(super) enum SchedPolicyKind {
impl From<Priority> for SchedPolicy { impl From<Priority> for SchedPolicy {
fn from(priority: Priority) -> Self { fn from(priority: Priority) -> Self {
match priority.range().get() { match priority.range().get() {
0 => SchedPolicy::Stop, rt @ 0..=99 => SchedPolicy::RealTime {
rt @ 1..=99 => SchedPolicy::RealTime { rt_prio: RtPrio::new(rt as u8),
rt_prio: RangedU8::new(rt),
rt_policy: Default::default(), rt_policy: Default::default(),
}, },
100..=139 => SchedPolicy::Fair(priority.into()), 100..=139 => SchedPolicy::Fair(priority.into()),
_ => SchedPolicy::Idle, _ => unreachable!(),
} }
} }
} }

View File

@ -1,17 +1,25 @@
// SPDX-License-Identifier: MPL-2.0 // SPDX-License-Identifier: MPL-2.0
use alloc::collections::vec_deque::VecDeque; use alloc::{collections::VecDeque, sync::Arc};
use core::{ use core::{
array, array,
num::NonZero, num::NonZero,
sync::atomic::{AtomicU8, Ordering::*}, sync::atomic::{AtomicU64, AtomicU8, Ordering::Relaxed},
}; };
use bitvec::{bitarr, BitArr}; use bitvec::{bitarr, BitArr};
use ostd::{
cpu::CpuId,
task::{
scheduler::{EnqueueFlags, UpdateFlags},
Task,
},
};
use super::{time::base_slice_clocks, *}; use super::{time::base_slice_clocks, CurrentRuntime, SchedAttr, SchedClassRq};
use crate::{sched::priority::RangedU8, thread::AsThread};
pub type RtPrio = RangedU8<1, 99>; pub type RtPrio = RangedU8<0, 99>;
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)] #[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
pub enum RealTimePolicy { pub enum RealTimePolicy {

View File

@ -1,6 +1,13 @@
// SPDX-License-Identifier: MPL-2.0 // SPDX-License-Identifier: MPL-2.0
use super::*; use alloc::sync::Arc;
use ostd::task::{
scheduler::{EnqueueFlags, UpdateFlags},
Task,
};
use super::{CurrentRuntime, SchedAttr, SchedClassRq};
/// The per-cpu run queue for the STOP scheduling class. /// The per-cpu run queue for the STOP scheduling class.
/// ///