diff options
-rw-r--r-- | Cargo.lock | 125 | ||||
-rw-r--r-- | Cargo.toml | 1 | ||||
-rw-r--r-- | src/main.rs | 33 | ||||
-rw-r--r-- | src/task_state.rs | 2 |
4 files changed, 156 insertions, 5 deletions
@@ -275,6 +275,12 @@ dependencies = [ ] [[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] name = "crossbeam" version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -588,6 +594,15 @@ dependencies = [ ] [[package]] +name = "ntapi" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8a3895c6391c39d7fe7ebc444a87eb2991b2a0bc718fdabd071eec617fc68e4" +dependencies = [ + "winapi", +] + +[[package]] name = "num-conv" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -660,6 +675,7 @@ dependencies = [ "rand", "scx_rustland_core", "scx_utils", + "sysinfo", ] [[package]] @@ -743,6 +759,26 @@ dependencies = [ ] [[package]] +name = "rayon" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] + +[[package]] name = "redox_syscall" version = "0.5.9" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -984,6 +1020,20 @@ dependencies = [ ] [[package]] +name = "sysinfo" +version = "0.33.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fc858248ea01b66f19d8e8a6d55f41deaf91e9d495246fd01368d99935c6c01" +dependencies = [ + "core-foundation-sys", + "libc", + "memchr", + "ntapi", + "rayon", + "windows", +] + +[[package]] name = "tap" version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -1147,6 +1197,22 @@ dependencies = [ ] [[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] name = "winapi-util" version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -1156,6 +1222,65 @@ dependencies = [ ] [[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows" +version = "0.57.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12342cb4d8e3b046f3d80effd474a7a02447231330ef77d71daa6fbc40681143" +dependencies = [ + "windows-core", + "windows-targets", +] + +[[package]] +name = "windows-core" +version = "0.57.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2ed2439a290666cd67ecce2b0ffaad89c2a56b976b736e6ece670297897832d" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-result", + "windows-targets", +] + +[[package]] +name = "windows-implement" +version = "0.57.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9107ddc059d5b6fbfbffdfa7a7fe3e22a226def0b2608f72e9d552763d3e1ad7" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "windows-interface" +version = "0.57.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29bee4b38ea3cde66011baa44dba677c432a78593e202392d1e9070cf2a7fca7" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "windows-result" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e383302e8ec8515204254685643de10811af0ed97ea37210dc26fb0032647f8" +dependencies = [ + "windows-targets", +] + +[[package]] name = "windows-sys" version = "0.59.0" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -15,6 +15,7 @@ rand = "0.9.0" iocuddle = "0.1.1" clap = { version = "4.5" , features = ["derive"] } perf-event = "0.4.8" +sysinfo = "0.33.1" [build-dependencies] scx_rustland_core = "2.2.8" diff --git a/src/main.rs b/src/main.rs index 36f22eb..6cbc1fa 100644 --- a/src/main.rs +++ b/src/main.rs @@ -18,6 +18,7 @@ use libbpf_rs::OpenObject; use task_state::TaskState; use mock::{MockModule, KernelModule, KernelDriver}; +use sysinfo::System; use std::collections::{HashMap, VecDeque}; use std::fs::File; use std::io::{BufRead, BufReader}; @@ -40,7 +41,8 @@ struct Scheduler<'a> { own_pid: u32, p_cores: Range<i32>, e_cores: Range<i32>, - e_core_selector: Box<dyn ECoreSelector> + e_core_selector: Box<dyn ECoreSelector>, + system: System, } impl<'a> Scheduler<'a> { @@ -77,6 +79,10 @@ impl<'a> Scheduler<'a> { }; let selector = Box::new(RoundRobinSelector::new(&e_cores)); + + let mut system = System::new_all(); + system.refresh_processes(sysinfo::ProcessesToUpdate::All, true); + Ok(Self { bpf, module, @@ -89,6 +95,7 @@ impl<'a> Scheduler<'a> { p_cores, e_cores, e_core_selector: selector, + system }) } @@ -195,9 +202,11 @@ impl<'a> Scheduler<'a> { fn dispatch_tasks(&mut self) { loop { - //TODO: we should probably not do this every time, and instead wait a predefined amount of time + //TODO: we should probably not do this every time, but instead wait a predefined amount of time between invocations self.reset_budgets_and_garbage_collect(); - + //TODO: we should probably not do this every time, but instead wait a predefined amount of time between invocations + self.refresh_children(); + // Consume all tasks before dispatching any. self.consume_all_tasks(); @@ -240,9 +249,25 @@ impl<'a> Scheduler<'a> { was_scheduled }); } + + //TODO: this is probably not very efficient + fn refresh_children(&mut self) { + self.system.refresh_processes(sysinfo::ProcessesToUpdate::All, true); + for entry in self.managed_tasks.values_mut() { + entry.children.clear(); + } + + for (pid, process) in self.system.processes() { + if let Some(parent_pid) = process.parent() { + if let Some(entry) = self.managed_tasks.get_mut(&parent_pid.as_u32()) { + entry.children.push(pid.as_u32()); + } + } + } + } + } -//TODO: get children fn main() -> Result<()> { let matches = Command::new("Energy User Space Scheduler") .arg(Arg::new("mock") diff --git a/src/task_state.rs b/src/task_state.rs index 3d1db4c..e56b109 100644 --- a/src/task_state.rs +++ b/src/task_state.rs @@ -1,5 +1,5 @@ pub struct TaskState { pub previous_energy_usage: u64, pub budget: u64, - pub children: Vec<u64>, + pub children: Vec<u32>, }
\ No newline at end of file |