diff --git a/Include-vdpa-devices-in-node-device-list.patch b/Include-vdpa-devices-in-node-device-list.patch new file mode 100644 index 0000000000000000000000000000000000000000..9fb06749c17fa92eab51a9296bc6efdc7dd6e61b --- /dev/null +++ b/Include-vdpa-devices-in-node-device-list.patch @@ -0,0 +1,322 @@ +From e8597e64126a5cf77fbb9422977268878a6376b6 Mon Sep 17 00:00:00 2001 +From: AlexChen +Date: Wed, 14 Oct 2020 12:08:30 -0500 +Subject: [PATCH] Include vdpa devices in node device list + +The current udev node device driver ignores all events related to vdpa +devices. Since libvirt now supports vDPA network devices, include these +devices in the device list. + +Example output: + +virsh # nodedev-list +[...ommitted long list of nodedevs...] +vdpa_vdpa0 + +virsh # nodedev-dumpxml vdpa_vdpa0 + + vdpa_vdpa0 + /sys/devices/vdpa0 + computer + + vhost_vdpa + + + /dev/vhost-vdpa-0 + + + +NOTE: normally the 'parent' would be a PCI device instead of 'computer', +but this example output is from the vdpa_sim kernel module, so it +doesn't have a normal parent device. + +Signed-off-by: Jonathon Jongsma +Signed-off-by: AlexChen +--- + docs/formatnode.html.in | 9 ++++++ + docs/schemas/nodedev.rng | 10 ++++++ + include/libvirt/libvirt-nodedev.h | 1 + + src/conf/node_device_conf.c | 13 ++++++++ + src/conf/node_device_conf.h | 11 ++++++- + src/conf/virnodedeviceobj.c | 4 ++- + src/node_device/node_device_udev.c | 51 ++++++++++++++++++++++++++++++ + tools/virsh-nodedev.c | 3 ++ + 8 files changed, 100 insertions(+), 2 deletions(-) + +diff --git a/docs/formatnode.html.in b/docs/formatnode.html.in +index c2a8f8fb7a..573391ef0f 100644 +--- a/docs/formatnode.html.in ++++ b/docs/formatnode.html.in +@@ -341,6 +341,15 @@ +
The device number.
+ + ++
vdpa
++
Describes a virtual datapath acceleration (vDPA) network device. ++ Since 6.9.0. Sub-elements include: ++
++
chardev
++
The path to the character device that is used to access the ++ device.
++
++
+ + + +diff --git a/docs/schemas/nodedev.rng b/docs/schemas/nodedev.rng +index fe6ffa0b53..4f197b327a 100644 +--- a/docs/schemas/nodedev.rng ++++ b/docs/schemas/nodedev.rng +@@ -85,6 +85,7 @@ + + + ++ + + + +@@ -651,6 +652,15 @@ + + + ++ ++ ++ vdpa ++ ++ ++ ++ ++ ++ + + + +diff --git a/include/libvirt/libvirt-nodedev.h b/include/libvirt/libvirt-nodedev.h +index a2ad61ac6d..4129f1afed 100644 +--- a/include/libvirt/libvirt-nodedev.h ++++ b/include/libvirt/libvirt-nodedev.h +@@ -81,6 +81,7 @@ typedef enum { + VIR_CONNECT_LIST_NODE_DEVICES_CAP_MDEV_TYPES = 1 << 13, /* Capable of mediated devices */ + VIR_CONNECT_LIST_NODE_DEVICES_CAP_MDEV = 1 << 14, /* Mediated device */ + VIR_CONNECT_LIST_NODE_DEVICES_CAP_CCW_DEV = 1 << 15, /* CCW device */ ++ VIR_CONNECT_LIST_NODE_DEVICES_CAP_VDPA = 1 << 17, /* vDPA device */ + } virConnectListAllNodeDeviceFlags; + + int virConnectListAllNodeDevices (virConnectPtr conn, +diff --git a/src/conf/node_device_conf.c b/src/conf/node_device_conf.c +index d64f6d3986..41d7c7d12e 100644 +--- a/src/conf/node_device_conf.c ++++ b/src/conf/node_device_conf.c +@@ -65,6 +65,7 @@ VIR_ENUM_IMPL(virNodeDevCap, + "mdev_types", + "mdev", + "ccw", ++ "vdpa", + ); + + VIR_ENUM_IMPL(virNodeDevNetCap, +@@ -500,6 +501,12 @@ virNodeDeviceCapStorageDefFormat(virBufferPtr buf, + virBufferAddLit(buf, "\n"); + } + ++static void ++virNodeDeviceCapVDPADefFormat(virBufferPtr buf, ++ const virNodeDevCapData *data) ++{ ++ virBufferEscapeString(buf, "%s\n", data->vdpa.chardev); ++} + + char * + virNodeDeviceDefFormat(const virNodeDeviceDef *def) +@@ -595,6 +602,9 @@ virNodeDeviceDefFormat(const virNodeDeviceDef *def) + virBufferAsprintf(&buf, "0x%04x\n", + data->ccw_dev.devno); + break; ++ case VIR_NODE_DEV_CAP_VDPA: ++ virNodeDeviceCapVDPADefFormat(&buf, data); ++ break; + case VIR_NODE_DEV_CAP_MDEV_TYPES: + case VIR_NODE_DEV_CAP_FC_HOST: + case VIR_NODE_DEV_CAP_VPORTS: +@@ -1897,6 +1907,7 @@ virNodeDevCapsDefParseXML(xmlXPathContextPtr ctxt, + case VIR_NODE_DEV_CAP_FC_HOST: + case VIR_NODE_DEV_CAP_VPORTS: + case VIR_NODE_DEV_CAP_SCSI_GENERIC: ++ case VIR_NODE_DEV_CAP_VDPA: + case VIR_NODE_DEV_CAP_LAST: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("unknown capability type '%d' for '%s'"), +@@ -2209,6 +2220,7 @@ virNodeDevCapsDefFree(virNodeDevCapsDefPtr caps) + case VIR_NODE_DEV_CAP_FC_HOST: + case VIR_NODE_DEV_CAP_VPORTS: + case VIR_NODE_DEV_CAP_CCW_DEV: ++ case VIR_NODE_DEV_CAP_VDPA: + case VIR_NODE_DEV_CAP_LAST: + /* This case is here to shutup the compiler */ + break; +@@ -2262,6 +2274,7 @@ virNodeDeviceUpdateCaps(virNodeDeviceDefPtr def) + case VIR_NODE_DEV_CAP_MDEV_TYPES: + case VIR_NODE_DEV_CAP_MDEV: + case VIR_NODE_DEV_CAP_CCW_DEV: ++ case VIR_NODE_DEV_CAP_VDPA: + case VIR_NODE_DEV_CAP_LAST: + break; + } +diff --git a/src/conf/node_device_conf.h b/src/conf/node_device_conf.h +index 9e4b0847fb..a14eaef742 100644 +--- a/src/conf/node_device_conf.h ++++ b/src/conf/node_device_conf.h +@@ -64,6 +64,7 @@ typedef enum { + VIR_NODE_DEV_CAP_MDEV_TYPES, /* Device capable of mediated devices */ + VIR_NODE_DEV_CAP_MDEV, /* Mediated device */ + VIR_NODE_DEV_CAP_CCW_DEV, /* s390 CCW device */ ++ VIR_NODE_DEV_CAP_VDPA, /* vDPA device */ + + VIR_NODE_DEV_CAP_LAST + } virNodeDevCapType; +@@ -271,6 +272,12 @@ struct _virNodeDevCapCCW { + unsigned int devno; + }; + ++typedef struct _virNodeDevCapVDPA virNodeDevCapVDPA; ++typedef virNodeDevCapVDPA *virNodeDevCapVDPAPtr; ++struct _virNodeDevCapVDPA { ++ char *chardev; ++}; ++ + typedef struct _virNodeDevCapData virNodeDevCapData; + typedef virNodeDevCapData *virNodeDevCapDataPtr; + struct _virNodeDevCapData { +@@ -289,6 +296,7 @@ struct _virNodeDevCapData { + virNodeDevCapDRM drm; + virNodeDevCapMdev mdev; + virNodeDevCapCCW ccw_dev; ++ virNodeDevCapVDPA vdpa; + }; + }; + +@@ -364,7 +372,8 @@ virNodeDevCapsDefFree(virNodeDevCapsDefPtr caps); + VIR_CONNECT_LIST_NODE_DEVICES_CAP_DRM | \ + VIR_CONNECT_LIST_NODE_DEVICES_CAP_MDEV_TYPES | \ + VIR_CONNECT_LIST_NODE_DEVICES_CAP_MDEV | \ +- VIR_CONNECT_LIST_NODE_DEVICES_CAP_CCW_DEV) ++ VIR_CONNECT_LIST_NODE_DEVICES_CAP_CCW_DEV | \ ++ VIR_CONNECT_LIST_NODE_DEVICES_CAP_VDPA) + + int + virNodeDeviceGetSCSIHostCaps(virNodeDevCapSCSIHostPtr scsi_host); +diff --git a/src/conf/virnodedeviceobj.c b/src/conf/virnodedeviceobj.c +index 3a34a324ca..be111741bf 100644 +--- a/src/conf/virnodedeviceobj.c ++++ b/src/conf/virnodedeviceobj.c +@@ -676,6 +676,7 @@ virNodeDeviceObjHasCap(const virNodeDeviceObj *obj, + case VIR_NODE_DEV_CAP_MDEV_TYPES: + case VIR_NODE_DEV_CAP_MDEV: + case VIR_NODE_DEV_CAP_CCW_DEV: ++ case VIR_NODE_DEV_CAP_VDPA: + case VIR_NODE_DEV_CAP_LAST: + break; + } +@@ -826,7 +827,8 @@ virNodeDeviceObjMatch(virNodeDeviceObjPtr obj, + MATCH(DRM) || + MATCH(MDEV_TYPES) || + MATCH(MDEV) || +- MATCH(CCW_DEV))) ++ MATCH(CCW_DEV) || ++ MATCH(VDPA))) + return false; + } + +diff --git a/src/node_device/node_device_udev.c b/src/node_device/node_device_udev.c +index 0d8a7db5c6..2764315325 100644 +--- a/src/node_device/node_device_udev.c ++++ b/src/node_device/node_device_udev.c +@@ -1089,6 +1089,53 @@ udevProcessCCW(struct udev_device *device, + return 0; + } + ++static int ++udevGetVDPACharDev(const char *sysfs_path, ++ virNodeDevCapDataPtr data) ++{ ++ struct dirent *entry; ++ DIR *dir = NULL; ++ int direrr; ++ ++ if (virDirOpenIfExists(&dir, sysfs_path) <= 0) ++ return -1; ++ ++ while ((direrr = virDirRead(dir, &entry, NULL)) > 0) { ++ if (g_str_has_prefix(entry->d_name, "vhost-vdpa")) { ++ g_autofree char *chardev = g_strdup_printf("/dev/%s", entry->d_name); ++ ++ if (!virFileExists(chardev)) { ++ virReportError(VIR_ERR_INTERNAL_ERROR, ++ _("vDPA chardev path '%s' does not exist"), ++ chardev); ++ return -1; ++ } ++ VIR_DEBUG("vDPA chardev is at '%s'", chardev); ++ ++ data->vdpa.chardev = g_steal_pointer(&chardev); ++ break; ++ } ++ } ++ ++ if (direrr < 0) ++ return -1; ++ ++ return 0; ++} ++ ++static int ++udevProcessVDPA(struct udev_device *device, ++ virNodeDeviceDefPtr def) ++{ ++ if (udevGenerateDeviceName(device, def, NULL) != 0) ++ return -1; ++ ++ if (udevGetVDPACharDev(def->sysfs_path, &def->caps->data) < 0) ++ return -1; ++ ++ return 0; ++} ++ + + static int + udevGetDeviceNodes(struct udev_device *device, +@@ -1168,6 +1215,8 @@ udevGetDeviceType(struct udev_device *device, + *type = VIR_NODE_DEV_CAP_MDEV; + else if (STREQ_NULLABLE(subsystem, "ccw")) + *type = VIR_NODE_DEV_CAP_CCW_DEV; ++ else if (STREQ_NULLABLE(subsystem, "vdpa")) ++ *type = VIR_NODE_DEV_CAP_VDPA; + + VIR_FREE(subsystem); + } +@@ -1212,6 +1261,8 @@ udevGetDeviceDetails(struct udev_device *device, + return udevProcessMediatedDevice(device, def); + case VIR_NODE_DEV_CAP_CCW_DEV: + return udevProcessCCW(device, def); ++ case VIR_NODE_DEV_CAP_VDPA: ++ return udevProcessVDPA(device, def); + case VIR_NODE_DEV_CAP_MDEV_TYPES: + case VIR_NODE_DEV_CAP_SYSTEM: + case VIR_NODE_DEV_CAP_FC_HOST: +diff --git a/tools/virsh-nodedev.c b/tools/virsh-nodedev.c +index 7f091d7cf8..f831b36054 100644 +--- a/tools/virsh-nodedev.c ++++ b/tools/virsh-nodedev.c +@@ -462,6 +462,9 @@ cmdNodeListDevices(vshControl *ctl, const vshCmd *cmd G_GNUC_UNUSED) + case VIR_NODE_DEV_CAP_CCW_DEV: + flags |= VIR_CONNECT_LIST_NODE_DEVICES_CAP_CCW_DEV; + break; ++ case VIR_NODE_DEV_CAP_VDPA: ++ flags |= VIR_CONNECT_LIST_NODE_DEVICES_CAP_VDPA; ++ break; + case VIR_NODE_DEV_CAP_LAST: + break; + } +-- +2.27.0 + diff --git a/Use-un-signed-printf-specifiers-correctly.patch b/Use-un-signed-printf-specifiers-correctly.patch new file mode 100644 index 0000000000000000000000000000000000000000..04f90f4bb9030ee122f79aee0ea0aa82202a926d --- /dev/null +++ b/Use-un-signed-printf-specifiers-correctly.patch @@ -0,0 +1,100 @@ +From 37a05df2eb7e880c1bde301adf2b2eb32fc9a891 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?J=C3=A1n=20Tomko?= +Date: Tue, 22 Sep 2020 22:17:03 +0200 +Subject: [PATCH] Use (un)signed printf specifiers correctly +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Various places reported by cppcheck's invalidPrintfArgType_sint +and invalidPrintfArgType_uint. + +Signed-off-by: Ján Tomko +Reviewed-by: Peter Krempa +Signed-off-by: zhujun2 +(cherry-pick from 8b80d9f0f924ddf900b726871916f8ba5ae29243) +--- + examples/c/domain/domtop.c | 2 +- + examples/c/domain/suspend.c | 2 +- + tests/qemusecuritymock.c | 2 +- + tests/virhashtest.c | 4 ++-- + tests/virpcimock.c | 2 +- + 5 files changed, 6 insertions(+), 6 deletions(-) + +diff --git a/examples/c/domain/domtop.c b/examples/c/domain/domtop.c +index 15611c586d..5228445b7c 100644 +--- a/examples/c/domain/domtop.c ++++ b/examples/c/domain/domtop.c +@@ -115,7 +115,7 @@ parse_argv(int argc, char *argv[], + } + *milliseconds = val; + if (*milliseconds != val) { +- ERROR("Integer overflow: %ld", val); ++ ERROR("Integer overflow: %lu", val); + exit(EXIT_FAILURE); + } + break; +diff --git a/examples/c/domain/suspend.c b/examples/c/domain/suspend.c +index 980c4584c7..3ff24f6861 100644 +--- a/examples/c/domain/suspend.c ++++ b/examples/c/domain/suspend.c +@@ -105,7 +105,7 @@ parse_argv(int argc, char *argv[], + } + *seconds = val; + if (*seconds != val) { +- ERROR("Integer overflow: %ld", val); ++ ERROR("Integer overflow: %lu", val); + return -1; + } + break; +diff --git a/tests/qemusecuritymock.c b/tests/qemusecuritymock.c +index ad182c7bf7..e1057bef7b 100644 +--- a/tests/qemusecuritymock.c ++++ b/tests/qemusecuritymock.c +@@ -269,7 +269,7 @@ mock_chown(const char *path, + int ret = -1; + + if (gid >> 16 || uid >> 16) { +- fprintf(stderr, "Attempt to set too high UID or GID: %lld %lld", ++ fprintf(stderr, "Attempt to set too high UID or GID: %llu %llu", + (unsigned long long) uid, (unsigned long long) gid); + abort(); + } +diff --git a/tests/virhashtest.c b/tests/virhashtest.c +index 4d05cbb0f8..af30791241 100644 +--- a/tests/virhashtest.c ++++ b/tests/virhashtest.c +@@ -34,7 +34,7 @@ testHashInit(int size) + } + + if (virHashTableSize(hash) != oldsize) { +- VIR_TEST_DEBUG("hash grown from %zd to %zd", ++ VIR_TEST_DEBUG("hash grown from %zu to %zu", + (size_t)oldsize, (size_t)virHashTableSize(hash)); + } + } +@@ -313,7 +313,7 @@ testHashRemoveSet(const void *data G_GNUC_UNUSED) + + if (count != rcount) { + VIR_TEST_VERBOSE("\nvirHashRemoveSet didn't remove expected number of" +- " entries, %d != %u", ++ " entries, %d != %d", + rcount, count); + goto cleanup; + } +diff --git a/tests/virpcimock.c b/tests/virpcimock.c +index 92b6f810d8..d0fe11e5f1 100644 +--- a/tests/virpcimock.c ++++ b/tests/virpcimock.c +@@ -120,7 +120,7 @@ struct pciDeviceAddress { + unsigned int device; + unsigned int function; + }; +-# define ADDR_STR_FMT "%04x:%02x:%02x.%d" ++# define ADDR_STR_FMT "%04x:%02x:%02x.%u" + + struct pciDevice { + struct pciDeviceAddress addr; +-- +2.27.0 + diff --git a/admin-fix-leak-of-typed-parameters-on-error.patch b/admin-fix-leak-of-typed-parameters-on-error.patch new file mode 100644 index 0000000000000000000000000000000000000000..66b0adf94726c1a1fae0519abc6fdc170cb46fe4 --- /dev/null +++ b/admin-fix-leak-of-typed-parameters-on-error.patch @@ -0,0 +1,62 @@ +From 90b8168fd93490f3a0fadadb38030163712a0e85 Mon Sep 17 00:00:00 2001 +From: wangmeiyang +Date: Fri, 21 Apr 2023 14:43:45 +0800 +Subject: [PATCH] admin: fix leak of typed parameters on error +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +A few admin client methods had the xdr_free call the wrong +side of the cleanup label, so typed parameters would not +be freed on error. + +origin commit: https://gitlab.com/libvirt/libvirt/-/commit/0edf44664e9f2f75c7ba5faab91e2e190b5626af +Reviewed-by: Martin Kletzander +Signed-off-by: Daniel P. Berrangé +Signed-off-by: Meiyang Wang +--- + src/admin/admin_remote.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +diff --git a/src/admin/admin_remote.c b/src/admin/admin_remote.c +index ca5e0c9fe4..2499fb8b0f 100644 +--- a/src/admin/admin_remote.c ++++ b/src/admin/admin_remote.c +@@ -271,9 +271,9 @@ remoteAdminServerGetThreadPoolParameters(virAdmServerPtr srv, + goto cleanup; + + rv = 0; +- xdr_free((xdrproc_t)xdr_admin_server_get_threadpool_parameters_ret, (char *) &ret); + + cleanup: ++ xdr_free((xdrproc_t)xdr_admin_server_get_threadpool_parameters_ret, (char *) &ret); + virObjectUnlock(priv); + return rv; + } +@@ -344,9 +344,9 @@ remoteAdminClientGetInfo(virAdmClientPtr client, + goto cleanup; + + rv = 0; +- xdr_free((xdrproc_t)xdr_admin_client_get_info_ret, (char *) &ret); + + cleanup: ++ xdr_free((xdrproc_t)xdr_admin_client_get_info_ret, (char *) &ret); + virObjectUnlock(priv); + return rv; + } +@@ -382,10 +382,10 @@ remoteAdminServerGetClientLimits(virAdmServerPtr srv, + goto cleanup; + + rv = 0; +- xdr_free((xdrproc_t) xdr_admin_server_get_client_limits_ret, +- (char *) &ret); + + cleanup: ++ xdr_free((xdrproc_t) xdr_admin_server_get_client_limits_ret, ++ (char *) &ret); + virObjectUnlock(priv); + return rv; + } +-- +2.27.0 + diff --git a/esx-call-freeaddrinfo-earlier-in-esxUtil_ResolveHost.patch b/esx-call-freeaddrinfo-earlier-in-esxUtil_ResolveHost.patch new file mode 100644 index 0000000000000000000000000000000000000000..ec363101af232c3bb162feb8fd92a875a279d1d2 --- /dev/null +++ b/esx-call-freeaddrinfo-earlier-in-esxUtil_ResolveHost.patch @@ -0,0 +1,42 @@ +From 9b80543fb6ebccf64d0bcbe91a2e97873886164c Mon Sep 17 00:00:00 2001 +From: tangbinzy +Date: Thu, 16 Mar 2023 07:03:51 +0000 +Subject: [PATCH] esx: call freeaddrinfo earlier in esxUtil_ResolveHostname + Call freeaddrinfo() as soon as @result is not needed anymore, i.e. right + after getnameinfo(); this avoids calling freeaddrinfo() in two branches. + +Signed-off-by: Pino Toscano +Reviewed-by: Laine Stump + +Signed-off-by: tangbin +(cherry-pick from 3aaf23ff69cea9abb7b7a43d9ff3eb687a916a2e) +--- + src/esx/esx_util.c | 4 +--- + 1 file changed, 1 insertion(+), 3 deletions(-) + +diff --git a/src/esx/esx_util.c b/src/esx/esx_util.c +index 89d136248f..98ce462ff0 100644 +--- a/src/esx/esx_util.c ++++ b/src/esx/esx_util.c +@@ -311,17 +311,15 @@ esxUtil_ResolveHostname(const char *hostname, + + errcode = getnameinfo(result->ai_addr, result->ai_addrlen, ipAddress, + ipAddress_length, NULL, 0, NI_NUMERICHOST); ++ freeaddrinfo(result); + + if (errcode != 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("Formatting IP address for host '%s' failed: %s"), hostname, + gai_strerror(errcode)); +- freeaddrinfo(result); + return -1; + } + +- freeaddrinfo(result); +- + return 0; + } + +-- +2.27.0 + diff --git a/fix-the-issue-of-errors-when-saving-after-virsh-edit.patch b/fix-the-issue-of-errors-when-saving-after-virsh-edit.patch new file mode 100644 index 0000000000000000000000000000000000000000..7a0e38ae565279cfa7b538e930caa8780054e9b4 --- /dev/null +++ b/fix-the-issue-of-errors-when-saving-after-virsh-edit.patch @@ -0,0 +1,24 @@ +From d5c1bd627d522b16eb87e2684a912c16ce79c12b Mon Sep 17 00:00:00 2001 +From: lifeng 71117973 +Date: Mon, 15 May 2023 15:39:32 +0800 +Subject: [PATCH] fix the issue of errors when saving after 'virsh edit' + +--- + docs/schemas/basictypes.rng | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/docs/schemas/basictypes.rng b/docs/schemas/basictypes.rng +index 34d285db48..8b430e71a6 100644 +--- a/docs/schemas/basictypes.rng ++++ b/docs/schemas/basictypes.rng +@@ -440,6 +440,7 @@ + sh4eb + sparc + sparc64 ++ sw_64 + unicore32 + x86_64 + xtensa +-- +2.27.0 + diff --git a/libvirt.spec b/libvirt.spec index 77e0a22480815bd15b5bb45885a23cb78c08ba00..c681a93d031b456f5b5664465d0526f70d42de85 100644 --- a/libvirt.spec +++ b/libvirt.spec @@ -101,7 +101,7 @@ Summary: Library providing a simple virtualization API Name: libvirt Version: 6.2.0 -Release: 59 +Release: 60 License: LGPLv2+ URL: https://libvirt.org/ @@ -489,6 +489,21 @@ Patch0376: selinux-adapt-to-libselinux.patch Patch0377: Revert-selinux-adapt-to-libselinux.patch Patch0378: selinux-Reflect-context_str-type-change.patch Patch0379: virnetsshsession-Adapt-to-change-libssh2-API.patch +Patch0380: qemu-Fix-incorrect-command-name-in-error-messages.patch +Patch0381: esx-call-freeaddrinfo-earlier-in-esxUtil_ResolveHost.patch +Patch0382: admin-fix-leak-of-typed-parameters-on-error.patch +Patch0383: Use-un-signed-printf-specifiers-correctly.patch +Patch0384: fix-the-issue-of-errors-when-saving-after-virsh-edit.patch +Patch0385: virrandom-Fix-printf-format-string-in-virRandomGener.patch +Patch0386: qemu_migration_cookie-Rename-ret-in-qemuDomainExtrac.patch +Patch0387: tests-upstream-Fixing-compiler-warning-in-cputest.patch +Patch0388: qemu-Return-perf-status-that-affect-next-boot-for-sh.patch +Patch0389: lxc-fix-lxcContainerMountAllFS-DEREF_BEFORE_CHECK.patch +Patch0390: Include-vdpa-devices-in-node-device-list.patch +Patch0391: node_device-fix-leak-of-DIR.patch +Patch0392: vdpa-Introduce-the-new-device-type-vdpa-to-hostdev.patch +Patch0393: vdpa-support-vdpa-device-hot-plug-unplug.patch +Patch0394: vdpa-support-vdpa-device-migrate.patch Requires: libvirt-daemon = %{version}-%{release} Requires: libvirt-daemon-config-network = %{version}-%{release} @@ -2225,6 +2240,24 @@ exit 0 %changelog +* Wed Nov 29 2023 Jiabo Feng - 6.2.0-60 +- vdpa: support vdpa device migrate +- vdpa: support vdpa device hot plug/unplug +- vdpa: Introduce the new device type vdpa to hostdev +- node_device: fix leak of DIR* +- Include vdpa devices in node device list +- lxc: fix lxcContainerMountAllFS() DEREF_BEFORE_CHECK +- qemu: Return perf status that affect next boot for shutoff domains While we set up perf events for a shutoff domain and check the settings, All of perf events are reported as 'disabled', unless we add --config, This is redundant for a shutoff domain. +- tests: upstream Fixing compiler warning in cputest +- qemu_migration_cookie: Rename ret in qemuDomainExtractTLSSubject +- virrandom: Fix printf format string in virRandomGenerateWWN() +- fix the issue of errors when saving after 'virsh edit' +- Use (un)signed printf specifiers correctly +- admin: fix leak of typed parameters on error +- esx: call freeaddrinfo earlier in esxUtil_ResolveHostname Call freeaddrinfo() as soon as @result is not needed anymore, i.e. right after getnameinfo(); this avoids calling freeaddrinfo() in two branches. +- qemu: Fix incorrect command name in error messages + + * Wed Aug 9 2023 Jiabo Feng - 6.2.0-59 - virnetsshsession: Adapt to change libssh2 API - selinux: Reflect context_str() type change diff --git a/lxc-fix-lxcContainerMountAllFS-DEREF_BEFORE_CHECK.patch b/lxc-fix-lxcContainerMountAllFS-DEREF_BEFORE_CHECK.patch new file mode 100644 index 0000000000000000000000000000000000000000..c3515b4c9f675750c93be197c258c4b7c50bbba7 --- /dev/null +++ b/lxc-fix-lxcContainerMountAllFS-DEREF_BEFORE_CHECK.patch @@ -0,0 +1,42 @@ +From 24994ec0adb7385e56b740f85a1bc0ed0a8002cd Mon Sep 17 00:00:00 2001 +From: Dmitry Frolov +Date: Thu, 7 Sep 2023 12:04:57 +0300 +Subject: [PATCH] lxc: fix lxcContainerMountAllFS() DEREF_BEFORE_CHECK + +vmDef->fss[i]->src->path may be NULL, +so check is needed before passing it to VIR_DEBUG. +Also removed checking vmDef->fss[i]->src for NULL, since it may not be NULL. + +Fixes: 57487085dc ("lxc: don't try to reference NULL when mounting filesystems") + +Signed-off-by: Dmitry Frolov +Signed-off-by: Michal Privoznik +Reviewed-by: Michal Privoznik +Signed-off-by: zhujun2 +--- + src/lxc/lxc_container.c | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +diff --git a/src/lxc/lxc_container.c b/src/lxc/lxc_container.c +index 1c28ecfdb7..4736c14cb7 100644 +--- a/src/lxc/lxc_container.c ++++ b/src/lxc/lxc_container.c +@@ -1579,12 +1579,13 @@ static int lxcContainerMountAllFS(virDomainDefPtr vmDef, + if (STREQ(vmDef->fss[i]->dst, "/")) + continue; + +- VIR_DEBUG("Mounting '%s' -> '%s'", vmDef->fss[i]->src->path, vmDef->fss[i]->dst); ++ VIR_DEBUG("Mounting '%s' -> '%s'", NULLSTR(vmDef->fss[i]->src->path), ++ vmDef->fss[i]->dst); + + if (lxcContainerResolveSymlinks(vmDef->fss[i], false) < 0) + return -1; + +- if (!(vmDef->fss[i]->src && vmDef->fss[i]->src->path && ++ if (!(vmDef->fss[i]->src->path && + STRPREFIX(vmDef->fss[i]->src->path, vmDef->fss[i]->dst)) && + lxcContainerUnmountSubtree(vmDef->fss[i]->dst, false) < 0) + return -1; +-- +2.27.0 + diff --git a/node_device-fix-leak-of-DIR.patch b/node_device-fix-leak-of-DIR.patch new file mode 100644 index 0000000000000000000000000000000000000000..f52b7b41c35d33d7a57428924cad7d7106341452 --- /dev/null +++ b/node_device-fix-leak-of-DIR.patch @@ -0,0 +1,46 @@ +From bbe1178cd6375270b01324dbbd4b34f17ff6ac1a Mon Sep 17 00:00:00 2001 +From: AlexChen +Date: Tue, 27 Oct 2020 21:43:47 -0400 +Subject: [PATCH] node_device: fix leak of DIR* +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Commit 53aec799fa31 introduced the function udevGetVDPACharDev(), +which scans a directory using virDirOpenIfExists() and +virDirRead(). It unfortunately forgets to close the DIR* when it is +finished with it. This patch fixes that omission. + +Fixes: 53aec799fa31711ffaeacc7ec17ec6d3c2e3cadf +Signed-off-by: Laine Stump +Reviewed-by: Daniel Henrique Barboza +Reviewed-by: Ján Tomko +Signed-off-by: AlexChen +--- + src/node_device/node_device_udev.c | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/src/node_device/node_device_udev.c b/src/node_device/node_device_udev.c +index 2764315325..a5a018652b 100644 +--- a/src/node_device/node_device_udev.c ++++ b/src/node_device/node_device_udev.c +@@ -1108,6 +1108,7 @@ udevGetVDPACharDev(const char *sysfs_path, + virReportError(VIR_ERR_INTERNAL_ERROR, + _("vDPA chardev path '%s' does not exist"), + chardev); ++ VIR_DIR_CLOSE(dir); + return -1; + } + VIR_DEBUG("vDPA chardev is at '%s'", chardev); +@@ -1117,6 +1118,8 @@ udevGetVDPACharDev(const char *sysfs_path, + } + } + ++ VIR_DIR_CLOSE(dir); ++ + if (direrr < 0) + return -1; + +-- +2.27.0 + diff --git a/qemu-Fix-incorrect-command-name-in-error-messages.patch b/qemu-Fix-incorrect-command-name-in-error-messages.patch new file mode 100644 index 0000000000000000000000000000000000000000..be4878a3379d4df057deeab294d6e5af2ecfad88 --- /dev/null +++ b/qemu-Fix-incorrect-command-name-in-error-messages.patch @@ -0,0 +1,28 @@ +From a538fbbfb2d12de1b3c33db7c7f25a133a4e94df Mon Sep 17 00:00:00 2001 +From: Xu Zheng +Date: Wed, 2 Aug 2023 16:56:49 +0800 +Subject: [PATCH] qemu: Fix incorrect command name in error messages + +cherry-pick from 194cfb44e77ce25d99240f24321559f569251e68 +Signed-off-by: Andrea Bolognani +Signed-off-by: Xu Zheng +--- + src/qemu/qemu_monitor_json.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c +index afd826bc2f..8f040bbe59 100644 +--- a/src/qemu/qemu_monitor_json.c ++++ b/src/qemu/qemu_monitor_json.c +@@ -5665,7 +5665,7 @@ int qemuMonitorJSONGetMachines(qemuMonitorPtr mon, + if (virJSONValueObjectHasKey(child, "numa-mem-supported")) { + if (virJSONValueObjectGetBoolean(child, "numa-mem-supported", &info->numaMemSupported) < 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", +- _("qemu-machines reply has malformed " ++ _("query-machines reply has malformed " + "'numa-mem-supported' data")); + goto cleanup; + } +-- +2.27.0 + diff --git a/qemu-Return-perf-status-that-affect-next-boot-for-sh.patch b/qemu-Return-perf-status-that-affect-next-boot-for-sh.patch new file mode 100644 index 0000000000000000000000000000000000000000..4800dc71ffcac0ed5203e3d50f1510e4e8435165 --- /dev/null +++ b/qemu-Return-perf-status-that-affect-next-boot-for-sh.patch @@ -0,0 +1,95 @@ +From 1686b198dcf9b695a864f82d18fbc9b2e76f54df Mon Sep 17 00:00:00 2001 +From: tangbinzy +Date: Thu, 16 Mar 2023 02:17:30 +0000 +Subject: [PATCH] qemu: Return perf status that affect next boot for shutoff + domains While we set up perf events for a shutoff domain and check the + settings, All of perf events are reported as 'disabled', unless we add + --config, This is redundant for a shutoff domain. +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + + # virsh domstate $GUEST +shut off + + # virsh perf --domain $GUEST +cmt : disabled +mbmt : disabled +mbml : disabled +...... + + # virsh perf --domain $GUEST --enable mbmt +mbmt : enabled + + # virsh perf --domain $GUEST +cmt : disabled +mbmt : disabled +mbml : disabled +...... + +Use virDomainObjGetOneDefState instead of virDomainObjGetOneDef to fix +the issue. After patch, The perf event status of a shutoff domain is +reported correctly: + + # virsh domstate $GUEST +shut off + + # virsh perf --domain $GUEST +cmt : disabled +mbmt : disabled +mbml : disabled +...... + + # virsh perf --domain $GUEST --enable mbmt +mbmt : enabled + + # virsh perf --domain $GUEST +cmt : disabled +mbmt : enabled +mbml : disabled +...... + +Signed-off-by: Lin Ma +Reviewed-by: Erik Skultety +Reviewed-by: Ján Tomko +Signed-off-by: Ján Tomko + +Signed-off-by: tangbin +(cherry-pick from 10841b6cb612fed1a4cb9be05c4f5e150008cac7) +--- + src/qemu/qemu_driver.c | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c +index 32b3ef3cf1..ed621262aa 100644 +--- a/src/qemu/qemu_driver.c ++++ b/src/qemu/qemu_driver.c +@@ -9952,6 +9952,7 @@ qemuDomainGetPerfEvents(virDomainPtr dom, + int npar = 0; + size_t i; + int ret = -1; ++ bool live = false; + + virCheckFlags(VIR_DOMAIN_AFFECT_LIVE | + VIR_DOMAIN_AFFECT_CONFIG | +@@ -9966,7 +9967,7 @@ qemuDomainGetPerfEvents(virDomainPtr dom, + if (qemuDomainObjBeginJob(driver, vm, QEMU_JOB_QUERY) < 0) + goto cleanup; + +- if (!(def = virDomainObjGetOneDef(vm, flags))) ++ if (!(def = virDomainObjGetOneDefState(vm, flags, &live))) + goto endjob; + + priv = vm->privateData; +@@ -9974,7 +9975,7 @@ qemuDomainGetPerfEvents(virDomainPtr dom, + for (i = 0; i < VIR_PERF_EVENT_LAST; i++) { + bool perf_enabled; + +- if (flags & VIR_DOMAIN_AFFECT_CONFIG) ++ if ((flags & VIR_DOMAIN_AFFECT_CONFIG) || !live) + perf_enabled = def->perf.events[i] == VIR_TRISTATE_BOOL_YES; + else + perf_enabled = virPerfEventIsEnabled(priv->perf, i); +-- +2.27.0 + diff --git a/qemu_migration_cookie-Rename-ret-in-qemuDomainExtrac.patch b/qemu_migration_cookie-Rename-ret-in-qemuDomainExtrac.patch new file mode 100644 index 0000000000000000000000000000000000000000..74a7d073aa59e8c152c30cc84997b4030bbc1f1e --- /dev/null +++ b/qemu_migration_cookie-Rename-ret-in-qemuDomainExtrac.patch @@ -0,0 +1,66 @@ +From b054dea7aa794414e7245721178937ab989596b2 Mon Sep 17 00:00:00 2001 +From: wangjinlei +Date: Tue, 29 Aug 2023 19:30:40 +0800 +Subject: [PATCH] qemu_migration_cookie: Rename ret in + qemuDomainExtractTLSSubject +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +We use 'ret' for storing values to be returned from a function. Return +values from called functions that are not supposed to be returned +further are usually called 'rv' (or 'rc'). + +upstream commit: d116f187c69c3eefa9bfeafaf7242009f2adf531 + +Signed-off-by: Jiri Denemark +Reviewed-by: Ján Tomko +--- + src/qemu/qemu_migration_cookie.c | 14 +++++++------- + 1 file changed, 7 insertions(+), 7 deletions(-) + +diff --git a/src/qemu/qemu_migration_cookie.c b/src/qemu/qemu_migration_cookie.c +index 1d88ac1d22..0a0ac11d88 100644 +--- a/src/qemu/qemu_migration_cookie.c ++++ b/src/qemu/qemu_migration_cookie.c +@@ -138,7 +138,7 @@ qemuDomainExtractTLSSubject(const char *certdir) + char *pemdata = NULL; + gnutls_datum_t pemdatum; + gnutls_x509_crt_t cert; +- int ret; ++ int rc; + size_t subjectlen; + + certfile = g_strdup_printf("%s/server-cert.pem", certdir); +@@ -149,22 +149,22 @@ qemuDomainExtractTLSSubject(const char *certdir) + goto error; + } + +- ret = gnutls_x509_crt_init(&cert); +- if (ret < 0) { ++ rc = gnutls_x509_crt_init(&cert); ++ if (rc < 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("cannot initialize cert object: %s"), +- gnutls_strerror(ret)); ++ gnutls_strerror(rc)); + goto error; + } + + pemdatum.data = (unsigned char *)pemdata; + pemdatum.size = strlen(pemdata); + +- ret = gnutls_x509_crt_import(cert, &pemdatum, GNUTLS_X509_FMT_PEM); +- if (ret < 0) { ++ rc = gnutls_x509_crt_import(cert, &pemdatum, GNUTLS_X509_FMT_PEM); ++ if (rc < 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("cannot load cert data from %s: %s"), +- certfile, gnutls_strerror(ret)); ++ certfile, gnutls_strerror(rc)); + goto error; + } + +-- +2.27.0 + diff --git a/tests-upstream-Fixing-compiler-warning-in-cputest.patch b/tests-upstream-Fixing-compiler-warning-in-cputest.patch new file mode 100644 index 0000000000000000000000000000000000000000..d151ef2abec0f1c656ff27355f593440b2fa94d5 --- /dev/null +++ b/tests-upstream-Fixing-compiler-warning-in-cputest.patch @@ -0,0 +1,45 @@ +From 53ff014d6e62a0bbef7e9fda360ddfe197115324 Mon Sep 17 00:00:00 2001 +From: laokz +Date: Thu, 14 Sep 2023 11:46:39 +0800 +Subject: [PATCH] tests: upstream Fixing compiler warning in cputest +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Reference: https://github.com/libvirt/libvirt/commit/67c77744d74fe99a6b0e4ddef6869b305e29d6aa +--- +tests: Fixing compiler warning in cputest + +Found when building on Fedora 36 on s390x. + + C compiler for the host machine: gcc (gcc 12.0.1 "gcc (GCC) 12.0.1 20220308 (Red Hat 12.0.1-0)") + C linker for the host machine: gcc ld.bfd 2.37-24 + + In function ‘cpuTestUpdateLiveCompare’, + inlined from ‘cpuTestUpdateLive’ at ../dist-unpack/libvirt-8.2.5/tests/cputest.c:784:12: + ../dist-unpack/libvirt-8.2.5/tests/cputest.c:696:21: warning: potential null pointer dereference [-Wnull-dereference] + 696 | featAct->policy == VIR_CPU_FEATURE_REQUIRE) || + | ~~~~~~~^~~~~~~~ + +Signed-off-by: Boris Fiuczynski +Reviewed-by: Michal Privoznik +--- + tests/cputest.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/tests/cputest.c b/tests/cputest.c +index 3657fa4095..8c22fb3ee9 100644 +--- a/tests/cputest.c ++++ b/tests/cputest.c +@@ -760,7 +760,7 @@ cpuTestUpdateLiveCompare(virArch arch, + if ((cmp == 0 && + featAct->policy == VIR_CPU_FEATURE_REQUIRE && + featExp->policy == VIR_CPU_FEATURE_DISABLE) || +- (cmp < 0 && ++ (cmp < 0 && featAct && + featAct->policy == VIR_CPU_FEATURE_REQUIRE) || + (cmp > 0 && + featExp->policy == VIR_CPU_FEATURE_DISABLE)) { +-- +2.27.0 + diff --git a/vdpa-Introduce-the-new-device-type-vdpa-to-hostdev.patch b/vdpa-Introduce-the-new-device-type-vdpa-to-hostdev.patch new file mode 100644 index 0000000000000000000000000000000000000000..22439955d50cccf46270c3afd610afa727b70637 --- /dev/null +++ b/vdpa-Introduce-the-new-device-type-vdpa-to-hostdev.patch @@ -0,0 +1,363 @@ +From ccb6ee3cd899a2209cbe29f6c3b70522b86323ba Mon Sep 17 00:00:00 2001 +From: AlexChen +Date: Sat, 25 Nov 2023 10:34:05 +0800 +Subject: [PATCH] vdpa: Introduce the new device type vdpa to hostdev + +Introduce the new device type vdpa to hostdev + +Signed-off-by: libai +Signed-off-by: jiangdongxu +Signed-off-by: AlexChen +--- + src/conf/domain_audit.c | 4 ++++ + src/conf/domain_conf.c | 38 +++++++++++++++++++++++++++++++++ + src/conf/domain_conf.h | 6 ++++++ + src/conf/virconftypes.h | 3 +++ + src/qemu/qemu_command.c | 29 +++++++++++++++++++++++++ + src/qemu/qemu_command.h | 4 ++++ + src/qemu/qemu_domain.c | 7 ++++++ + src/qemu/qemu_domain_address.c | 6 ++++-- + src/security/security_dac.c | 2 ++ + src/security/security_selinux.c | 2 ++ + 10 files changed, 99 insertions(+), 2 deletions(-) + +diff --git a/src/conf/domain_audit.c b/src/conf/domain_audit.c +index 1b0abb21a0..d920dcbf09 100644 +--- a/src/conf/domain_audit.c ++++ b/src/conf/domain_audit.c +@@ -350,6 +350,7 @@ virDomainAuditHostdev(virDomainObjPtr vm, virDomainHostdevDefPtr hostdev, + virDomainHostdevSubsysSCSIPtr scsisrc = &hostdev->source.subsys.u.scsi; + virDomainHostdevSubsysSCSIVHostPtr hostsrc = &hostdev->source.subsys.u.scsi_host; + virDomainHostdevSubsysMediatedDevPtr mdevsrc = &hostdev->source.subsys.u.mdev; ++ virDomainHostdevSubsysVDPAPtr vdpasrc = &hostdev->source.subsys.u.vdpa; + + virUUIDFormat(vm->def->uuid, uuidstr); + if (!(vmname = virAuditEncode("vm", vm->def->name))) { +@@ -393,6 +394,9 @@ virDomainAuditHostdev(virDomainObjPtr vm, virDomainHostdevDefPtr hostdev, + case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_MDEV: + address = g_strdup(mdevsrc->uuidstr); + break; ++ case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_VDPA: ++ address = g_strdup(vdpasrc->devpath); ++ break; + case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_LAST: + default: + VIR_WARN("Unexpected hostdev type while encoding audit message: %d", +diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c +index 7ae403424d..5a04d1b5d1 100644 +--- a/src/conf/domain_conf.c ++++ b/src/conf/domain_conf.c +@@ -911,6 +911,7 @@ VIR_ENUM_IMPL(virDomainHostdevSubsys, + "scsi", + "scsi_host", + "mdev", ++ "vdpa", + ); + + VIR_ENUM_IMPL(virDomainHostdevSubsysPCIBackend, +@@ -2980,6 +2981,9 @@ void virDomainHostdevDefClear(virDomainHostdevDefPtr def) + case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI_HOST: + VIR_FREE(def->source.subsys.u.scsi_host.wwpn); + break; ++ case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_VDPA: ++ VIR_FREE(def->source.subsys.u.vdpa.devpath); ++ break; + case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB: + case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI: + case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_MDEV: +@@ -6706,6 +6710,7 @@ virDomainHostdevDefValidate(const virDomainHostdevDef *hostdev) + } + break; + case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_MDEV: ++ case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_VDPA: + case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_LAST: + break; + } +@@ -8590,6 +8595,22 @@ virDomainHostdevSubsysMediatedDevDefParseXML(virDomainHostdevDefPtr def, + return 0; + } + ++static int ++virDomainHostdevSubsysVDPADefParseXML(virDomainHostdevDefPtr def, ++ xmlNodePtr sourcenode) ++{ ++ g_autofree char *devpath = NULL; ++ virDomainHostdevSubsysVDPAPtr vdpa = &def->source.subsys.u.vdpa; ++ ++ if (!(devpath = virXMLPropString(sourcenode, "dev"))) { ++ virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", ++ _("Missing 'dev' attribute for element ")); ++ return -1; ++ } ++ vdpa->devpath = g_steal_pointer(&devpath); ++ return 0; ++} ++ + static int + virDomainHostdevDefParseXMLSubsys(xmlNodePtr node, + xmlXPathContextPtr ctxt, +@@ -8779,6 +8800,11 @@ virDomainHostdevDefParseXMLSubsys(xmlNodePtr node, + if (virDomainHostdevSubsysMediatedDevDefParseXML(def, ctxt) < 0) + return -1; + break; ++ case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_VDPA: ++ if (virDomainHostdevSubsysVDPADefParseXML(def, sourcenode) < 0) { ++ return -1; ++ } ++ break; + + default: + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, +@@ -16328,6 +16354,7 @@ virDomainHostdevDefParseXML(virDomainXMLOptionPtr xmlopt, + case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI: + case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI_HOST: + case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_MDEV: ++ case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_VDPA: + case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_LAST: + break; + } +@@ -17407,6 +17434,9 @@ virDomainHostdevMatchSubsys(virDomainHostdevDefPtr a, + return 0; + case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_MDEV: + return virDomainHostdevMatchSubsysMediatedDev(a, b); ++ case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_VDPA: ++ return STREQ(a->source.subsys.u.vdpa.devpath, ++ b->source.subsys.u.vdpa.devpath); + case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_LAST: + return 0; + } +@@ -25891,6 +25921,7 @@ virDomainHostdevDefFormatSubsys(virBufferPtr buf, + virDomainHostdevSubsysSCSIPtr scsisrc = &def->source.subsys.u.scsi; + virDomainHostdevSubsysSCSIVHostPtr hostsrc = &def->source.subsys.u.scsi_host; + virDomainHostdevSubsysMediatedDevPtr mdevsrc = &def->source.subsys.u.mdev; ++ virDomainHostdevSubsysVDPAPtr vdpasrc = &def->source.subsys.u.vdpa; + virDomainHostdevSubsysSCSIHostPtr scsihostsrc = &scsisrc->u.host; + virDomainHostdevSubsysSCSIiSCSIPtr iscsisrc = &scsisrc->u.iscsi; + +@@ -25940,6 +25971,11 @@ virDomainHostdevDefFormatSubsys(virBufferPtr buf, + protocol, hostsrc->wwpn); + } + ++ if (def->source.subsys.type == VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_VDPA) { ++ closedSource = true; ++ virBufferAsprintf(buf, " dev='%s'/", vdpasrc->devpath); ++ } ++ + virBufferAddLit(buf, ">\n"); + + virBufferAdjustIndent(buf, 2); +@@ -25998,6 +26034,8 @@ virDomainHostdevDefFormatSubsys(virBufferPtr buf, + virBufferAsprintf(buf, "
\n", + mdevsrc->uuidstr); + break; ++ case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_VDPA: ++ break; + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("unexpected hostdev type %d"), +diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h +index 98fa323679..6d56ef0282 100644 +--- a/src/conf/domain_conf.h ++++ b/src/conf/domain_conf.h +@@ -199,6 +199,7 @@ typedef enum { + VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI, + VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI_HOST, + VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_MDEV, ++ VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_VDPA, + + VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_LAST + } virDomainHostdevSubsysType; +@@ -267,6 +268,10 @@ struct _virDomainHostdevSubsysMediatedDev { + int ramfb; /* virTristateSwitch */ + }; + ++struct _virDomainHostdevSubsysVDPA { ++ char *devpath; /* vDPA device path */ ++}; ++ + typedef enum { + VIR_DOMAIN_HOSTDEV_SUBSYS_SCSI_HOST_PROTOCOL_TYPE_NONE, + VIR_DOMAIN_HOSTDEV_SUBSYS_SCSI_HOST_PROTOCOL_TYPE_VHOST, +@@ -301,6 +306,7 @@ struct _virDomainHostdevSubsys { + virDomainHostdevSubsysSCSI scsi; + virDomainHostdevSubsysSCSIVHost scsi_host; + virDomainHostdevSubsysMediatedDev mdev; ++ virDomainHostdevSubsysVDPA vdpa; + } u; + }; + +diff --git a/src/conf/virconftypes.h b/src/conf/virconftypes.h +index 1c62cde251..ca1a17b262 100644 +--- a/src/conf/virconftypes.h ++++ b/src/conf/virconftypes.h +@@ -174,6 +174,9 @@ typedef virDomainHostdevSubsys *virDomainHostdevSubsysPtr; + typedef struct _virDomainHostdevSubsysMediatedDev virDomainHostdevSubsysMediatedDev; + typedef virDomainHostdevSubsysMediatedDev *virDomainHostdevSubsysMediatedDevPtr; + ++typedef struct _virDomainHostdevSubsysVDPA virDomainHostdevSubsysVDPA; ++typedef virDomainHostdevSubsysVDPA *virDomainHostdevSubsysVDPAPtr; ++ + typedef struct _virDomainHostdevSubsysPCI virDomainHostdevSubsysPCI; + typedef virDomainHostdevSubsysPCI *virDomainHostdevSubsysPCIPtr; + +diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c +index 832c17b602..d7db30d19b 100644 +--- a/src/qemu/qemu_command.c ++++ b/src/qemu/qemu_command.c +@@ -5476,6 +5476,25 @@ qemuBuildHostdevMediatedDevStr(const virDomainDef *def, + return virBufferContentAndReset(&buf); + } + ++char * ++qemuBuildHostdevVDPAStr(const virDomainDef *def, ++ virDomainHostdevDefPtr dev, ++ virQEMUCapsPtr qemuCaps) ++{ ++ g_auto(virBuffer) buf = VIR_BUFFER_INITIALIZER; ++ virDomainHostdevSubsysVDPAPtr vdpa = &dev->source.subsys.u.vdpa; ++ if (!vdpa->devpath) { ++ return NULL; ++ } ++ ++ virBufferAdd(&buf, "vhost-vdpa-device-pci", -1); ++ virBufferAsprintf(&buf, ",id=%s", dev->info->alias); ++ virBufferAsprintf(&buf, ",vhostdev=%s", vdpa->devpath); ++ if (qemuBuildDeviceAddressStr(&buf, def, dev->info, qemuCaps) < 0) ++ return NULL; ++ return virBufferContentAndReset(&buf); ++} ++ + static int + qemuBuildHostdevCommandLine(virCommandPtr cmd, + const virDomainDef *def, +@@ -5607,6 +5626,16 @@ qemuBuildHostdevCommandLine(virCommandPtr cmd, + + break; + ++ /* VDPA */ ++ case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_VDPA: ++ virCommandAddArg(cmd, "-device"); ++ if (!(devstr = qemuBuildHostdevVDPAStr(def, hostdev, qemuCaps))) { ++ return -1; ++ } ++ virCommandAddArg(cmd, devstr); ++ ++ break; ++ + case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_LAST: + break; + } +diff --git a/src/qemu/qemu_command.h b/src/qemu/qemu_command.h +index 283aaf358c..080cf41b81 100644 +--- a/src/qemu/qemu_command.h ++++ b/src/qemu/qemu_command.h +@@ -198,6 +198,10 @@ char * + qemuBuildHostdevMediatedDevStr(const virDomainDef *def, + virDomainHostdevDefPtr dev, + virQEMUCapsPtr qemuCaps); ++char * ++qemuBuildHostdevVDPAStr(const virDomainDef *def, ++ virDomainHostdevDefPtr dev, ++ virQEMUCapsPtr qemuCaps); + + char *qemuBuildRedirdevDevStr(const virDomainDef *def, + virDomainRedirdevDefPtr dev, +diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c +index 5933039f5c..fd3e3f64c0 100644 +--- a/src/qemu/qemu_domain.c ++++ b/src/qemu/qemu_domain.c +@@ -6879,6 +6879,8 @@ qemuDomainDeviceDefValidateHostdev(const virDomainHostdevDef *hostdev, + break; + case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_MDEV: + return qemuDomainMdevDefValidate(hostdev, def, qemuCaps); ++ case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_VDPA: ++ break; + case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_LAST: + default: + virReportEnumRangeError(virDomainHostdevSubsysType, +@@ -14442,6 +14444,7 @@ qemuDomainGetHostdevPath(virDomainHostdevDefPtr dev, + virDomainHostdevSubsysSCSIPtr scsisrc = &dev->source.subsys.u.scsi; + virDomainHostdevSubsysSCSIVHostPtr hostsrc = &dev->source.subsys.u.scsi_host; + virDomainHostdevSubsysMediatedDevPtr mdevsrc = &dev->source.subsys.u.mdev; ++ virDomainHostdevSubsysVDPAPtr vdpasrc = &dev->source.subsys.u.vdpa; + g_autoptr(virUSBDevice) usb = NULL; + g_autoptr(virSCSIDevice) scsi = NULL; + g_autoptr(virSCSIVHostDevice) host = NULL; +@@ -14512,6 +14515,10 @@ qemuDomainGetHostdevPath(virDomainHostdevDefPtr dev, + if (!(tmpPath = virMediatedDeviceGetIOMMUGroupDev(mdevsrc->uuidstr))) + return -1; + ++ perm = VIR_CGROUP_DEVICE_RW; ++ break; ++ case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_VDPA: ++ tmpPath = g_strdup(vdpasrc->devpath); + perm = VIR_CGROUP_DEVICE_RW; + break; + case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_LAST: +diff --git a/src/qemu/qemu_domain_address.c b/src/qemu/qemu_domain_address.c +index 7f48773832..6649553486 100644 +--- a/src/qemu/qemu_domain_address.c ++++ b/src/qemu/qemu_domain_address.c +@@ -792,7 +792,8 @@ qemuDomainDeviceCalculatePCIConnectFlags(virDomainDeviceDefPtr 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; + } + +@@ -2418,7 +2419,8 @@ qemuDomainAssignDevicePCISlots(virDomainDefPtr 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/security/security_dac.c b/src/security/security_dac.c +index 51cabf1961..52b3c156e4 100644 +--- a/src/security/security_dac.c ++++ b/src/security/security_dac.c +@@ -1357,6 +1357,7 @@ virSecurityDACSetHostdevLabel(virSecurityManagerPtr mgr, + break; + } + ++ case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_VDPA: + case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_LAST: + ret = 0; + break; +@@ -1520,6 +1521,7 @@ virSecurityDACRestoreHostdevLabel(virSecurityManagerPtr mgr, + break; + } + ++ case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_VDPA: + case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_LAST: + ret = 0; + break; +diff --git a/src/security/security_selinux.c b/src/security/security_selinux.c +index cb4dc3e101..54cb42fb8d 100644 +--- a/src/security/security_selinux.c ++++ b/src/security/security_selinux.c +@@ -2213,6 +2213,7 @@ virSecuritySELinuxSetHostdevSubsysLabel(virSecurityManagerPtr mgr, + break; + } + ++ case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_VDPA: + case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_LAST: + ret = 0; + break; +@@ -2449,6 +2450,7 @@ virSecuritySELinuxRestoreHostdevSubsysLabel(virSecurityManagerPtr mgr, + break; + } + ++ case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_VDPA: + case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_LAST: + ret = 0; + break; +-- +2.27.0 + diff --git a/vdpa-support-vdpa-device-hot-plug-unplug.patch b/vdpa-support-vdpa-device-hot-plug-unplug.patch new file mode 100644 index 0000000000000000000000000000000000000000..5890c6fe91e505aa1680b10748d7683143dd63ef --- /dev/null +++ b/vdpa-support-vdpa-device-hot-plug-unplug.patch @@ -0,0 +1,150 @@ +From 9033b938d402c3eb2cbc13b3dc2a87b191b03aed Mon Sep 17 00:00:00 2001 +From: AlexChen +Date: Sat, 25 Nov 2023 09:51:46 +0800 +Subject: [PATCH] vdpa: support vdpa device hot plug/unplug + +support vdpa device hot plug/unplug + +Signed-off-by: jiangdongxu +Signed-off-by: AlexChen +--- + src/qemu/qemu_hotplug.c | 95 +++++++++++++++++++++++++++++++++++++++++ + 1 file changed, 95 insertions(+) + +diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c +index e13879cde3..3c5540291b 100644 +--- a/src/qemu/qemu_hotplug.c ++++ b/src/qemu/qemu_hotplug.c +@@ -2907,6 +2907,89 @@ qemuDomainAttachMediatedDevice(virQEMUDriverPtr driver, + } + + ++static int ++qemuDomainAttachVDPADevice(virQEMUDriverPtr driver, ++ virDomainObjPtr vm, ++ virDomainHostdevDefPtr hostdev) ++{ ++ int ret = -1; ++ g_autofree char *devstr = NULL; ++ bool teardowncgroup = false; ++ bool teardownlabel = false; ++ bool teardowndevice = false; ++ bool teardownmemlock = false; ++ bool releaseaddr = false; ++ qemuDomainObjPrivatePtr priv = vm->privateData; ++ virDomainDeviceDef dev = { VIR_DOMAIN_DEVICE_HOSTDEV, ++ { .hostdev = hostdev } }; ++ ++ if (qemuDomainNamespaceSetupHostdev(vm, hostdev) < 0) ++ goto error; ++ teardowndevice = true; ++ ++ if (qemuSetupHostdevCgroup(vm, hostdev) < 0) ++ goto error; ++ teardowncgroup = true; ++ ++ if (qemuSecuritySetHostdevLabel(driver, vm, hostdev) < 0) ++ goto error; ++ teardownlabel = true; ++ ++ if (qemuDomainEnsurePCIAddress(vm, &dev, driver) < 0) ++ goto error; ++ releaseaddr = true; ++ ++ if (qemuAssignDeviceHostdevAlias(vm->def, &hostdev->info->alias, -1) < 0) ++ goto error; ++ ++ if (!virDomainObjIsActive(vm)) { ++ virReportError(VIR_ERR_INTERNAL_ERROR, "%s", ++ _("guest unexpectedly quit during hotplug")); ++ goto error; ++ } ++ ++ if (!(devstr = qemuBuildHostdevVDPAStr(vm->def, hostdev, priv->qemuCaps))) ++ goto error; ++ ++ if (VIR_REALLOC_N(vm->def->hostdevs, vm->def->nhostdevs + 1) < 0) ++ goto error; ++ ++ if (qemuDomainAdjustMaxMemLockHostdev(vm, hostdev) < 0) ++ goto error; ++ teardownmemlock = true; ++ ++ qemuDomainObjEnterMonitor(driver, vm); ++ ret = qemuMonitorAddDevice(priv->mon, devstr); ++ if (qemuDomainObjExitMonitor(driver, vm) < 0) { ++ goto error; ++ } ++ ++ virDomainAuditHostdev(vm, hostdev, "attach", ret == 0); ++ if (ret < 0) ++ goto error; ++ ++ vm->def->hostdevs[vm->def->nhostdevs++] = hostdev; ++ ++ return 0; ++ ++ error: ++ if (teardowncgroup && qemuTeardownHostdevCgroup(vm, hostdev) < 0) ++ VIR_WARN("Unable to remove host device cgroup ACL on hotplug fail"); ++ if (teardownlabel && ++ qemuSecurityRestoreHostdevLabel(driver, vm, hostdev) < 0) ++ VIR_WARN("Unable to restore host device labelling on hotplug fail"); ++ if (teardowndevice && ++ qemuDomainNamespaceTeardownHostdev(vm, hostdev) < 0) ++ VIR_WARN("Unable to remove host device from /dev"); ++ if (teardownmemlock && qemuDomainAdjustMaxMemLock(vm, false) < 0) ++ VIR_WARN("Unable to reset maximum locked memory on hotplug fail"); ++ if (releaseaddr) ++ qemuDomainReleaseDeviceAddress(vm, hostdev->info); ++ ++ return -1; ++} ++ ++ + int + qemuDomainAttachHostDevice(virQEMUDriverPtr driver, + virDomainObjPtr vm, +@@ -2947,6 +3030,11 @@ qemuDomainAttachHostDevice(virQEMUDriverPtr driver, + return -1; + break; + ++ case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_VDPA: ++ if (qemuDomainAttachVDPADevice(driver, vm, hostdev) < 0) ++ return -1; ++ break; ++ + default: + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, + _("hotplug is not supported for hostdev subsys type '%s'"), +@@ -4564,6 +4652,7 @@ qemuDomainRemoveHostDevice(virQEMUDriverPtr driver, + case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_MDEV: + qemuDomainRemoveMediatedDevice(driver, vm, hostdev); + break; ++ case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_VDPA: + case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_LAST: + break; + } +@@ -5397,6 +5486,7 @@ qemuDomainDetachPrepHostdev(virDomainObjPtr vm, + virDomainHostdevSubsysPCIPtr pcisrc = &subsys->u.pci; + virDomainHostdevSubsysSCSIPtr scsisrc = &subsys->u.scsi; + virDomainHostdevSubsysMediatedDevPtr mdevsrc = &subsys->u.mdev; ++ virDomainHostdevSubsysVDPAPtr vdpasrc = &subsys->u.vdpa; + virDomainHostdevDefPtr hostdev = NULL; + int idx; + +@@ -5454,6 +5544,11 @@ qemuDomainDetachPrepHostdev(virDomainObjPtr vm, + break; + case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI_HOST: + break; ++ case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_VDPA: ++ virReportError(VIR_ERR_DEVICE_MISSING, ++ _("vdpa device '%s' not found"), ++ vdpasrc->devpath); ++ break; + default: + virReportError(VIR_ERR_INTERNAL_ERROR, + _("unexpected hostdev type %d"), subsys->type); +-- +2.27.0 + diff --git a/vdpa-support-vdpa-device-migrate.patch b/vdpa-support-vdpa-device-migrate.patch new file mode 100644 index 0000000000000000000000000000000000000000..1bb57d9f7f50b0d120526e845d5fff7e85c60003 --- /dev/null +++ b/vdpa-support-vdpa-device-migrate.patch @@ -0,0 +1,30 @@ +From 9c99d1cfbcd12f4def9a836b62c6f0c044aecb86 Mon Sep 17 00:00:00 2001 +From: AlexChen +Date: Sat, 25 Nov 2023 09:55:08 +0800 +Subject: [PATCH] vdpa: support vdpa device migrate + +support vdpa device migrate + +Signed-off-by: jiangdongxu +Signed-off-by: AlexChen +--- + src/qemu/qemu_migration.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c +index c2a694eff1..04b9333fae 100644 +--- a/src/qemu/qemu_migration.c ++++ b/src/qemu/qemu_migration.c +@@ -1114,7 +1114,8 @@ qemuMigrationSrcIsAllowedHostdev(const virDomainDef *def) + case VIR_DOMAIN_HOSTDEV_MODE_SUBSYS: + switch ((virDomainHostdevSubsysType)hostdev->source.subsys.type) { + case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB: +- /* USB devices can be "migrated" */ ++ case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_VDPA: ++ /* USB and VDPA devices can be "migrated" */ + continue; + + case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI: +-- +2.27.0 + diff --git a/virrandom-Fix-printf-format-string-in-virRandomGener.patch b/virrandom-Fix-printf-format-string-in-virRandomGener.patch new file mode 100644 index 0000000000000000000000000000000000000000..2cb27816419dd58b1cba1588fb193a243381eb77 --- /dev/null +++ b/virrandom-Fix-printf-format-string-in-virRandomGener.patch @@ -0,0 +1,33 @@ +From 4fa96d435fb3a60b4757b41b1d9f273225c79158 Mon Sep 17 00:00:00 2001 +From: zhujun2 +Date: Mon, 31 Jul 2023 20:08:11 -0700 +Subject: [PATCH] virrandom: Fix printf format string in virRandomGenerateWWN() + +Firstly, drop needless concatenation of two static strings. +Secondly, use proper (portable) formatter for uint64_t so that +typecast to ULL can be dropped. + +Signed-off-by: Michal Privoznik +Reviewed-by: Peter Krempa +Signed-off-by: zhujun2 +(cherry-pick form b857ad0696ca5177eccf482f244665c246b3ace8) +--- + src/util/virrandom.c | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +diff --git a/src/util/virrandom.c b/src/util/virrandom.c +index 0487b4e70b..1b4102cf58 100644 +--- a/src/util/virrandom.c ++++ b/src/util/virrandom.c +@@ -158,7 +158,6 @@ virRandomGenerateWWN(char **wwn, + return -1; + } + +- *wwn = g_strdup_printf("5" "%s%09llx", oui, +- (unsigned long long)virRandomBits(36)); ++ *wwn = g_strdup_printf("5%s%09" PRIx64, oui, virRandomBits(36)); + return 0; + } +-- +2.27.0 +