summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDennis Kobert <dennis@kobert.dev>2025-02-26 18:30:47 +0100
committerDennis Kobert <dennis@kobert.dev>2025-02-26 18:30:47 +0100
commit7de5af67e21714a8e76f4e570478011a9b21901f (patch)
tree54ed1d967533317f0657083ce052bf4dbb4afe22
parent2a374e447e624e9402ea823152490d249940102e (diff)
Implement basic ioctl abstractions
-rw-r--r--.gitignore3
-rw-r--r--Cargo.lock7
-rw-r--r--Cargo.toml1
-rw-r--r--src/mock.rs56
4 files changed, 61 insertions, 6 deletions
diff --git a/.gitignore b/.gitignore
index ea8c4bf..7c7ffae 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1 +1,4 @@
/target
+intf.h
+main.bpf.c
+src/bpf.rs
diff --git a/Cargo.lock b/Cargo.lock
index c5cd7ea..a87b2b4 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -420,6 +420,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70"
[[package]]
+name = "iocuddle"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d8972d5be69940353d5347a1344cb375d9b457d6809b428b05bb1ca2fb9ce007"
+
+[[package]]
name = "is_terminal_polyfill"
version = "1.70.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -626,6 +632,7 @@ version = "0.1.0"
dependencies = [
"anyhow",
"ctrlc",
+ "iocuddle",
"libbpf-rs 0.24.8",
"libc",
"plain",
diff --git a/Cargo.toml b/Cargo.toml
index 61ec338..85976a4 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -12,6 +12,7 @@ plain = "0.2.3"
scx_utils = "1.0.11"
scx_rustland_core = "2.2.8"
rand = "0.9.0"
+iocuddle = "0.1.1"
[build-dependencies]
scx_rustland_core = "2.2.8"
diff --git a/src/mock.rs b/src/mock.rs
index ac4fa75..4ee9ed4 100644
--- a/src/mock.rs
+++ b/src/mock.rs
@@ -1,20 +1,64 @@
+use iocuddle::*;
use libc::rand;
use rand::Rng;
trait KernelModule {
- fn start_trace(pid: u64) {}
- fn stop_trace(pid: u64) {}
- fn read_consumption(pid: u64) -> u64 {}
+ fn start_trace(&mut self, _pid: u64) {}
+ fn stop_trace(&mut self, _pid: u64) {}
+ fn read_consumption(&mut self, pid: u64) -> u64;
}
struct MockModule;
impl KernelModule for MockModule {
- fn start_trace(pid: u64) {}
+ fn start_trace(&mut self, pid: u64) {
+ println!("starting trace of {pid}");
+ }
- fn stop_trace(pid: u64) {}
+ fn stop_trace(&mut self, pid: u64) {
+ println!("stopping trace of {pid}");
+ }
- fn read_consumption(pid: u64) -> u64 {
+ fn read_consumption(&mut self, _pid: u64) -> u64 {
rand::rng().random()
}
}
+
+#[derive(Debug)]
+struct KernelDriver {
+ file: std::fs::File,
+}
+
+impl Default for KernelDriver {
+ fn default() -> Self {
+ KernelDriver::new("/dev/rust").unwrap()
+ }
+}
+impl KernelDriver {
+ fn new(path: impl AsRef<std::path::Path>) -> Result<Self, std::io::Error> {
+ let file = std::fs::File::open(path)?;
+ Ok(Self { file })
+ }
+}
+
+const PERF_MON: Group = Group::new(b'|');
+const PREFIX: u8 = b'|';
+const START_TRACE: Ioctl<Write, &u64> = unsafe { PERF_MON.write(0x0) };
+const STOP_TRACE: Ioctl<Write, &u64> = unsafe { PERF_MON.write(0x1) };
+const READ_POWER: Ioctl<WriteRead, &u64> = unsafe { PERF_MON.write_read(0x2) };
+
+impl KernelModule for KernelDriver {
+ fn start_trace(&mut self, pid: u64) {
+ START_TRACE.ioctl(&mut self.file, &pid).unwrap();
+ }
+
+ fn stop_trace(&mut self, pid: u64) {
+ STOP_TRACE.ioctl(&mut self.file, &pid).unwrap();
+ }
+
+ fn read_consumption(&mut self, pid: u64) -> u64 {
+ let mut arg = pid;
+ READ_POWER.ioctl(&mut self.file, &mut arg).unwrap();
+ arg
+ }
+}