From 7c2fb0be81b716f9c29561d2e62fb3b50bcb4478 Mon Sep 17 00:00:00 2001 From: Luke D Jones Date: Wed, 10 Mar 2021 10:15:59 +1300 Subject: [PATCH] Hotfix: Nvidia module handling improved --- CHANGELOG.md | 1 + Cargo.lock | 2 +- daemon/Cargo.toml | 2 +- daemon/src/ctrl_gfx/error.rs | 12 ------------ daemon/src/ctrl_gfx/gfx.rs | 36 +++++++++++++++++------------------- daemon/src/ctrl_gfx/mod.rs | 2 +- daemon/src/daemon.rs | 8 ++++---- daemon/src/error.rs | 4 ++++ 8 files changed, 29 insertions(+), 38 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f38ade97..8d12316f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] ### Changed - Test and create /etc/X11/xorg.conf.d/ if it doesn't exist +- Hotfix to better report module issues # [3.1.0] - 2021-03-10 ### Changed diff --git a/Cargo.lock b/Cargo.lock index 932bc6d8..0e6e699b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -187,7 +187,7 @@ dependencies = [ [[package]] name = "daemon" -version = "3.1.1" +version = "3.1.2" dependencies = [ "env_logger", "intel-pstate", diff --git a/daemon/Cargo.toml b/daemon/Cargo.toml index 7a75730a..d85b10c3 100644 --- a/daemon/Cargo.toml +++ b/daemon/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "daemon" -version = "3.1.1" +version = "3.1.2" license = "MPL-2.0" readme = "README.md" authors = ["Luke "] diff --git a/daemon/src/ctrl_gfx/error.rs b/daemon/src/ctrl_gfx/error.rs index 824a2575..73bff37f 100644 --- a/daemon/src/ctrl_gfx/error.rs +++ b/daemon/src/ctrl_gfx/error.rs @@ -6,13 +6,7 @@ use crate::error::RogError; #[derive(Debug)] pub enum GfxError { ParseVendor, - Path(String, std::io::Error), - Read(String, std::io::Error), - Write(String, std::io::Error), - Module(String, std::io::Error), Bus(String, std::io::Error), - Command(String, std::io::Error), - Modprobe(String), DisplayManager(String), } @@ -21,13 +15,7 @@ impl fmt::Display for GfxError { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { match self { GfxError::ParseVendor => write!(f, "Could not parse vendor name"), - GfxError::Path(path, error) => write!(f, "Path {}: {}", path, error), - GfxError::Read(path, error) => write!(f, "Read {}: {}", path, error), - GfxError::Write(path, error) => write!(f, "Write {}: {}", path, error), - GfxError::Module(func, error) => write!(f, "Module error: {}: {}", func, error), GfxError::Bus(func, error) => write!(f, "Bus error: {}: {}", func, error), - GfxError::Command(func, error) => write!(f, "Command exec error: {}: {}", func, error), - GfxError::Modprobe(detail) => write!(f, "Modprobe error: {}", detail), GfxError::DisplayManager(detail) => write!(f, "Display manager: {}", detail), } } diff --git a/daemon/src/ctrl_gfx/gfx.rs b/daemon/src/ctrl_gfx/gfx.rs index d7734c75..7a9c4679 100644 --- a/daemon/src/ctrl_gfx/gfx.rs +++ b/daemon/src/ctrl_gfx/gfx.rs @@ -48,7 +48,7 @@ impl Dbus for CtrlGraphics { fn set_vendor(&mut self, vendor: String) { if let Ok(tmp) = GfxVendors::from_str(&vendor) { let msg = self.set_gfx_config(tmp).unwrap_or_else(|err| { - warn!("{}", err); + error!("{}", err); format!("Failed: {}", err.to_string()) }); self.notify_gfx(&vendor) @@ -173,7 +173,7 @@ impl CtrlGraphics { fn get_runtime_status() -> Result { const PATH: &str = "/sys/bus/pci/devices/0000:01:00.0/power/runtime_status"; - let buf = std::fs::read_to_string(PATH).map_err(|err| GfxError::Read(PATH.into(), err))?; + let buf = std::fs::read_to_string(PATH).map_err(|err| RogError::Read(PATH.into(), err))?; Ok(buf) } @@ -190,7 +190,7 @@ impl CtrlGraphics { .arg(action) .arg("nvidia-fallback.service") .status() - .map_err(|err| GfxError::Command("systemctl".into(), err))?; + .map_err(|err| RogError::Command("systemctl".into(), err))?; if !status.success() { // Error is ignored in case this service is removed @@ -211,7 +211,7 @@ impl CtrlGraphics { }; if !Path::new(XORG_PATH).exists() { - std::fs::create_dir(XORG_PATH).map_err(|err| GfxError::Write(XORG_PATH.into(), err))?; + std::fs::create_dir(XORG_PATH).map_err(|err| RogError::Write(XORG_PATH.into(), err))?; } let file = XORG_PATH.to_string().add(XORG_FILE); @@ -221,11 +221,11 @@ impl CtrlGraphics { .truncate(true) .write(true) .open(&file) - .map_err(|err| GfxError::Write(file, err))?; + .map_err(|err| RogError::Write(file, err))?; file.write_all(&text) .and_then(|_| file.sync_all()) - .map_err(|err| GfxError::Write(MODPROBE_PATH.into(), err))?; + .map_err(|err| RogError::Write(MODPROBE_PATH.into(), err))?; Ok(()) } @@ -237,11 +237,11 @@ impl CtrlGraphics { .truncate(true) .write(true) .open(MODPROBE_PATH) - .map_err(|err| GfxError::Path(MODPROBE_PATH.into(), err))?; + .map_err(|err| RogError::Path(MODPROBE_PATH.into(), err))?; file.write_all(MODPROBE_BASE) .and_then(|_| file.sync_all()) - .map_err(|err| GfxError::Write(MODPROBE_PATH.into(), err))?; + .map_err(|err| RogError::Write(MODPROBE_PATH.into(), err))?; Ok(()) } @@ -254,7 +254,7 @@ impl CtrlGraphics { let removes = self.nvidia.iter().map(|dev| dev.remove()); Result::from_iter(unbinds.chain(removes)) - .map_err(|err| GfxError::Command("device unbind error".into(), err))?; + .map_err(|err| RogError::Command("device unbind error".into(), err))?; Ok(()) } @@ -263,13 +263,12 @@ impl CtrlGraphics { let mut cmd = Command::new(action); cmd.arg(driver); - let status = cmd - .status() - .map_err(|err| GfxError::Command(format!("{:?}", cmd), err))?; - if !status.success() { - let msg = format!("{} {} failed: {:?}", action, driver, status); - error!("{}", msg); - return Err(GfxError::Modprobe(msg).into()); + let output = cmd + .output() + .map_err(|err| RogError::Command(format!("{:?}", cmd), err))?; + if !output.status.success() { + let msg = format!("{} {} failed: {:?}", action, driver, String::from_utf8_lossy(&output.stderr)); + return Err(RogError::Modprobe(msg)); } Ok(()) } @@ -281,13 +280,12 @@ impl CtrlGraphics { let status = cmd .status() - .map_err(|err| GfxError::Command(format!("{:?}", cmd), err))?; + .map_err(|err| RogError::Command(format!("{:?}", cmd), err))?; if !status.success() { let msg = format!( "systemctl {} {} failed: {:?}", action, DISPLAY_MANAGER, status ); - error!("{}", msg); return Err(GfxError::DisplayManager(msg).into()); } Ok(()) @@ -303,7 +301,7 @@ impl CtrlGraphics { while count <= 4 { let output = cmd .output() - .map_err(|err| GfxError::Command(format!("{:?}", cmd), err))?; + .map_err(|err| RogError::Command(format!("{:?}", cmd), err))?; if output.stdout.starts_with("inactive".as_bytes()) { return Ok(()); } diff --git a/daemon/src/ctrl_gfx/mod.rs b/daemon/src/ctrl_gfx/mod.rs index 0966ed74..0b293766 100644 --- a/daemon/src/ctrl_gfx/mod.rs +++ b/daemon/src/ctrl_gfx/mod.rs @@ -4,7 +4,7 @@ pub mod gfx; pub mod system; -const NVIDIA_DRIVERS: [&str; 4] = ["nvidia_drm", "nvidia_uvm", "nvidia_modeset", "nvidia"]; +const NVIDIA_DRIVERS: [&str; 4] = ["nvidia_drm", "nvidia_modeset", "nvidia_uvm", "nvidia"]; const DISPLAY_MANAGER: &str = "display-manager.service"; diff --git a/daemon/src/daemon.rs b/daemon/src/daemon.rs index ec90520d..139ad676 100644 --- a/daemon/src/daemon.rs +++ b/daemon/src/daemon.rs @@ -31,9 +31,9 @@ pub fn main() -> Result<(), Box> { .filter(None, LevelFilter::Info) .init(); - info!("daemon version {}", daemon::VERSION); - info!(" rog-dbus version {}", rog_dbus::VERSION); - info!("rog-types version {}", rog_types::VERSION); + info!(" daemon v{}", daemon::VERSION); + info!(" rog-dbus v{}", rog_dbus::VERSION); + info!("rog-types v{}", rog_types::VERSION); start_daemon()?; Ok(()) @@ -121,7 +121,7 @@ fn start_daemon() -> Result<(), Box> { } } ctrl.reload() - .unwrap_or_else(|err| warn!("Gfx controller: {}", err)); + .unwrap_or_else(|err| error!("Gfx controller: {}", err)); ctrl.add_to_server(&mut object_server); } Err(err) => { diff --git a/daemon/src/error.rs b/daemon/src/error.rs index 25953a3c..971e8f66 100644 --- a/daemon/src/error.rs +++ b/daemon/src/error.rs @@ -26,6 +26,8 @@ pub enum RogError { ReloadFail(String), GfxSwitching(GfxError), Initramfs(String), + Modprobe(String), + Command(String, std::io::Error), } impl fmt::Display for RogError { @@ -50,6 +52,8 @@ impl fmt::Display for RogError { RogError::ReloadFail(deets) => write!(f, "Task error: {}", deets), RogError::GfxSwitching(deets) => write!(f, "Graphics switching error: {}", deets), RogError::Initramfs(detail) => write!(f, "Initiramfs error: {}", detail), + RogError::Modprobe(detail) => write!(f, "Modprobe error: {}", detail), + RogError::Command(func, error) => write!(f, "Command exec error: {}: {}", func, error), } } }