diff --git a/Cargo.lock b/Cargo.lock index b04eee5..3dc817a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -16,9 +16,9 @@ dependencies = [ [[package]] name = "aho-corasick" -version = "0.7.19" +version = "0.7.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4f55bd91a0978cbfd91c457a164bab8b4001c833b7f323132c0a4e1922dd44e" +checksum = "cc936419f96fa211c1b9166887b38e5e40b19958e5b895be7c1f93adec7071ac" dependencies = [ "memchr", ] @@ -38,9 +38,9 @@ checksum = "216261ddc8289130e551ddcd5ce8a064710c0d064a4d2895c67151c92b5443f6" [[package]] name = "ash" -version = "0.37.0+1.3.209" +version = "0.37.1+1.3.235" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "006ca68e0f2b03f22d6fa9f2860f85aed430d257fec20f8879b2145e7c7ae1a6" +checksum = "911015c962d56e2e4052f40182ca5462ba60a3d2ff04e827c365a0ab3d65726d" dependencies = [ "libloading", ] @@ -112,9 +112,9 @@ dependencies = [ [[package]] name = "bytes" -version = "1.2.1" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec8a7b6a70fde80372154c65702f00a0f56f3e1c36abbc6c440484be248856db" +checksum = "dfb24e866b15a1af2a1b663f10c6b6b8f397a84aadb828f12e5b289ec23a3a3c" [[package]] name = "cairo-rs" @@ -186,9 +186,9 @@ dependencies = [ [[package]] name = "crossbeam-queue" -version = "0.3.6" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cd42583b04998a5363558e5f9291ee5a5ff6b49944332103f251e7479a82aa7" +checksum = "d1cfb3ea8a53f37c40dea2c7bedcbd88bdfae54f5e2175d6ecaff1c988353add" dependencies = [ "cfg-if", "crossbeam-utils", @@ -196,9 +196,9 @@ dependencies = [ [[package]] name = "crossbeam-utils" -version = "0.8.12" +version = "0.8.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edbafec5fa1f196ca66527c1b12c2ec4745ca14b50f1ad8f9f6f720b55d11fac" +checksum = "4fb766fa798726286dbbb842f174001dab8abc7b627a1dd86e0b7222a95d929f" dependencies = [ "cfg-if", ] @@ -558,6 +558,7 @@ dependencies = [ "amdgpu-sysfs", "anyhow", "bincode", + "indexmap", "lact-schema", "nix", "pciid-parser", @@ -786,9 +787,9 @@ dependencies = [ [[package]] name = "pest" -version = "2.4.1" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a528564cc62c19a7acac4d81e01f39e53e25e17b934878f4c6d25cc2836e62f8" +checksum = "5f400b0f7905bf702f9f3dc3df5a121b16c54e9e8012c082905fdf09a931861a" dependencies = [ "thiserror", "ucd-trie", @@ -961,9 +962,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.88" +version = "1.0.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e8b3801309262e8184d9687fb697586833e939767aea0dda89f5a8e650e8bd7" +checksum = "020ff22c755c2ed3f8cf162dbb41a7268d934702f3ed3631656ea597e08fc3db" dependencies = [ "itoa", "ryu", @@ -1227,7 +1228,7 @@ dependencies = [ [[package]] name = "vulkano" version = "0.32.0" -source = "git+https://github.com/vulkano-rs/vulkano#89e1c56db4c94752e9444483ebd1c12bdb135128" +source = "git+https://github.com/vulkano-rs/vulkano#ebcea02c1e9fd4db62d6dd52c058544351140e36" dependencies = [ "ahash", "ash", @@ -1237,9 +1238,9 @@ dependencies = [ "half", "heck", "indexmap", - "lazy_static", "libloading", "objc", + "once_cell", "parking_lot", "proc-macro2", "quote", diff --git a/lact-daemon/Cargo.toml b/lact-daemon/Cargo.toml index f576468..9a8aaa5 100644 --- a/lact-daemon/Cargo.toml +++ b/lact-daemon/Cargo.toml @@ -27,3 +27,4 @@ tracing = "0.1" tracing-subscriber = "0.3" vulkano = { git = "https://github.com/vulkano-rs/vulkano" } lact-schema = { path = "../lact-schema" } +indexmap = { version = "1.9", features = ["serde"] } diff --git a/lact-daemon/src/server/gpu_controller/mod.rs b/lact-daemon/src/server/gpu_controller/mod.rs index afa837a..4b798a5 100644 --- a/lact-daemon/src/server/gpu_controller/mod.rs +++ b/lact-daemon/src/server/gpu_controller/mod.rs @@ -5,10 +5,11 @@ use super::vulkan::get_vulkan_info; use crate::fork::run_forked; use amdgpu_sysfs::{ error::Error, - gpu_handle::GpuHandle, + gpu_handle::{GpuHandle, PowerLevels, PowerStateKind}, hw_mon::{FanControlMethod, HwMon}, }; use anyhow::{anyhow, Context}; +use indexmap::IndexMap; use lact_schema::{ ClocksInfo, ClockspeedStats, DeviceInfo, DeviceStats, FanStats, GpuPciInfo, LinkInfo, PciInfo, PowerStats, VoltageStats, VramStats, @@ -25,6 +26,13 @@ use tracing::{debug, error, info, trace, warn}; type FanControlHandle = (Arc, JoinHandle<()>, FanCurve); +const POWER_LEVEL_TYPES: [PowerStateKind; 4] = [ + PowerStateKind::CoreClock, + PowerStateKind::MemoryClock, + PowerStateKind::PcieSpeed, + PowerStateKind::SOCClock, +]; + pub struct GpuController { pub handle: GpuHandle, pub pci_info: Option, @@ -109,7 +117,7 @@ impl GpuController { let driver = self.handle.get_driver(); let vbios_version = self.handle.get_vbios_version().ok(); let link_info = self.get_link_info(); - let clocks_table = self.handle.get_power_table().ok(); + let clocks_table = self.handle.get_clocks_table().ok(); let clocks_info = clocks_table .as_ref() .map_or_else(Default::default, ClocksInfo::from); @@ -172,6 +180,7 @@ impl GpuController { temps: self.hw_mon_map(HwMon::get_temps).unwrap_or_default(), busy_percent: self.handle.get_busy_percent().ok(), performance_level: self.handle.get_power_force_performance_level().ok(), + power_levels: self.read_power_levels(), }) } @@ -268,4 +277,16 @@ impl GpuController { } Ok(()) } + + fn read_power_levels(&self) -> IndexMap { + let mut map = IndexMap::with_capacity(POWER_LEVEL_TYPES.len()); + + for kind in POWER_LEVEL_TYPES { + if let Ok(levels) = self.handle.get_power_levels(kind) { + map.insert(kind, levels); + } + } + + map + } } diff --git a/lact-schema/Cargo.toml b/lact-schema/Cargo.toml index ff35d25..413ee7d 100644 --- a/lact-schema/Cargo.toml +++ b/lact-schema/Cargo.toml @@ -6,7 +6,7 @@ edition = "2021" [dependencies] amdgpu-sysfs = { path = "../../amdgpu-sysfs-rs", features = ["serde"] } serde = { version = "1.0", features = ["derive"] } -indexmap = { version = "1.9", features = ["serde"] } +indexmap = { version = "*", features = ["serde"] } [dev-dependencies] serde_json = "1.0" diff --git a/lact-schema/src/lib.rs b/lact-schema/src/lib.rs index ef8046e..97b1a13 100644 --- a/lact-schema/src/lib.rs +++ b/lact-schema/src/lib.rs @@ -4,6 +4,7 @@ mod response; #[cfg(test)] mod tests; +use amdgpu_sysfs::gpu_handle::{PowerLevels, PowerStateKind}; pub use request::Request; pub use response::Response; @@ -111,6 +112,7 @@ pub struct DeviceStats { pub temps: HashMap, pub busy_percent: Option, pub performance_level: Option, + pub power_levels: IndexMap, } #[derive(Serialize, Deserialize, Debug, Clone)]