summary refs log tree commit diff
path: root/src/linux.rs
diff options
context:
space:
mode:
authorXiong Zhang <xiong.y.zhang@intel.corp-partner.google.com>2019-11-12 10:06:13 +0800
committerCommit Bot <commit-bot@chromium.org>2020-03-09 21:48:54 +0000
commit8bb4faa6629a4d8c10d58ed9397f867b6da5c91f (patch)
treec37035ac8221c5af4e1431b3629a1f2aea71bc6b /src/linux.rs
parent4b62cd94989ab25e7abd48b9d4153725cd9de257 (diff)
downloadcrosvm-8bb4faa6629a4d8c10d58ed9397f867b6da5c91f.tar
crosvm-8bb4faa6629a4d8c10d58ed9397f867b6da5c91f.tar.gz
crosvm-8bb4faa6629a4d8c10d58ed9397f867b6da5c91f.tar.bz2
crosvm-8bb4faa6629a4d8c10d58ed9397f867b6da5c91f.tar.lz
crosvm-8bb4faa6629a4d8c10d58ed9397f867b6da5c91f.tar.xz
crosvm-8bb4faa6629a4d8c10d58ed9397f867b6da5c91f.tar.zst
crosvm-8bb4faa6629a4d8c10d58ed9397f867b6da5c91f.zip
Vfio: Multi vfio device support
Current one vm could have one vfio device only, this patch let one vm
could have multi vfio devices by changing the vfio parameter into vec<>.

BUG=chromium:992270
TEST=passthrough two/three devices into guest, these devices are in the
same vfio group, then check these devices function in guest.

Change-Id: I366d24d750a199d7862fb907fa44f9be429c5944
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/2080111
Reviewed-by: Tomasz Jeznach <tjeznach@chromium.org>
Tested-by: kokoro <noreply+kokoro@google.com>
Commit-Queue: Tomasz Jeznach <tjeznach@chromium.org>
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)