Hotfix: Nvidia module handling improved

This commit is contained in:
Luke D Jones
2021-03-10 10:15:59 +13:00
parent b05f680650
commit 7c2fb0be81
8 changed files with 29 additions and 38 deletions

View File

@@ -7,6 +7,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## [Unreleased] ## [Unreleased]
### Changed ### Changed
- Test and create /etc/X11/xorg.conf.d/ if it doesn't exist - 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 # [3.1.0] - 2021-03-10
### Changed ### Changed

2
Cargo.lock generated
View File

@@ -187,7 +187,7 @@ dependencies = [
[[package]] [[package]]
name = "daemon" name = "daemon"
version = "3.1.1" version = "3.1.2"
dependencies = [ dependencies = [
"env_logger", "env_logger",
"intel-pstate", "intel-pstate",

View File

@@ -1,6 +1,6 @@
[package] [package]
name = "daemon" name = "daemon"
version = "3.1.1" version = "3.1.2"
license = "MPL-2.0" license = "MPL-2.0"
readme = "README.md" readme = "README.md"
authors = ["Luke <luke@ljones.dev>"] authors = ["Luke <luke@ljones.dev>"]

View File

@@ -6,13 +6,7 @@ use crate::error::RogError;
#[derive(Debug)] #[derive(Debug)]
pub enum GfxError { pub enum GfxError {
ParseVendor, 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), Bus(String, std::io::Error),
Command(String, std::io::Error),
Modprobe(String),
DisplayManager(String), DisplayManager(String),
} }
@@ -21,13 +15,7 @@ impl fmt::Display for GfxError {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match self { match self {
GfxError::ParseVendor => write!(f, "Could not parse vendor name"), 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::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), GfxError::DisplayManager(detail) => write!(f, "Display manager: {}", detail),
} }
} }

View File

@@ -48,7 +48,7 @@ impl Dbus for CtrlGraphics {
fn set_vendor(&mut self, vendor: String) { fn set_vendor(&mut self, vendor: String) {
if let Ok(tmp) = GfxVendors::from_str(&vendor) { if let Ok(tmp) = GfxVendors::from_str(&vendor) {
let msg = self.set_gfx_config(tmp).unwrap_or_else(|err| { let msg = self.set_gfx_config(tmp).unwrap_or_else(|err| {
warn!("{}", err); error!("{}", err);
format!("Failed: {}", err.to_string()) format!("Failed: {}", err.to_string())
}); });
self.notify_gfx(&vendor) self.notify_gfx(&vendor)
@@ -173,7 +173,7 @@ impl CtrlGraphics {
fn get_runtime_status() -> Result<String, RogError> { fn get_runtime_status() -> Result<String, RogError> {
const PATH: &str = "/sys/bus/pci/devices/0000:01:00.0/power/runtime_status"; 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) Ok(buf)
} }
@@ -190,7 +190,7 @@ impl CtrlGraphics {
.arg(action) .arg(action)
.arg("nvidia-fallback.service") .arg("nvidia-fallback.service")
.status() .status()
.map_err(|err| GfxError::Command("systemctl".into(), err))?; .map_err(|err| RogError::Command("systemctl".into(), err))?;
if !status.success() { if !status.success() {
// Error is ignored in case this service is removed // Error is ignored in case this service is removed
@@ -211,7 +211,7 @@ impl CtrlGraphics {
}; };
if !Path::new(XORG_PATH).exists() { 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); let file = XORG_PATH.to_string().add(XORG_FILE);
@@ -221,11 +221,11 @@ impl CtrlGraphics {
.truncate(true) .truncate(true)
.write(true) .write(true)
.open(&file) .open(&file)
.map_err(|err| GfxError::Write(file, err))?; .map_err(|err| RogError::Write(file, err))?;
file.write_all(&text) file.write_all(&text)
.and_then(|_| file.sync_all()) .and_then(|_| file.sync_all())
.map_err(|err| GfxError::Write(MODPROBE_PATH.into(), err))?; .map_err(|err| RogError::Write(MODPROBE_PATH.into(), err))?;
Ok(()) Ok(())
} }
@@ -237,11 +237,11 @@ impl CtrlGraphics {
.truncate(true) .truncate(true)
.write(true) .write(true)
.open(MODPROBE_PATH) .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) file.write_all(MODPROBE_BASE)
.and_then(|_| file.sync_all()) .and_then(|_| file.sync_all())
.map_err(|err| GfxError::Write(MODPROBE_PATH.into(), err))?; .map_err(|err| RogError::Write(MODPROBE_PATH.into(), err))?;
Ok(()) Ok(())
} }
@@ -254,7 +254,7 @@ impl CtrlGraphics {
let removes = self.nvidia.iter().map(|dev| dev.remove()); let removes = self.nvidia.iter().map(|dev| dev.remove());
Result::from_iter(unbinds.chain(removes)) 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(()) Ok(())
} }
@@ -263,13 +263,12 @@ impl CtrlGraphics {
let mut cmd = Command::new(action); let mut cmd = Command::new(action);
cmd.arg(driver); cmd.arg(driver);
let status = cmd let output = cmd
.status() .output()
.map_err(|err| GfxError::Command(format!("{:?}", cmd), err))?; .map_err(|err| RogError::Command(format!("{:?}", cmd), err))?;
if !status.success() { if !output.status.success() {
let msg = format!("{} {} failed: {:?}", action, driver, status); let msg = format!("{} {} failed: {:?}", action, driver, String::from_utf8_lossy(&output.stderr));
error!("{}", msg); return Err(RogError::Modprobe(msg));
return Err(GfxError::Modprobe(msg).into());
} }
Ok(()) Ok(())
} }
@@ -281,13 +280,12 @@ impl CtrlGraphics {
let status = cmd let status = cmd
.status() .status()
.map_err(|err| GfxError::Command(format!("{:?}", cmd), err))?; .map_err(|err| RogError::Command(format!("{:?}", cmd), err))?;
if !status.success() { if !status.success() {
let msg = format!( let msg = format!(
"systemctl {} {} failed: {:?}", "systemctl {} {} failed: {:?}",
action, DISPLAY_MANAGER, status action, DISPLAY_MANAGER, status
); );
error!("{}", msg);
return Err(GfxError::DisplayManager(msg).into()); return Err(GfxError::DisplayManager(msg).into());
} }
Ok(()) Ok(())
@@ -303,7 +301,7 @@ impl CtrlGraphics {
while count <= 4 { while count <= 4 {
let output = cmd let output = cmd
.output() .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()) { if output.stdout.starts_with("inactive".as_bytes()) {
return Ok(()); return Ok(());
} }

View File

@@ -4,7 +4,7 @@ pub mod gfx;
pub mod system; 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"; const DISPLAY_MANAGER: &str = "display-manager.service";

View File

@@ -31,9 +31,9 @@ pub fn main() -> Result<(), Box<dyn std::error::Error>> {
.filter(None, LevelFilter::Info) .filter(None, LevelFilter::Info)
.init(); .init();
info!("daemon version {}", daemon::VERSION); info!(" daemon v{}", daemon::VERSION);
info!(" rog-dbus version {}", rog_dbus::VERSION); info!(" rog-dbus v{}", rog_dbus::VERSION);
info!("rog-types version {}", rog_types::VERSION); info!("rog-types v{}", rog_types::VERSION);
start_daemon()?; start_daemon()?;
Ok(()) Ok(())
@@ -121,7 +121,7 @@ fn start_daemon() -> Result<(), Box<dyn Error>> {
} }
} }
ctrl.reload() 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); ctrl.add_to_server(&mut object_server);
} }
Err(err) => { Err(err) => {

View File

@@ -26,6 +26,8 @@ pub enum RogError {
ReloadFail(String), ReloadFail(String),
GfxSwitching(GfxError), GfxSwitching(GfxError),
Initramfs(String), Initramfs(String),
Modprobe(String),
Command(String, std::io::Error),
} }
impl fmt::Display for RogError { impl fmt::Display for RogError {
@@ -50,6 +52,8 @@ impl fmt::Display for RogError {
RogError::ReloadFail(deets) => write!(f, "Task error: {}", deets), RogError::ReloadFail(deets) => write!(f, "Task error: {}", deets),
RogError::GfxSwitching(deets) => write!(f, "Graphics switching error: {}", deets), RogError::GfxSwitching(deets) => write!(f, "Graphics switching error: {}", deets),
RogError::Initramfs(detail) => write!(f, "Initiramfs error: {}", detail), 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),
} }
} }
} }