summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/scheduler.rs31
1 files changed, 19 insertions, 12 deletions
diff --git a/src/scheduler.rs b/src/scheduler.rs
index a936b3c..412d00e 100644
--- a/src/scheduler.rs
+++ b/src/scheduler.rs
@@ -40,6 +40,7 @@ pub struct Scheduler<'a> {
to_remove: Vec<Pid>,
e_core_selector: Box<dyn ECoreSelector>,
energy_sender: mpsc::SyncSender<EnergyRequest>,
+ empty_task_infos: mpsc::Receiver<Arc<TaskInfo>>,
frequency_sender: mpsc::SyncSender<FrequencyRequest>,
shared_cpu_frequency_ranges: Arc<RwLock<Vec<RangeInclusive<FrequencyKHZ>>>>,
shared_policy_frequency_ranges: Arc<RwLock<Vec<RangeInclusive<FrequencyKHZ>>>>,
@@ -52,13 +53,6 @@ impl<'a> Scheduler<'a> {
use_mocking: bool,
power_cap: u64,
) -> Result<Self> {
- let bpf = BpfScheduler::init(
- open_object,
- 0, // exit_dump_len (buffer size of exit info, 0 = default)
- false, // partial (false = include all tasks)
- false, // debug (false = debug mode off)
- )?;
-
println!("Initializing energy-aware scheduler");
let shared_cpu_frequency_ranges: Arc<RwLock<Vec<RangeInclusive<FrequencyKHZ>>>> =
@@ -77,6 +71,11 @@ impl<'a> Scheduler<'a> {
shared_cpu_current_frequencies.clone(),
)?;
+ let (task_sender, empty_task_infos) = mpsc::sync_channel(200);
+ std::thread::spawn(move || loop {
+ task_sender.send(Arc::new(TaskInfo::default()));
+ });
+
let topology = Topology::new().unwrap();
let mut e_core_ids = Vec::new();
let mut p_core_ids = Vec::new();
@@ -111,6 +110,15 @@ impl<'a> Scheduler<'a> {
.try_send(FrequencyRequest::GetPossibleCPUFrequencyRange)
.unwrap();
+ std::thread::sleep(Duration::from_secs(1));
+
+ let bpf = BpfScheduler::init(
+ open_object,
+ 0, // exit_dump_len (buffer size of exit info, 0 = default)
+ false, // partial (false = include all tasks)
+ false, // debug (false = debug mode off)
+ )?;
+
Ok(Self {
bpf,
task_queue: VecDeque::new(),
@@ -119,6 +127,7 @@ impl<'a> Scheduler<'a> {
maximum_budget: u64::MAX,
own_pid: process::id() as i32,
p_cores,
+ empty_task_infos,
tasks_scheduled: 0,
e_cores,
topology,
@@ -164,11 +173,9 @@ impl<'a> Scheduler<'a> {
std::collections::hash_map::Entry::Vacant(e) => {
let is_e_core = self.e_cores.contains(&task.cpu);
// New task - register it with the energy service
- let task_info = Arc::new(TaskInfo {
- cpu: AtomicI32::new(task.cpu),
- running_on_e_core: AtomicBool::new(is_e_core),
- ..Default::default()
- });
+ let task_info = self.empty_task_infos.recv().unwrap();
+ task_info.set_cpu(task.cpu);
+ task_info.set_running_on_e_core(is_e_core);
e.insert(Task {
task_info: task_info.clone(),
last_scheduled: Instant::now(),