On 8/27/2025 6:51 AM, Daniel P. Berrangé wrote:
Add support for parsing multiple IOMMU devices from
the VM definition when "smmuv3Dev" is the IOMMU model.

Signed-off-by: Nathan Chen<nath...@nvidia.com>
---
  src/conf/domain_conf.c            | 153 ++++++++++++++++++++++++++----
  src/conf/domain_conf.h            |   9 +-
  src/conf/domain_validate.c        |  32 ++++---
  src/conf/schemas/domaincommon.rng |   4 +-
  src/libvirt_private.syms          |   2 +
  src/qemu/qemu_alias.c             |  15 ++-
  src/qemu/qemu_command.c           | 146 ++++++++++++++--------------
  src/qemu/qemu_domain_address.c    |  35 +++----
  src/qemu/qemu_driver.c            |   8 +-
  src/qemu/qemu_postparse.c         |  11 ++-
  src/qemu/qemu_validate.c          |   2 +-
  11 files changed, 284 insertions(+), 133 deletions(-)

diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index dc222887d4..5ea4d6424b 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -16446,6 +16447,112 @@ virDomainInputDefFind(const virDomainDef *def,
  }
+bool
+virDomainIOMMUDefEquals(const virDomainIOMMUDef *a,
+                        const virDomainIOMMUDef *b)
+{
+    if (a->model != b->model ||
+        a->intremap != b->intremap ||
+        a->caching_mode != b->caching_mode ||
+        a->eim != b->eim ||
+        a->iotlb != b->iotlb ||
+        a->aw_bits != b->aw_bits ||
+        a->parent_idx != b->parent_idx ||
+        a->accel != b->accel ||
+        a->dma_translation != b->dma_translation)
+        return false;
+
+    switch (a->info.type) {
+    case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI:
+        if (a->info.addr.pci.domain != b->info.addr.pci.domain ||
+            a->info.addr.pci.bus != b->info.addr.pci.bus ||
+            a->info.addr.pci.slot != b->info.addr.pci.slot ||
+            a->info.addr.pci.function != b->info.addr.pci.function) {
+            return false;
+        }
+        break;
+
+    case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_DRIVE:
+        if (a->info.addr.drive.controller != b->info.addr.drive.controller ||
+            a->info.addr.drive.bus != b->info.addr.drive.bus ||
+            a->info.addr.drive.unit != b->info.addr.drive.unit) {
+            return false;
+        }
+        break;
+
+    case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_VIRTIO_SERIAL:
+        if (a->info.addr.vioserial.controller != 
b->info.addr.vioserial.controller ||
+            a->info.addr.vioserial.bus != b->info.addr.vioserial.bus ||
+            a->info.addr.vioserial.port != b->info.addr.vioserial.port) {
+            return false;
+        }
+        break;
+
+    case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_CCID:
+        if (a->info.addr.ccid.controller != b->info.addr.ccid.controller ||
+            a->info.addr.ccid.slot != b->info.addr.ccid.slot) {
+            return false;
+        }
+        break;
+
+    case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_ISA:
+        if (a->info.addr.isa.iobase != b->info.addr.isa.iobase ||
+            a->info.addr.isa.irq != b->info.addr.isa.irq) {
+            return false;
+        }
+        break;
+
+    case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_DIMM:
+        if (a->info.addr.dimm.slot != b->info.addr.dimm.slot) {
+            return false;
+        }
+
+        if (a->info.addr.dimm.base != b->info.addr.dimm.base) {
+            return false;
+        }
+        break;
+
+    case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_CCW:
+        if (a->info.addr.ccw.cssid != b->info.addr.ccw.cssid ||
+            a->info.addr.ccw.ssid != b->info.addr.ccw.ssid ||
+            a->info.addr.ccw.devno != b->info.addr.ccw.devno) {
+            return false;
+        }
+        break;
+
+    case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_USB:
+    case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_SPAPRVIO:
+    case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_VIRTIO_S390:
+    case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_VIRTIO_MMIO:
+    case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE:
+    case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_UNASSIGNED:
+    case VIR_DOMAIN_DEVICE_ADDRESS_TYPE_LAST:
+        break;
+    }
+
+    if (a->info.acpiIndex != b->info.acpiIndex) {
+        return false;
+    }
Most of this should go away if you use virDomainDeviceInfoAddressIsEqual

Thanks for the suggestion, I will simplify this section with virDomainDeviceInfoAddressIsEqual.

Thanks,
Nathan

Reply via email to