diff options
Diffstat (limited to 'src/scheduler.rs')
-rw-r--r-- | src/scheduler.rs | 29 |
1 files changed, 16 insertions, 13 deletions
diff --git a/src/scheduler.rs b/src/scheduler.rs index c34e151..bcc3134 100644 --- a/src/scheduler.rs +++ b/src/scheduler.rs @@ -2,7 +2,7 @@ use crate::bpf::*; use crate::energy::{self, Request as EnergyRequest, TaskInfo}; use crate::freq::{self, FrequencyKHZ, Request as FrequencyRequest}; -use crate::e_core_selector::{ECoreSelector, RoundRobinSelector}; +use crate::core_selector::{CoreSelector, RoundRobinSelector}; use anyhow::Result; use libbpf_rs::OpenObject; use scx_utils::{Topology, UserExitInfo}; @@ -10,10 +10,10 @@ use scx_utils::{Topology, UserExitInfo}; use std::collections::{HashMap, VecDeque}; use std::mem::MaybeUninit; use std::ops::{Range, RangeInclusive}; -use std::process; use std::sync::mpsc::TrySendError; use std::sync::{mpsc, Arc, RwLock}; use std::time::Duration; +use std::{process, usize}; use crate::Pid; @@ -32,7 +32,8 @@ pub struct Scheduler<'a> { e_cores: Range<i32>, topology: Topology, to_remove: Vec<Pid>, - e_core_selector: Box<dyn ECoreSelector>, + e_core_selector: Box<dyn CoreSelector>, + p_core_selector: Box<dyn CoreSelector>, energy_sender: mpsc::SyncSender<EnergyRequest>, empty_task_infos: mpsc::Receiver<Arc<TaskInfo>>, frequency_sender: mpsc::SyncSender<FrequencyRequest>, @@ -42,11 +43,7 @@ pub struct Scheduler<'a> { } impl<'a> Scheduler<'a> { - pub fn init( - open_object: &'a mut MaybeUninit<OpenObject>, - use_mocking: bool, - power_cap: u64, - ) -> Result<Self> { + pub fn init(open_object: &'a mut MaybeUninit<OpenObject>, use_mocking: bool) -> Result<Self> { println!("Initializing energy-aware scheduler"); let shared_cpu_frequency_ranges: Arc<RwLock<Vec<RangeInclusive<FrequencyKHZ>>>> = @@ -59,7 +56,6 @@ impl<'a> Scheduler<'a> { // Start energy tracking service let energy_sender = energy::start_energy_service( use_mocking, - power_cap, shared_cpu_frequency_ranges.clone(), shared_policy_frequency_ranges.clone(), shared_cpu_current_frequencies.clone(), @@ -88,7 +84,8 @@ impl<'a> Scheduler<'a> { let p_cores = *p_core_ids.first().unwrap_or(&0)..(*p_core_ids.last().unwrap_or(&-1) + 1); let all_cores = 0..((e_cores.len() + p_cores.len()) as u32); - let selector = Box::new(RoundRobinSelector::new(&e_cores)); + let p_core_selector = Box::new(RoundRobinSelector::new(&p_cores)); + let e_core_selector = Box::new(RoundRobinSelector::new(&e_cores)); let to_remove = Vec::with_capacity(1000); let frequency_sender = freq::start_frequency_service( @@ -127,7 +124,8 @@ impl<'a> Scheduler<'a> { tasks_scheduled: 0, e_cores, topology, - e_core_selector: selector, + e_core_selector, + p_core_selector, energy_sender, to_remove, frequency_sender, @@ -197,13 +195,17 @@ impl<'a> Scheduler<'a> { self.tasks_scheduled += 1; if let Some(task) = self.task_queue.pop_front() { let mut dispatched_task = DispatchedTask::new(&task); - //TODO: do we have to migrate tasks back from e cores? let cpu = self.bpf.select_cpu(task.pid, task.cpu, 0); if cpu >= 0 { dispatched_task.cpu = cpu; } else { - dispatched_task.flags |= RL_CPU_ANY as u64; + dispatched_task.cpu = self.p_core_selector.next_core(task.cpu); + //dispatched_task.flags |= RL_CPU_ANY as u64; + } + + if self.e_cores.contains(&dispatched_task.cpu) { + dispatched_task.cpu = self.p_core_selector.next_core(task.cpu); } if task.pid == self.own_pid { @@ -214,6 +216,7 @@ impl<'a> Scheduler<'a> { if let Err(e) = self.bpf.dispatch_task(&dispatched_task) { eprintln!("Failed to dispatch task: {}", e); + panic!(); } let running_on_e_core = self.e_cores.contains(&dispatched_task.cpu); |