Hi, This is v6 of the server side changes to enable vfio-user in QEMU.
Thank you very much for your feedback for the last revision which helped to streamline the overall design. We've made the following changes to this revision: [PATCH v6 03/19] qdev: unplug blocker for devices - removed test which prevented an unplug blocker from getting added if migration was in progress - added comments to function [PATCH v6 04/19] remote/machine: add HotplugHandler for remote machine - changed commit message prefix from vfio-user to "remote/machine" [PATCH v6 05/19] remote/machine: add vfio-user property - new in this series [PATCH v6 07/19] vfio-user: define vfio-user-server object - fixed typo noted in the review - moved error message before setting "o->socket = NULL" in vfu_object_set_socket() - added "vfio-user=on" to the usage comment at the top of file [PATCH v6 08/19] vfio-user: instantiate vfio-user context - added error message to the object set property message when server is already running [PATCH v6 09/19] vfio-user: find and init PCI device - added more detailed error message for device unplug blocker [PATCH v6 10/19] vfio-user: run vfio-user context - send ID of device in VFU_CLIENT_HANGUP instead of path - disable FD handler in object finalize [PATCH v6 12/19] vfio-user: IOMMU support for remote device - new in this series [PATCH v6 13/19] vfio-user: handle DMA mappings - Setup IOMMU for remote machine if vfio-user is enabled - Map/Unmap the DMA regions in the IOMMU address space in dma_register()/dma_unregister() using pci_device_iommu_address_space() function [PATCH v6 14/19] vfio-user: handle PCI BAR accesses - vfu_object_bar_rw() - directly access the bar region instead of accessing via address_space_rw() - register handler for PCI ROM region - set read only flags for read only MemoryRegions with vfu_setup_region() [PATCH v6 15/19] vfio-user: handle device interrupts - setup separate PCI bus map_irq and set_irq for vfio-user during remote machine init - index hash table using PCI bud device function numbers [PATCH v6 16/19] vfio-user: handle device interrupts - new in this series [PATCH v6 17/19] vfio-user: register handlers to facilitate migration - enable streaming for migration data instead pre-determining the migration data size at boot - dropped migrated_devs static variable to track the number of devices migrated - added helper functions to independently start stop block and network devices - updated qemu_remote_savevm() to migrate data of all the devices under the target device [PATCH v6 18/19] vfio-user: handle reset of remote device - new in this series [PATCH v6 19/19] vfio-user: avocado tests for vfio-user - use QMP command for hotplug instead of HMP command - confirm the state of source and destination VMs after migration - testing megasas device instead of lsi53c895a as lsi53c895a doesn't seem to support IOMMU, which is enabled by default on the server We dropped the following patches from the previous revision: - pci: isolated address space for PCI bus - pci: create and free isolated PCI buses - vfio-user: set qdev bus callbacks for remote machine We are looking forward to your comments. Thank you very much! Jagannathan Raman (19): configure, meson: override C compiler for cmake tests/avocado: Specify target VM argument to helper routines qdev: unplug blocker for devices remote/machine: add HotplugHandler for remote machine remote/machine: add vfio-user property vfio-user: build library vfio-user: define vfio-user-server object vfio-user: instantiate vfio-user context vfio-user: find and init PCI device vfio-user: run vfio-user context vfio-user: handle PCI config space accesses vfio-user: IOMMU support for remote device vfio-user: handle DMA mappings vfio-user: handle PCI BAR accesses vfio-user: handle device interrupts softmmu/vl: defer backend init vfio-user: register handlers to facilitate migration vfio-user: handle reset of remote device vfio-user: avocado tests for vfio-user configure | 21 +- meson.build | 44 +- qapi/misc.json | 23 + qapi/qom.json | 20 +- include/block/block.h | 1 + include/exec/memory.h | 3 + include/hw/pci/pci.h | 6 + include/hw/qdev-core.h | 35 + include/hw/remote/iommu.h | 18 + include/hw/remote/machine.h | 2 + include/hw/remote/vfio-user-obj.h | 6 + include/migration/vmstate.h | 2 + include/sysemu/sysemu.h | 4 + migration/savevm.h | 2 + block.c | 5 + block/block-backend.c | 3 +- blockdev.c | 2 +- hw/pci/msi.c | 13 +- hw/pci/msix.c | 12 +- hw/remote/iommu.c | 78 ++ hw/remote/machine.c | 54 +- hw/remote/vfio-user-obj.c | 1286 ++++++++++++++++++++ migration/savevm.c | 89 ++ migration/vmstate.c | 19 + softmmu/physmem.c | 4 +- softmmu/qdev-monitor.c | 26 + softmmu/vl.c | 17 + stubs/defer-backend-init.c | 7 + stubs/vfio-user-obj.c | 6 + tests/qtest/fuzz/generic_fuzz.c | 9 +- .gitlab-ci.d/buildtest.yml | 2 + .gitmodules | 3 + Kconfig.host | 4 + MAINTAINERS | 7 + hw/remote/Kconfig | 4 + hw/remote/meson.build | 4 + hw/remote/trace-events | 11 + meson_options.txt | 2 + stubs/meson.build | 2 + subprojects/libvfio-user | 1 + tests/avocado/avocado_qemu/__init__.py | 14 +- tests/avocado/vfio-user.py | 234 ++++ tests/docker/dockerfiles/centos8.docker | 2 + tests/docker/dockerfiles/ubuntu2004.docker | 2 + 44 files changed, 2088 insertions(+), 21 deletions(-) create mode 100644 include/hw/remote/iommu.h create mode 100644 include/hw/remote/vfio-user-obj.h create mode 100644 hw/remote/iommu.c create mode 100644 hw/remote/vfio-user-obj.c create mode 100644 stubs/defer-backend-init.c create mode 100644 stubs/vfio-user-obj.c create mode 160000 subprojects/libvfio-user create mode 100644 tests/avocado/vfio-user.py -- 2.20.1