summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorLennard Kittner <lennard@kittner.dev>2025-03-09 15:36:26 +0100
committerLennard Kittner <lennard@kittner.dev>2025-03-09 15:37:58 +0100
commit9ceb02c0f886a10fe8a620ad879512fa6639f6f6 (patch)
tree4474e12edf463e71291c2df2cd55ec996b82cd09 /src
parentdac2e1ac162c82bf02be2859e5a5d9860d0ef061 (diff)
Try to keep tasks on the same e-core
Diffstat (limited to 'src')
-rw-r--r--src/e_core_selector.rs9
-rw-r--r--src/scheduler.rs2
2 files changed, 6 insertions, 5 deletions
diff --git a/src/e_core_selector.rs b/src/e_core_selector.rs
index 6952e80..251cbe8 100644
--- a/src/e_core_selector.rs
+++ b/src/e_core_selector.rs
@@ -1,10 +1,9 @@
use std::ops::Range;
pub trait ECoreSelector {
- fn next_core(&mut self) -> i32;
+ fn next_core(&mut self, previous_cpu: i32) -> i32;
}
-//TODO: better core selection e.g. try to keep task on the same core
pub struct RoundRobinSelector {
offset: u32,
num_cores: u32,
@@ -22,8 +21,10 @@ impl RoundRobinSelector {
}
impl ECoreSelector for RoundRobinSelector {
- // TODO: use task cpu if suitable
- fn next_core(&mut self) -> i32 {
+ fn next_core(&mut self, previous_cpu: i32) -> i32 {
+ if (self.offset..(self.offset + self.num_cores)).contains(&(previous_cpu as u32)) {
+ return previous_cpu;
+ }
self.last_used += 1;
(self.offset + (self.last_used % self.num_cores)) as i32
}
diff --git a/src/scheduler.rs b/src/scheduler.rs
index 7645498..8618b78 100644
--- a/src/scheduler.rs
+++ b/src/scheduler.rs
@@ -149,7 +149,7 @@ impl<'a> Scheduler<'a> {
let mut dispatched_task = DispatchedTask::new(&task);
// Low budget tasks go to e-cores
- let cpu = self.e_core_selector.next_core();
+ let cpu = self.e_core_selector.next_core(task.cpu);
if cpu >= 0 {
dispatched_task.cpu = cpu;
} else {