summary refs log tree commit diff
path: root/src/linux.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/linux.rs')
-rw-r--r--src/linux.rs39
1 files changed, 21 insertions, 18 deletions
diff --git a/src/linux.rs b/src/linux.rs
index 4a87f7d..2de1aaa 100644
--- a/src/linux.rs
+++ b/src/linux.rs
@@ -1176,28 +1176,31 @@ fn create_devices(
     let usb_controller = Box::new(XhciController::new(mem.clone(), usb_provider));
     pci_devices.push((usb_controller, simple_jail(&cfg, "xhci")?));
 
-    if let Some(vfio_path) = &cfg.vfio {
+    if !cfg.vfio.is_empty() {
         let vfio_container = Arc::new(Mutex::new(
             VfioContainer::new().map_err(Error::CreateVfioDevice)?,
         ));
 
-        let (vfio_host_socket_irq, vfio_device_socket_irq) =
-            msg_socket::pair::<VmIrqResponse, VmIrqRequest>().map_err(Error::CreateSocket)?;
-        control_sockets.push(TaggedControlSocket::VmIrq(vfio_host_socket_irq));
-
-        let (vfio_host_socket_mem, vfio_device_socket_mem) =
-            msg_socket::pair::<VmMemoryResponse, VmMemoryRequest>().map_err(Error::CreateSocket)?;
-        control_sockets.push(TaggedControlSocket::VmMemory(vfio_host_socket_mem));
-
-        let vfio_path = vfio_path.as_path();
-        let vfiodevice = VfioDevice::new(vfio_path, vm, mem, vfio_container.clone())
-            .map_err(Error::CreateVfioDevice)?;
-        let vfiopcidevice = Box::new(VfioPciDevice::new(
-            vfiodevice,
-            vfio_device_socket_irq,
-            vfio_device_socket_mem,
-        ));
-        pci_devices.push((vfiopcidevice, simple_jail(&cfg, "vfio_device")?));
+        for vfio_path in &cfg.vfio {
+            // create one Irq and Mem request socket for each vfio device
+            let (vfio_host_socket_irq, vfio_device_socket_irq) =
+                msg_socket::pair::<VmIrqResponse, VmIrqRequest>().map_err(Error::CreateSocket)?;
+            control_sockets.push(TaggedControlSocket::VmIrq(vfio_host_socket_irq));
+
+            let (vfio_host_socket_mem, vfio_device_socket_mem) =
+                msg_socket::pair::<VmMemoryResponse, VmMemoryRequest>()
+                    .map_err(Error::CreateSocket)?;
+            control_sockets.push(TaggedControlSocket::VmMemory(vfio_host_socket_mem));
+
+            let vfiodevice = VfioDevice::new(vfio_path.as_path(), vm, mem, vfio_container.clone())
+                .map_err(Error::CreateVfioDevice)?;
+            let vfiopcidevice = Box::new(VfioPciDevice::new(
+                vfiodevice,
+                vfio_device_socket_irq,
+                vfio_device_socket_mem,
+            ));
+            pci_devices.push((vfiopcidevice, simple_jail(&cfg, "vfio_device")?));
+        }
     }
 
     Ok(pci_devices)