From 014a0e13cdfa9a6efb567fa4d02f38586bd10abe Mon Sep 17 00:00:00 2001 From: jiangdongxu Date: Thu, 31 Oct 2024 02:47:19 +0000 Subject: [PATCH] add vdpa-device-hotplug-unplug-bugfix-and-support-v.patch. Signed-off-by: jiangdongxu --- ...-hotplug-unplug-bugfix-and-support-v.patch | 142 ++++++++++++++++++ 1 file changed, 142 insertions(+) create mode 100644 vdpa-device-hotplug-unplug-bugfix-and-support-v.patch diff --git a/vdpa-device-hotplug-unplug-bugfix-and-support-v.patch b/vdpa-device-hotplug-unplug-bugfix-and-support-v.patch new file mode 100644 index 0000000..39ccce2 --- /dev/null +++ b/vdpa-device-hotplug-unplug-bugfix-and-support-v.patch @@ -0,0 +1,142 @@ +From 2b769aa6a2363ffde464374fc0d4cf041a757238 Mon Sep 17 00:00:00 2001 +From: jiangdongxu +Date: Fri, 18 Oct 2024 17:33:07 +0800 +Subject: [PATCH] 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 6e16e65d54..130421b6c5 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..c1b45fa2ae 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 + -- Gitee