143 lines
5.5 KiB
Diff
143 lines
5.5 KiB
Diff
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
|
|
|