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