(&self)
| 3775 | } |
| 3776 | |
| 3777 | fn create_vfio_ops(&self) -> DeviceManagerResult<Arc<dyn VfioOps>> { |
| 3778 | let passthrough_device = self |
| 3779 | .passthrough_device |
| 3780 | .as_ref() |
| 3781 | .ok_or(DeviceManagerError::NoDevicePassthroughSupport)?; |
| 3782 | |
| 3783 | let dup = passthrough_device |
| 3784 | .try_clone() |
| 3785 | .map_err(DeviceManagerError::VfioCreate)?; |
| 3786 | |
| 3787 | let iommufd = self |
| 3788 | .config |
| 3789 | .lock() |
| 3790 | .unwrap() |
| 3791 | .platform |
| 3792 | .as_ref() |
| 3793 | .is_some_and(|p| p.iommufd); |
| 3794 | |
| 3795 | if iommufd { |
| 3796 | #[cfg(feature = "kvm")] |
| 3797 | { |
| 3798 | info!("Using vfio cdev mode with iommufd."); |
| 3799 | let iommufd = IommuFd::new().map_err(DeviceManagerError::IommufdCreate)?; |
| 3800 | let vfio_iommufd = VfioIommufd::new(Arc::new(iommufd), None, Some(Arc::new(dup))) |
| 3801 | .map_err(DeviceManagerError::VfioCreate)?; |
| 3802 | Ok(Arc::new(vfio_iommufd)) |
| 3803 | } |
| 3804 | #[cfg(not(feature = "kvm"))] |
| 3805 | Err(DeviceManagerError::IommufdNotSupported) |
| 3806 | } else { |
| 3807 | info!("Using vfio legacy mode with vfio container/group."); |
| 3808 | Ok(Arc::new( |
| 3809 | VfioContainer::new(Some(Arc::new(dup))).map_err(DeviceManagerError::VfioCreate)?, |
| 3810 | )) |
| 3811 | } |
| 3812 | } |
| 3813 | |
| 3814 | fn add_vfio_device( |
| 3815 | &mut self, |
no test coverage detected