88f6eec4创建于 2024年11月29日历史提交
From a588417aec2a5e3da333e89254448ee5944c35e4 Mon Sep 17 00:00:00 2001
From: Adttil <2429917001@qq.com>
Date: Sat, 23 Nov 2024 18:09:39 +0800
Subject: [PATCH 1/2] vdpa: vdpa device hotplug/unplug bugfix and support vdpa
 device boot index

---
 src/qemu/qemu_command.c        | 11 +++++++++--
 src/qemu/qemu_command.h        |  3 ++-
 src/qemu/qemu_domain_address.c | 13 +++++++++++--
 src/qemu/qemu_hotplug.c        | 12 +++++++++++-
 4 files changed, 33 insertions(+), 6 deletions(-)

diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index 0c47f019f2..7ca4397dfe 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -5018,15 +5018,22 @@ qemuBuildHostdevMediatedDevProps(const virDomainDef *def,
 }
 
 virJSONValue *
-qemuBuildHostdevVDPADevProps(virDomainHostdevDef *dev)
+qemuBuildHostdevVDPADevProps(const virDomainDef *def,
+                             virDomainHostdevDef *dev)
 {
     g_autoptr(virJSONValue) props = NULL;
     virDomainHostdevSubsysVDPA *vdpasrc = &dev->source.subsys.u.vdpa;
     if (virJSONValueObjectAdd(&props,
                               "s:driver", "vhost-vdpa-device-pci",
+                              "s:id", dev->info->alias,
                               "s:vhostdev", vdpasrc->devpath,
+                              "p:bootindex", dev->info->bootIndex,
                               NULL) < 0)
         return NULL;
+
+    if (qemuBuildDeviceAddressProps(props, def, dev->info) < 0)
+        return NULL;
+
     return g_steal_pointer(&props);
 }
 
@@ -5225,7 +5232,7 @@ qemuBuildHostdevCommandLine(virCommand *cmd,
             break;
 
         case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_VDPA:
-            if (!(devprops = qemuBuildHostdevVDPADevProps(hostdev)))
+            if (!(devprops = qemuBuildHostdevVDPADevProps(def, hostdev)))
                 return -1;
             if (qemuBuildDeviceCommandlineFromJSON(cmd, devprops, def, qemuCaps) < 0)
                 return -1;
diff --git a/src/qemu/qemu_command.h b/src/qemu/qemu_command.h
index 432ea59310..273c084322 100644
--- a/src/qemu/qemu_command.h
+++ b/src/qemu/qemu_command.h
@@ -199,7 +199,8 @@ qemuBuildHostdevMediatedDevProps(const virDomainDef *def,
                                  virDomainHostdevDef *dev);
 
 virJSONValue *
-qemuBuildHostdevVDPADevProps(virDomainHostdevDef *dev);
+qemuBuildHostdevVDPADevProps(const virDomainDef *def,
+                             virDomainHostdevDef *dev);
 
 virJSONValue *
 qemuBuildRedirdevDevProps(const virDomainDef *def,
diff --git a/src/qemu/qemu_domain_address.c b/src/qemu/qemu_domain_address.c
index 099778b2a8..1f8eee8d61 100644
--- a/src/qemu/qemu_domain_address.c
+++ b/src/qemu/qemu_domain_address.c
@@ -828,7 +828,8 @@ qemuDomainDeviceCalculatePCIConnectFlags(virDomainDeviceDef *dev,
         if (!virHostdevIsMdevDevice(hostdev) &&
             (hostdev->mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS ||
              (hostdev->source.subsys.type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI &&
-              hostdev->source.subsys.type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI_HOST))) {
+              hostdev->source.subsys.type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI_HOST &&
+              hostdev->source.subsys.type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_VDPA))) {
             return 0;
         }
 
@@ -860,6 +861,13 @@ qemuDomainDeviceCalculatePCIConnectFlags(virDomainDeviceDef *dev,
         if (hostdev->source.subsys.type == VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_MDEV)
             return pcieFlags;
 
+        /*
+         * if pcieFlags not equal to pciFlags, domain has pcie root port.
+         * Thus, we just return pcieFlags.
+         */
+        if (hostdev->source.subsys.type == VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_VDPA)
+            return pcieFlags;
+
         /* according to pbonzini, from the guest PoV vhost-scsi devices
          * are the same as virtio-scsi, so they should follow virtio logic
          */
@@ -2333,7 +2341,8 @@ qemuDomainAssignDevicePCISlots(virDomainDef *def,
         if (subsys->type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI &&
             subsys->type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI_HOST &&
             !(subsys->type == VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_MDEV &&
-              subsys->u.mdev.model == VIR_MDEV_MODEL_TYPE_VFIO_PCI)) {
+              subsys->u.mdev.model == VIR_MDEV_MODEL_TYPE_VFIO_PCI) &&
+            subsys->type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_VDPA) {
             continue;
         }
 
diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c
index 87353d2149..907971b41f 100644
--- a/src/qemu/qemu_hotplug.c
+++ b/src/qemu/qemu_hotplug.c
@@ -2800,7 +2800,7 @@ qemuDomainAttachVDPADevice(virQEMUDriver *driver,
         goto cleanup;
     }
 
-    if (!(devprops = qemuBuildHostdevVDPADevProps(hostdev)))
+    if (!(devprops = qemuBuildHostdevVDPADevProps(vm->def, hostdev)))
         goto cleanup;
 
     VIR_REALLOC_N(vm->def->hostdevs, vm->def->nhostdevs + 1);
@@ -4726,6 +4726,14 @@ qemuDomainRemoveMediatedDevice(virQEMUDriver *driver,
 }
 
 
+static void
+qemuDomainRemoveVDPADevice(virDomainObj *vm,
+                           virDomainHostdevDef *hostdev)
+{
+    qemuDomainReleaseDeviceAddress(vm, hostdev->info);
+}
+
+
 static int
 qemuDomainRemoveHostDevice(virQEMUDriver *driver,
                            virDomainObj *vm,
@@ -4798,6 +4806,8 @@ qemuDomainRemoveHostDevice(virQEMUDriver *driver,
         qemuDomainRemoveMediatedDevice(driver, vm, hostdev);
         break;
     case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_VDPA:
+        qemuDomainRemoveVDPADevice(vm, hostdev);
+        break;
     case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_LAST:
         break;
     }
-- 
2.43.0