diff options
| author | Dennis Kobert <dennis@kobert.dev> | 2025-02-26 18:30:47 +0100 |
|---|---|---|
| committer | Dennis Kobert <dennis@kobert.dev> | 2025-02-26 18:30:47 +0100 |
| commit | 7de5af67e21714a8e76f4e570478011a9b21901f (patch) | |
| tree | 54ed1d967533317f0657083ce052bf4dbb4afe22 | |
| parent | 2a374e447e624e9402ea823152490d249940102e (diff) | |
Implement basic ioctl abstractions
| -rw-r--r-- | .gitignore | 3 | ||||
| -rw-r--r-- | Cargo.lock | 7 | ||||
| -rw-r--r-- | Cargo.toml | 1 | ||||
| -rw-r--r-- | src/mock.rs | 56 |
4 files changed, 61 insertions, 6 deletions
@@ -1 +1,4 @@ /target +intf.h +main.bpf.c +src/bpf.rs @@ -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", @@ -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 + } +} |
