From 798294014e960ca8393880b38ab20f13e78e000f Mon Sep 17 00:00:00 2001 From: Changyuan Lyu Date: Wed, 11 Mar 2026 22:53:38 -0700 Subject: [PATCH] fix(vfio): conditionally reset devices based on flags Signed-off-by: Changyuan Lyu --- alioth/src/vfio/pci.rs | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/alioth/src/vfio/pci.rs b/alioth/src/vfio/pci.rs index 80b07055..b2286166 100644 --- a/alioth/src/vfio/pci.rs +++ b/alioth/src/vfio/pci.rs @@ -42,8 +42,8 @@ use crate::pci::config::{ }; use crate::pci::{self, Pci, PciBar}; use crate::sys::vfio::{ - VfioIrqSet, VfioIrqSetData, VfioIrqSetFlag, VfioPciIrq, VfioPciRegion, VfioRegionInfo, - VfioRegionInfoFlag, + VfioDeviceInfoFlag, VfioIrqSet, VfioIrqSetData, VfioIrqSetFlag, VfioPciIrq, VfioPciRegion, + VfioRegionInfo, VfioRegionInfoFlag, }; use crate::vfio::device::Device; use crate::vfio::{Result, error}; @@ -205,6 +205,19 @@ where struct VfioDev { name: Arc, dev: D, + flags: VfioDeviceInfoFlag, +} + +impl VfioDev +where + D: Device, +{ + fn reset(&self) -> Result<()> { + if self.flags.contains(VfioDeviceInfoFlag::RESET) { + self.dev.reset()?; + } + Ok(()) + } } #[derive(Debug)] @@ -365,7 +378,9 @@ where D: Device, { pub fn new(name: Arc, dev: D, msi_sender: M) -> Result> { - let cdev = Arc::new(VfioDev { dev, name }); + let flags = dev.get_info()?.flags; + + let cdev = Arc::new(VfioDev { dev, name, flags }); let msi_sender = Arc::new(msi_sender); @@ -500,7 +515,7 @@ where let config_header = ConfigHeader::Device(dev_header); - cdev.dev.reset()?; + cdev.reset()?; let msix_count = match &msix_cap { Some(cap) => cap.control.table_len() + 1, @@ -578,7 +593,7 @@ where } self.msix_table.reset(); - self.config.dev.dev.reset() + self.config.dev.reset() } }