mbox series

[rfcv2,00/18] Check and sync host IOMMU cap/ecap with vIOMMU

Message ID 20240201072818.327930-1-zhenzhong.duan@intel.com (mailing list archive)
Headers show
Series Check and sync host IOMMU cap/ecap with vIOMMU | expand

Message

Duan, Zhenzhong Feb. 1, 2024, 7:28 a.m. UTC
Hi,

This enables vIOMMU to get host IOMMU cap/ecap information by introducing
a new set/unset_iommu_device interface, then vIOMMU could check or sync
with vIOMMU's own cap/ecap config.

It works by having device side, i.e. VFIO, register either an IOMMULegacyDevice
or IOMMUFDDevice to vIOMMU, which includes necessary data to archive that.
Currently only VFIO device is supported, but it could also be used for other
devices, i.e., VDPA.

For coldplugged device, we can get its host IOMMU cap/ecap during qemu init,
then check and sync into vIOMMU cap/ecap.
For hotplugged device, vIOMMU cap/ecap is frozen, we could only check with
vIOMMU cap/ecap, not allowed to update. IF check fails, hotplugged will fail.

This is also a prerequisite for incoming iommufd nesting series:
'intel_iommu: Enable stage-1 translation'.

I didn't implement cap/ecap sync for legacy VFIO backend, would like to see
what Eric want to put in IOMMULegacyDevice for virtio-iommu and if I can
utilize some of them.

PATCH1-3: Introduce HostIOMMUDevice and two sub class
PATCH4-5: Define HostIOMMUDevice instance in VFIODevice
PATCH6-9: Introdcue host_iommu_device_init callback to intialize HostIOMMUDevice
PATCH10-12: Introdcue set/unset_iommu_device to pass HostIOMMUDevice to vIOMMU
PATCH13-18: Implement cap/ecap check and sync in intel_iommu

Qemu code can be found at:
https://github.com/yiliu1765/qemu/tree/zhenzhong/iommufd_nesting_preq_rfcv2

Thanks
Zhenzhong


Changelog:
rfcv2:
- introduce common abstract HostIOMMUDevice and sub struct for different BEs (Eric, Cédric)
- remove iommufd_device.[ch] (Cédric)
- remove duplicate iommufd/devid define from VFIODevice (Eric)
- drop the p in aliased_pbus and aliased_pdevfn (Eric)
- assert devfn and iommu_bus in pci_device_get_iommu_bus_devfn (Cédric, Eric)
- use errp in iommufd_device_get_info (Eric)
- split and simplify cap/ecap check/sync code in intel_iommu.c (Cédric)
- move VTDHostIOMMUDevice declaration to intel_iommu_internal.h (Cédric)
- make '(vtd->cap_reg >> 16) & 0x3fULL' a MACRO and add missed '+1' (Cédric)
- block migration if vIOMMU cap/ecap updated based on host IOMMU cap/ecap
- add R-B


Yi Liu (3):
  hw/pci: Introduce pci_device_set/unset_iommu_device()
  intel_iommu: Add set/unset_iommu_device callback
  intel_iommu: Add a framework to check and sync host IOMMU cap/ecap

Zhenzhong Duan (15):
  Introduce a common abstract struct HostIOMMUDevice
  backends/iommufd: Introduce IOMMUFDDevice
  vfio: Introduce IOMMULegacyDevice
  vfio: Add host iommu device instance into VFIODevice
  vfio: Remove redundant iommufd and devid elements in VFIODevice
  vfio: Introduce host_iommu_device_init callback
  vfio/container: Implement host_iommu_device_init callback in legacy
    mode
  vfio/iommufd: Implement host_iommu_device_init callback in iommufd
    mode
  vfio/pci: Initialize host iommu device instance after attachment
  vfio: Initialize host IOMMU device and pass to vIOMMU
  intel_iommu: Extract out vtd_cap_init to initialize cap/ecap
  backends/iommufd: Introduce helper function iommufd_device_get_info()
  intel_iommu: Implement check and sync mechanism in iommufd mode
  intel_iommu: Use mgaw instead of s->aw_bits
  intel_iommu: Block migration if cap is updated

 hw/i386/intel_iommu_internal.h        |  15 ++
 include/hw/i386/intel_iommu.h         |   4 +
 include/hw/pci/pci.h                  |  38 +++-
 include/hw/vfio/vfio-common.h         |  20 +-
 include/hw/vfio/vfio-container-base.h |   1 +
 include/sysemu/host_iommu_device.h    |  22 ++
 include/sysemu/iommufd.h              |  18 ++
 backends/iommufd.c                    |  31 ++-
 hw/i386/acpi-build.c                  |   3 +-
 hw/i386/intel_iommu.c                 | 279 ++++++++++++++++++++------
 hw/pci/pci.c                          |  62 +++++-
 hw/vfio/ap.c                          |   2 +-
 hw/vfio/ccw.c                         |   2 +-
 hw/vfio/common.c                      |  10 +-
 hw/vfio/container.c                   |   7 +
 hw/vfio/helpers.c                     |   2 +-
 hw/vfio/iommufd.c                     |  32 +--
 hw/vfio/pci.c                         |  25 ++-
 hw/vfio/platform.c                    |   3 +-
 19 files changed, 488 insertions(+), 88 deletions(-)
 create mode 100644 include/sysemu/host_iommu_device.h