summaryrefslogtreecommitdiff
path: root/src/scheduler.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/scheduler.rs')
-rw-r--r--src/scheduler.rs29
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);