diff --git a/alioth/src/errors.rs b/alioth/src/errors.rs index f055bfe8..452368c0 100644 --- a/alioth/src/errors.rs +++ b/alioth/src/errors.rs @@ -15,6 +15,8 @@ use std::error::Error; use std::fmt; +use snafu::{ErrorCompat, IntoError, ResultExt}; + pub use macros::{DebugTrace, trace_error}; pub trait DebugTrace: Error { @@ -27,8 +29,22 @@ impl Error for Box { } } -pub fn boxed_debug_trace( - e: E, -) -> Box { - Box::new(e) +pub trait BoxTrace<'a, T> { + fn box_trace(self, context: C) -> Result + where + C: IntoError>, + E: Error + ErrorCompat; +} + +impl<'a, T, E1> BoxTrace<'a, T> for Result +where + E1: DebugTrace + Send + Sync + 'a, +{ + fn box_trace(self, context: C) -> Result + where + C: IntoError>, + E: Error + ErrorCompat, + { + self.map_err(|e| Box::new(e) as _).context(context) + } } diff --git a/alioth/src/vfio/container.rs b/alioth/src/vfio/container.rs index 452b2887..ad2da49f 100644 --- a/alioth/src/vfio/container.rs +++ b/alioth/src/vfio/container.rs @@ -20,7 +20,7 @@ use std::sync::Arc; use parking_lot::Mutex; use snafu::ResultExt; -use crate::errors::boxed_debug_trace; +use crate::errors::BoxTrace; use crate::mem::mapped::ArcMemPages; use crate::mem::{self, LayoutChanged}; use crate::vfio::bindings::{ @@ -110,15 +110,13 @@ pub struct UpdateContainerMapping { impl LayoutChanged for UpdateContainerMapping { fn ram_added(&self, gpa: u64, pages: &ArcMemPages) -> mem::Result<()> { let ret = self.container.map(pages.addr(), gpa, pages.size()); - ret.map_err(boxed_debug_trace) - .context(mem::error::ChangeLayout)?; + ret.box_trace(mem::error::ChangeLayout)?; Ok(()) } fn ram_removed(&self, gpa: u64, pages: &ArcMemPages) -> mem::Result<()> { let ret = self.container.unmap(gpa, pages.size()); - ret.map_err(boxed_debug_trace) - .context(mem::error::ChangeLayout)?; + ret.box_trace(mem::error::ChangeLayout)?; Ok(()) } } diff --git a/alioth/src/vfio/iommu.rs b/alioth/src/vfio/iommu.rs index 715d08b0..18274dba 100644 --- a/alioth/src/vfio/iommu.rs +++ b/alioth/src/vfio/iommu.rs @@ -20,7 +20,7 @@ use std::sync::Arc; use snafu::ResultExt; -use crate::errors::boxed_debug_trace; +use crate::errors::BoxTrace; use crate::mem::mapped::ArcMemPages; use crate::mem::{self, LayoutChanged}; use crate::vfio::bindings::{ @@ -128,15 +128,13 @@ pub struct UpdateIommuIoas { impl LayoutChanged for UpdateIommuIoas { fn ram_added(&self, gpa: u64, pages: &ArcMemPages) -> mem::Result<()> { let ret = self.ioas.map(pages.addr(), gpa, pages.size()); - ret.map_err(boxed_debug_trace) - .context(mem::error::ChangeLayout)?; + ret.box_trace(mem::error::ChangeLayout)?; Ok(()) } fn ram_removed(&self, gpa: u64, pages: &ArcMemPages) -> mem::Result<()> { let ret = self.ioas.unmap(gpa, pages.size()); - ret.map_err(boxed_debug_trace) - .context(mem::error::ChangeLayout)?; + ret.box_trace(mem::error::ChangeLayout)?; Ok(()) } } diff --git a/alioth/src/vfio/pci.rs b/alioth/src/vfio/pci.rs index 7c8765f5..8d22d1f5 100644 --- a/alioth/src/vfio/pci.rs +++ b/alioth/src/vfio/pci.rs @@ -25,10 +25,9 @@ use std::sync::atomic::AtomicU64; use libc::{PROT_READ, PROT_WRITE}; use macros::Layout; use parking_lot::{Mutex, RwLock}; -use snafu::ResultExt; use zerocopy::{FromBytes, Immutable, IntoBytes, transmute}; -use crate::errors::boxed_debug_trace; +use crate::errors::BoxTrace; use crate::hv::{IrqFd, MsiSender}; use crate::mem::emulated::{Action, Mmio, MmioBus}; use crate::mem::mapped::ArcMemPages; @@ -341,7 +340,7 @@ where fn reset(&self) -> pci::Result<()> { let ret = VfioPciDev::reset(self); - ret.map_err(boxed_debug_trace).context(pci::error::Reset)?; + ret.box_trace(pci::error::Reset)?; Ok(()) } } @@ -696,8 +695,7 @@ where let offset = offset - self.table_range.start; if self.table.write_val(offset as u64, size, val)? { self.enable_irqfd(offset / size_of::()) - .map_err(boxed_debug_trace) - .context(mem::error::Mmio)?; + .box_trace(mem::error::Mmio)?; } } else if self.pba_range.contains(&offset) { log::error!( @@ -825,9 +823,7 @@ where } drop(cap); if need_update { - self.update_msi() - .map_err(boxed_debug_trace) - .context(mem::error::Mmio)?; + self.update_msi().box_trace(mem::error::Mmio)?; } Ok(Action::None) } diff --git a/alioth/src/virtio/vhost/vhost.rs b/alioth/src/virtio/vhost/vhost.rs index 852ffc09..419c0c35 100644 --- a/alioth/src/virtio/vhost/vhost.rs +++ b/alioth/src/virtio/vhost/vhost.rs @@ -22,7 +22,7 @@ use std::sync::Arc; use snafu::{ResultExt, Snafu}; -use crate::errors::{DebugTrace, boxed_debug_trace, trace_error}; +use crate::errors::{BoxTrace, DebugTrace, trace_error}; use crate::mem::mapped::Ram; use crate::mem::{self, LayoutUpdated}; @@ -158,8 +158,7 @@ impl LayoutUpdated for UpdateVsockMem { table.regions[index].size = user_mem.size(); } let ret = self.dev.set_mem_table(&table); - ret.map_err(boxed_debug_trace) - .context(mem::error::ChangeLayout)?; + ret.box_trace(mem::error::ChangeLayout)?; log::trace!( "vhost-{}: updated mem table to {:x?}", self.dev.fd.as_raw_fd(), diff --git a/alioth/src/virtio/vu.rs b/alioth/src/virtio/vu.rs index 916390be..ee5176bc 100644 --- a/alioth/src/virtio/vu.rs +++ b/alioth/src/virtio/vu.rs @@ -27,7 +27,7 @@ use parking_lot::Mutex; use snafu::{ResultExt, Snafu}; use zerocopy::{FromBytes, FromZeros, Immutable, IntoBytes}; -use crate::errors::{DebugTrace, boxed_debug_trace, trace_error}; +use crate::errors::{BoxTrace, DebugTrace, trace_error}; use crate::mem::LayoutChanged; use crate::mem::mapped::ArcMemPages; use crate::{ffi, mem}; @@ -542,8 +542,7 @@ impl LayoutChanged for UpdateVuMem { }, }; let ret = self.dev.add_mem_region(®ion, fd.as_raw_fd()); - ret.map_err(boxed_debug_trace) - .context(mem::error::ChangeLayout)?; + ret.box_trace(mem::error::ChangeLayout)?; log::trace!( "vu-{}: added memory region {:x?}", self.dev.conn.lock().as_raw_fd(), @@ -566,8 +565,7 @@ impl LayoutChanged for UpdateVuMem { }, }; let ret = self.dev.remove_mem_region(®ion); - ret.map_err(boxed_debug_trace) - .context(mem::error::ChangeLayout)?; + ret.box_trace(mem::error::ChangeLayout)?; log::trace!( "vu-{}: removed memory region {:x?}", self.dev.conn.lock().as_raw_fd(),