From c06551329f012a36d1b810f777e6f0f6b3b72795 Mon Sep 17 00:00:00 2001 From: Dennis Kobert Date: Tue, 1 Apr 2025 00:19:03 +0200 Subject: Alloc empty Task info structs on extra thread --- src/scheduler.rs | 31 +++++++++++++++++++------------ 1 file changed, 19 insertions(+), 12 deletions(-) (limited to 'src') 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, e_core_selector: Box, energy_sender: mpsc::SyncSender, + empty_task_infos: mpsc::Receiver>, frequency_sender: mpsc::SyncSender, shared_cpu_frequency_ranges: Arc>>>, shared_policy_frequency_ranges: Arc>>>, @@ -52,13 +53,6 @@ impl<'a> Scheduler<'a> { use_mocking: bool, power_cap: u64, ) -> Result { - 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>>> = @@ -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(), -- cgit v1.3.1