diff options
author | Xiong Zhang <xiong.y.zhang@intel.corp-partner.google.com> | 2019-11-12 10:06:13 +0800 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2020-03-09 21:48:54 +0000 |
commit | 8bb4faa6629a4d8c10d58ed9397f867b6da5c91f (patch) | |
tree | c37035ac8221c5af4e1431b3629a1f2aea71bc6b /src/linux.rs | |
parent | 4b62cd94989ab25e7abd48b9d4153725cd9de257 (diff) | |
download | crosvm-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.rs | 39 |
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) |