summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Cargo.lock125
-rw-r--r--Cargo.toml1
-rw-r--r--src/main.rs33
-rw-r--r--src/task_state.rs2
4 files changed, 156 insertions, 5 deletions
diff --git a/Cargo.lock b/Cargo.lock
index a5f1be8..6710683 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -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"
diff --git a/Cargo.toml b/Cargo.toml
index 0495ed6..9b36ff8 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -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