diff --git a/pci/src/vfio.rs b/pci/src/vfio.rs index f4b2ce97c..bbdbdd747 100644 --- a/pci/src/vfio.rs +++ b/pci/src/vfio.rs @@ -1893,6 +1893,23 @@ impl PciDevice for VfioPciDevice { region.start = GuestAddress(new_base); for user_memory_region in region.user_memory_regions.iter_mut() { + // Unmap the old MMIO region from vfio container + if !self.iommu_attached { + if let Err(e) = self + .container + .vfio_dma_unmap(user_memory_region.start, user_memory_region.size) + .map_err(|e| { + VfioPciError::DmaUnmap(e, self.device_path.clone(), self.bdf) + }) + { + error!( + "Could not unmap mmio region from vfio container: \ + iova 0x{:x}, size 0x{:x}: {}, ", + user_memory_region.start, user_memory_region.size, e + ); + } + } + // Remove old region let old_mem_region = self.vm.make_user_memory_region( user_memory_region.slot, @@ -1927,6 +1944,26 @@ impl PciDevice for VfioPciDevice { self.vm .create_user_memory_region(new_mem_region) .map_err(io::Error::other)?; + + // Map the moved mmio region to vfio container + if !self.iommu_attached { + self.container + .vfio_dma_map( + user_memory_region.start, + user_memory_region.size, + user_memory_region.host_addr, + ) + .map_err(|e| { + VfioPciError::DmaMap(e, self.device_path.clone(), self.bdf) + }) + .map_err(|e| { + io::Error::other(format!( + "Could not map mmio region to vfio container: \ + iova 0x{:x}, size 0x{:x}: {}, ", + user_memory_region.start, user_memory_region.size, e + )) + })?; + } } } }