Browse Source

Backport packages from upstream

main
Nicolas Massé 3 weeks ago
committed by github-actions[bot]
parent
commit
74cdb07a1d
  1. 134
      centos-10/SOURCES/libvirt-Add-guest-device-info-to-virDomainGetGuestInfo.patch
  2. 306
      centos-10/SOURCES/libvirt-Add-support-for-keeping-VM-running-when-panic-notifier-is-used.patch
  3. 33
      centos-10/SOURCES/libvirt-conf-Include-check-for-pci_bus-in-virDomainIOMMUDefEquals.patch
  4. 137
      centos-10/SOURCES/libvirt-conf-Use-proper-enum-types-for-onReboot-onPoweroff-onCrash-and-onLockFailure.patch
  5. 38
      centos-10/SOURCES/libvirt-conf-schemas-Allow-.-in-schema-for-CPU-flag-name.patch
  6. 69
      centos-10/SOURCES/libvirt-processGuestPanicEvent-Don-t-pass-panic-action-via-parameter.patch
  7. 371
      centos-10/SOURCES/libvirt-qemu-Add-support-for-HW-accelerated-nested-SMMUv3.patch
  8. 239
      centos-10/SOURCES/libvirt-qemu-Always-assume-support-for-QEMU_CAPS_SET_ACTION.patch
  9. 50
      centos-10/SOURCES/libvirt-qemu-Fix-proper-ordering-of-virtlockd-shutdown.patch
  10. 155
      centos-10/SOURCES/libvirt-qemu-Implement-device-info-for-virDomainGetGuestInfo-API.patch
  11. 313
      centos-10/SOURCES/libvirt-qemu-Remove-allowReboot-field.patch
  12. 63
      centos-10/SOURCES/libvirt-qemu-Remove-unused-qemuProcessRebootAllowed.patch
  13. 539
      centos-10/SOURCES/libvirt-qemu-capabilities-Retire-QEMU_CAPS_SET_ACTION.patch
  14. 81
      centos-10/SOURCES/libvirt-qemu-introduce-QEMU_CAPS_ARM_SMMUV3_ACCEL.patch
  15. 2225
      centos-10/SOURCES/libvirt-qemu-introduce-QEMU_CAPS_ARM_SMMUV3_SMMU_PER_BUS.patch
  16. 152
      centos-10/SOURCES/libvirt-qemu-introduce-QEMU_CAPS_DEVICE_ARM_SMMUV3.patch
  17. 112
      centos-10/SOURCES/libvirt-qemu-monitor-Remove-support-for-watchdog-set-action.patch
  18. 434
      centos-10/SOURCES/libvirt-qemu-move-qemuAgent-InfoFormatParams-to-hypervisor-qemu_agent.c.patch
  19. 127
      centos-10/SOURCES/libvirt-qemu-processGuestPanicEvent-Split-individual-steps-under-separate-conditions.patch
  20. 103
      centos-10/SOURCES/libvirt-qemuDomainModifyLifecycleActionLive-Prepare-to-handle-other-actions.patch
  21. 88
      centos-10/SOURCES/libvirt-qemuMonitorGuestPanicEventInfoFormatMsg-Directly-return-message.patch
  22. 62
      centos-10/SOURCES/libvirt-qemuProcessGuestPanicEventInfo-Fold-into-only-caller.patch
  23. 62
      centos-10/SOURCES/libvirt-qemuProcessSetupLifecycleActions-Prepare-to-handle-other-actions.patch
  24. 211
      centos-10/SOURCES/libvirt-qemu_agent-Introduce-guest-get-devices.patch
  25. 164
      centos-10/SOURCES/libvirt-qemuagenttest-Introduce-GetGuestDeviceInfo-test-case.patch
  26. 1063
      centos-10/SOURCES/libvirt-tests-capabilityschemadata-Add-a-real-test-example.patch
  27. 395
      centos-10/SOURCES/libvirt-tests-qemuxmlconfdata-provide-HW-accel-smmuv3-sample-XML-and-CLI-args.patch
  28. 50
      centos-10/SOURCES/libvirt-tools-virsh-fix-crash-on-error.patch
  29. 71
      centos-10/SOURCES/libvirt-util-virFileChownFiles-do-not-follow-symlinks.patch
  30. 88
      centos-10/SOURCES/libvirt-virsh-Add-support-for-VIR_DOMAIN_GUEST_INFO_DEVICES.patch
  31. 70
      centos-10/SPECS/libvirt.spec
  32. 134
      centos-9/SOURCES/libvirt-Add-guest-device-info-to-virDomainGetGuestInfo.patch
  33. 306
      centos-9/SOURCES/libvirt-Add-support-for-keeping-VM-running-when-panic-notifier-is-used.patch
  34. 137
      centos-9/SOURCES/libvirt-conf-Use-proper-enum-types-for-onReboot-onPoweroff-onCrash-and-onLockFailure.patch
  35. 38
      centos-9/SOURCES/libvirt-conf-schemas-Allow-.-in-schema-for-CPU-flag-name.patch
  36. 69
      centos-9/SOURCES/libvirt-processGuestPanicEvent-Don-t-pass-panic-action-via-parameter.patch
  37. 239
      centos-9/SOURCES/libvirt-qemu-Always-assume-support-for-QEMU_CAPS_SET_ACTION.patch
  38. 50
      centos-9/SOURCES/libvirt-qemu-Fix-proper-ordering-of-virtlockd-shutdown.patch
  39. 149
      centos-9/SOURCES/libvirt-qemu-Implement-device-info-for-virDomainGetGuestInfo-API.patch
  40. 313
      centos-9/SOURCES/libvirt-qemu-Remove-allowReboot-field.patch
  41. 63
      centos-9/SOURCES/libvirt-qemu-Remove-unused-qemuProcessRebootAllowed.patch
  42. 531
      centos-9/SOURCES/libvirt-qemu-capabilities-Retire-QEMU_CAPS_SET_ACTION.patch
  43. 112
      centos-9/SOURCES/libvirt-qemu-monitor-Remove-support-for-watchdog-set-action.patch
  44. 127
      centos-9/SOURCES/libvirt-qemu-processGuestPanicEvent-Split-individual-steps-under-separate-conditions.patch
  45. 103
      centos-9/SOURCES/libvirt-qemuDomainModifyLifecycleActionLive-Prepare-to-handle-other-actions.patch
  46. 88
      centos-9/SOURCES/libvirt-qemuMonitorGuestPanicEventInfoFormatMsg-Directly-return-message.patch
  47. 62
      centos-9/SOURCES/libvirt-qemuProcessGuestPanicEventInfo-Fold-into-only-caller.patch
  48. 62
      centos-9/SOURCES/libvirt-qemuProcessSetupLifecycleActions-Prepare-to-handle-other-actions.patch
  49. 198
      centos-9/SOURCES/libvirt-qemu_agent-Introduce-guest-get-devices.patch
  50. 164
      centos-9/SOURCES/libvirt-qemuagenttest-Introduce-GetGuestDeviceInfo-test-case.patch
  51. 1063
      centos-9/SOURCES/libvirt-tests-capabilityschemadata-Add-a-real-test-example.patch
  52. 71
      centos-9/SOURCES/libvirt-util-virFileChownFiles-do-not-follow-symlinks.patch
  53. 88
      centos-9/SOURCES/libvirt-virsh-Add-support-for-VIR_DOMAIN_GUEST_INFO_DEVICES.patch
  54. 50
      centos-9/SPECS/libvirt.spec

134
centos-10/SOURCES/libvirt-Add-guest-device-info-to-virDomainGetGuestInfo.patch

@ -0,0 +1,134 @@
From fa8e0a8220b8b29c97a77a9d564e68e6a2ddaee1 Mon Sep 17 00:00:00 2001
Message-ID: <fa8e0a8220b8b29c97a77a9d564e68e6a2ddaee1.1787144197.git.jdenemar@redhat.com>
From: Michal Privoznik <mprivozn@redhat.com>
Date: Wed, 12 Aug 2026 15:11:12 +0200
Subject: [PATCH] Add guest device info to virDomainGetGuestInfo
QEMU guest agent has 'guest-get-devices` command, which returns
information on guest devices (driver name, version, release date,
and so on). In this commit the public API part is introduced.
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
Reviewed-by: Peter Krempa <pkrempa@redhat.com>
(cherry picked from commit 3033dae6989083fde1d06427ee2840242cfd8dca)
Resolves: https://redhat.atlassian.net/browse/RHEL-235731
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
---
include/libvirt/libvirt-domain.h | 78 ++++++++++++++++++++++++++++++++
src/libvirt-domain.c | 5 ++
2 files changed, 83 insertions(+)
diff --git a/include/libvirt/libvirt-domain.h b/include/libvirt/libvirt-domain.h
index f4dfe9fb1a..f9cc06b6e9 100644
--- a/include/libvirt/libvirt-domain.h
+++ b/include/libvirt/libvirt-domain.h
@@ -8867,6 +8867,83 @@ int virDomainSetLaunchSecurityState(virDomainPtr domain,
*/
# define VIR_DOMAIN_GUEST_INFO_LOAD_15M "load.15m"
+/**
+ * VIR_DOMAIN_GUEST_INFO_DEVICE_COUNT:
+ *
+ * The number of guest devices that detailed information is fetched for as
+ * unsigned int.
+ *
+ * Since: 12.7.0
+ */
+# define VIR_DOMAIN_GUEST_INFO_DEVICE_COUNT "device.count"
+
+/**
+ * VIR_DOMAIN_GUEST_INFO_DEVICE_PREFIX:
+ *
+ * The parameter name prefix to access each device entry. Concatenate the
+ * prefix, the entry number formatted as an unsigned integer and one of the
+ * device suffix parameters to form a complete parameter name.
+ *
+ * Since: 12.7.0
+ */
+# define VIR_DOMAIN_GUEST_INFO_DEVICE_PREFIX "device."
+
+/**
+ * VIR_DOMAIN_GUEST_INFO_DEVICE_SUFFIX_DRIVER_NAME:
+ *
+ * Name of the device driver (e.g. ``VirtIO Balloon Driver``) as a string.
+ *
+ * Since: 12.7.0
+ */
+# define VIR_DOMAIN_GUEST_INFO_DEVICE_SUFFIX_DRIVER_NAME ".driverName"
+
+/**
+ * VIR_DOMAIN_GUEST_INFO_DEVICE_SUFFIX_DRIVER_DATE:
+ *
+ * Driver release date in seconds since the epoch (e.g. 1736726400) as long long.
+ *
+ * Since: 12.7.0
+ */
+# define VIR_DOMAIN_GUEST_INFO_DEVICE_SUFFIX_DRIVER_DATE ".driverDate"
+
+/**
+ * VIR_DOMAIN_GUEST_INFO_DEVICE_SUFFIX_DRIVER_VERSION:
+ *
+ * Driver version (e.g. ``100.100.104.27100``) as a string.
+ *
+ * Since: 12.7.0
+ */
+# define VIR_DOMAIN_GUEST_INFO_DEVICE_SUFFIX_DRIVER_VERSION ".driverVersion"
+
+/**
+ * VIR_DOMAIN_GUEST_INFO_DEVICE_SUFFIX_ID_TYPE:
+ *
+ * Device identification (e.g. ``pci``) as a string.
+ *
+ * Since: 12.7.0
+ */
+# define VIR_DOMAIN_GUEST_INFO_DEVICE_SUFFIX_ID_TYPE ".idType"
+
+/**
+ * VIR_DOMAIN_GUEST_INFO_DEVICE_SUFFIX_PCI_VENDOR:
+ *
+ * PCI device (a device with VIR_DOMAIN_GUEST_INFO_DEVICE_SUFFIX_ID_TYPE equal
+ * to ``pci``) vendor id (e.g. 6900) as a unsigned int.
+ *
+ * Since: 12.7.0
+ */
+# define VIR_DOMAIN_GUEST_INFO_DEVICE_SUFFIX_PCI_VENDOR ".pciVendor"
+
+/**
+ * VIR_DOMAIN_GUEST_INFO_DEVICE_SUFFIX_PCI_DEVICE:
+ *
+ * PCI device (a device with VIR_DOMAIN_GUEST_INFO_DEVICE_SUFFIX_ID_TYPE equal
+ * to ``pci``) device id (e.g. 4165) as a unsigned int.
+ *
+ * Since: 12.7.0
+ */
+# define VIR_DOMAIN_GUEST_INFO_DEVICE_SUFFIX_PCI_DEVICE ".pciDevice"
+
/**
* virDomainGuestInfoTypes:
*
@@ -8881,6 +8958,7 @@ typedef enum {
VIR_DOMAIN_GUEST_INFO_DISKS = (1 << 5), /* return disks information (Since: 7.0.0) */
VIR_DOMAIN_GUEST_INFO_INTERFACES = (1 << 6), /* return interfaces information (Since: 7.10.0) */
VIR_DOMAIN_GUEST_INFO_LOAD = (1 << 7), /* return load averages (Since: 11.2.0) */
+ VIR_DOMAIN_GUEST_INFO_DEVICES = (1 << 8), /* return devices information (Since: 12.7.0) */
} virDomainGuestInfoTypes;
int virDomainGetGuestInfo(virDomainPtr domain,
diff --git a/src/libvirt-domain.c b/src/libvirt-domain.c
index 4cf1d996b8..396d3727bd 100644
--- a/src/libvirt-domain.c
+++ b/src/libvirt-domain.c
@@ -13260,6 +13260,11 @@ virDomainSetVcpu(virDomainPtr domain,
* The VIR_DOMAIN_GUEST_INFO_LOAD_* constants define the known typed parameter
* keys.
*
+ * VIR_DOMAIN_GUEST_INFO_DEVICES:
+ * Returns information on guest devices.
+ * The VIR_DOMAIN_GUEST_INFO_DEVICE_* constants define the known typed
+ * parameter keys.
+ *
* Using 0 for @types returns all information groups supported by the given
* hypervisor.
*
--
2.55.0

306
centos-10/SOURCES/libvirt-Add-support-for-keeping-VM-running-when-panic-notifier-is-used.patch

@ -0,0 +1,306 @@
From f43463c7010e0b92c48d510be217abf191655754 Mon Sep 17 00:00:00 2001
Message-ID: <f43463c7010e0b92c48d510be217abf191655754.1787144197.git.jdenemar@redhat.com>
From: Peter Krempa <pkrempa@redhat.com>
Date: Wed, 22 Jul 2026 17:13:15 +0200
Subject: [PATCH] Add support for keeping VM running when panic notifier is
used
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Some guest OSes (e.g. windows) can do an internal crash dump and reboot
after a crash. They unfortunately notify the OS before doing the crash
dump though so we need a new possibility for the <on_crash> action to
keep the VM as is.
This patch introduces 'preserve-running' mode for on_crash and wires it
up into the qemu driver.
Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
(cherry picked from commit cdea89dd87a10cd94deb3b067bae483d98c558ed)
https://redhat.atlassian.net/browse/RHEL-242545
---
docs/formatdomain.rst | 3 ++
include/libvirt/libvirt-domain.h | 1 +
src/conf/domain_conf.c | 2 ++
src/conf/schemas/domaincommon.rng | 2 ++
src/libxl/libxl_conf.c | 1 +
src/libxl/libxl_domain.c | 3 ++
src/qemu/qemu_driver.c | 34 ++++++++++++++++++-
src/qemu/qemu_process.c | 18 ++++++++++
.../async-teardown.x86_64-latest.xml | 2 +-
tests/qemuxmlconfdata/async-teardown.xml | 2 +-
tests/qemuxmlconftest.c | 1 +
tools/virsh-domain.c | 3 +-
12 files changed, 68 insertions(+), 4 deletions(-)
diff --git a/docs/formatdomain.rst b/docs/formatdomain.rst
index 1e8c81c3a5..89665f8ab8 100644
--- a/docs/formatdomain.rst
+++ b/docs/formatdomain.rst
@@ -2044,6 +2044,9 @@ The ``on_crash`` event supports these additional actions :since:`since 0.8.4`.
``coredump-restart``
The crashed domain's core will be dumped, and then the domain will be
restarted with the same configuration
+``preserve-running``
+ The crashed domain will continue to run. This is useful if the guest OS can
+ do an internal crash dump and reboot itself. :since:`Since 12.6.0`
:since:`Since 3.9.0`, the lifecycle events can be configured via the
`virDomainSetLifecycleAction <html/libvirt-libvirt-domain.html#virDomainSetLifecycleAction>`__
diff --git a/include/libvirt/libvirt-domain.h b/include/libvirt/libvirt-domain.h
index 5b67f8f897..f4dfe9fb1a 100644
--- a/include/libvirt/libvirt-domain.h
+++ b/include/libvirt/libvirt-domain.h
@@ -8228,6 +8228,7 @@ typedef enum {
VIR_DOMAIN_LIFECYCLE_ACTION_PRESERVE = 3, /* (Since: 3.9.0) */
VIR_DOMAIN_LIFECYCLE_ACTION_COREDUMP_DESTROY = 4, /* (Since: 3.9.0) */
VIR_DOMAIN_LIFECYCLE_ACTION_COREDUMP_RESTART = 5, /* (Since: 3.9.0) */
+ VIR_DOMAIN_LIFECYCLE_ACTION_PRESERVE_RUNNING = 6, /* (Since: 12.6.0) */
# ifdef VIR_ENUM_SENTINELS
VIR_DOMAIN_LIFECYCLE_ACTION_LAST /* (Since: 3.9.0) */
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index d43b8bdd5b..9880339e42 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -303,6 +303,7 @@ VIR_ENUM_IMPL(virDomainLifecycleAction,
"preserve",
"coredump-destroy",
"coredump-restart",
+ "preserve-running",
);
VIR_ENUM_IMPL(virDomainLockFailure,
@@ -5538,6 +5539,7 @@ virDomainDefLifecycleActionAllowed(virDomainLifecycle type,
return true;
case VIR_DOMAIN_LIFECYCLE_ACTION_COREDUMP_DESTROY:
case VIR_DOMAIN_LIFECYCLE_ACTION_COREDUMP_RESTART:
+ case VIR_DOMAIN_LIFECYCLE_ACTION_PRESERVE_RUNNING:
break;
}
break;
diff --git a/src/conf/schemas/domaincommon.rng b/src/conf/schemas/domaincommon.rng
index c7d7ebc876..c8f1fe5547 100644
--- a/src/conf/schemas/domaincommon.rng
+++ b/src/conf/schemas/domaincommon.rng
@@ -5035,6 +5035,7 @@
destroy: The domain is cleaned up
restart: A new domain is started in place of the old one
preserve: The domain will remain in memory until it is destroyed manually
+ preserve-running: Keep the domain as is, let the guest handle the crash.
rename-restart: a variant of the previous one but where the old domain is
renamed before being saved to allow a restart
coredump-destroy: The crashed domain's core will be dumped, and then the
@@ -5051,6 +5052,7 @@
<value>rename-restart</value>
<value>coredump-destroy</value>
<value>coredump-restart</value>
+ <value>preserve-running</value>
</choice>
</define>
<!--
diff --git a/src/libxl/libxl_conf.c b/src/libxl/libxl_conf.c
index d25b92b4de..3bb5c1e591 100644
--- a/src/libxl/libxl_conf.c
+++ b/src/libxl/libxl_conf.c
@@ -111,6 +111,7 @@ libxlActionFromVirLifecycle(virDomainLifecycleAction action)
case VIR_DOMAIN_LIFECYCLE_ACTION_COREDUMP_RESTART:
return LIBXL_ACTION_ON_SHUTDOWN_COREDUMP_RESTART;
+ case VIR_DOMAIN_LIFECYCLE_ACTION_PRESERVE_RUNNING:
case VIR_DOMAIN_LIFECYCLE_ACTION_LAST:
break;
}
diff --git a/src/libxl/libxl_domain.c b/src/libxl/libxl_domain.c
index c6717e31cf..51dc3edcc2 100644
--- a/src/libxl/libxl_domain.c
+++ b/src/libxl/libxl_domain.c
@@ -509,6 +509,7 @@ libxlDomainShutdownThread(void *opaque)
case VIR_DOMAIN_LIFECYCLE_ACTION_PRESERVE:
case VIR_DOMAIN_LIFECYCLE_ACTION_COREDUMP_DESTROY:
case VIR_DOMAIN_LIFECYCLE_ACTION_COREDUMP_RESTART:
+ case VIR_DOMAIN_LIFECYCLE_ACTION_PRESERVE_RUNNING:
case VIR_DOMAIN_LIFECYCLE_ACTION_LAST:
goto endjob;
}
@@ -529,6 +530,7 @@ libxlDomainShutdownThread(void *opaque)
goto endjob;
case VIR_DOMAIN_LIFECYCLE_ACTION_PRESERVE:
case VIR_DOMAIN_LIFECYCLE_ACTION_LAST:
+ case VIR_DOMAIN_LIFECYCLE_ACTION_PRESERVE_RUNNING:
goto endjob;
case VIR_DOMAIN_LIFECYCLE_ACTION_COREDUMP_DESTROY:
libxlDomainAutoCoreDump(driver, vm);
@@ -557,6 +559,7 @@ libxlDomainShutdownThread(void *opaque)
case VIR_DOMAIN_LIFECYCLE_ACTION_PRESERVE:
case VIR_DOMAIN_LIFECYCLE_ACTION_COREDUMP_DESTROY:
case VIR_DOMAIN_LIFECYCLE_ACTION_COREDUMP_RESTART:
+ case VIR_DOMAIN_LIFECYCLE_ACTION_PRESERVE_RUNNING:
case VIR_DOMAIN_LIFECYCLE_ACTION_LAST:
goto endjob;
}
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index c6ef5684b5..b90a7b07d4 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -3644,6 +3644,11 @@ processGuestPanicEvent(virQEMUDriver *driver,
qemuDomainSaveStatus(vm);
break;
+ case VIR_DOMAIN_LIFECYCLE_ACTION_PRESERVE_RUNNING:
+ virDomainObjSetState(vm, VIR_DOMAIN_RUNNING, VIR_DOMAIN_RUNNING_CRASHED);
+ qemuDomainSaveStatus(vm);
+ break;
+
case VIR_DOMAIN_LIFECYCLE_ACTION_LAST:
break;
}
@@ -3661,6 +3666,8 @@ processGuestPanicEvent(virQEMUDriver *driver,
VIR_DEBUG("Preserving lock state '%s'", NULLSTR(priv->lockState));
break;
+ case VIR_DOMAIN_LIFECYCLE_ACTION_PRESERVE_RUNNING:
+ /* we need to keep resources locked */
case VIR_DOMAIN_LIFECYCLE_ACTION_LAST:
break;
}
@@ -3678,6 +3685,7 @@ processGuestPanicEvent(virQEMUDriver *driver,
case VIR_DOMAIN_LIFECYCLE_ACTION_RESTART:
case VIR_DOMAIN_LIFECYCLE_ACTION_PRESERVE:
case VIR_DOMAIN_LIFECYCLE_ACTION_RESTART_RENAME:
+ case VIR_DOMAIN_LIFECYCLE_ACTION_PRESERVE_RUNNING:
case VIR_DOMAIN_LIFECYCLE_ACTION_LAST:
break;
}
@@ -3704,6 +3712,7 @@ processGuestPanicEvent(virQEMUDriver *driver,
case VIR_DOMAIN_LIFECYCLE_ACTION_PRESERVE:
case VIR_DOMAIN_LIFECYCLE_ACTION_RESTART_RENAME:
+ case VIR_DOMAIN_LIFECYCLE_ACTION_PRESERVE_RUNNING:
case VIR_DOMAIN_LIFECYCLE_ACTION_LAST:
break;
}
@@ -19594,13 +19603,36 @@ qemuDomainModifyLifecycleActionLive(virDomainObj *vm,
case VIR_DOMAIN_LIFECYCLE_ACTION_RESTART_RENAME:
case VIR_DOMAIN_LIFECYCLE_ACTION_COREDUMP_DESTROY:
case VIR_DOMAIN_LIFECYCLE_ACTION_COREDUMP_RESTART:
+ case VIR_DOMAIN_LIFECYCLE_ACTION_PRESERVE_RUNNING:
+ case VIR_DOMAIN_LIFECYCLE_ACTION_LAST:
+ break;
+ }
+ break;
+
+ case VIR_DOMAIN_LIFECYCLE_CRASH:
+ if (vm->def->onCrash == action)
+ break;
+
+ switch (vm->def->onCrash) {
+ case VIR_DOMAIN_LIFECYCLE_ACTION_PRESERVE_RUNNING:
+ panic = QEMU_MONITOR_ACTION_PANIC_NONE;
+ break;
+
+ case VIR_DOMAIN_LIFECYCLE_ACTION_DESTROY:
+ case VIR_DOMAIN_LIFECYCLE_ACTION_RESTART:
+ case VIR_DOMAIN_LIFECYCLE_ACTION_PRESERVE:
+ case VIR_DOMAIN_LIFECYCLE_ACTION_RESTART_RENAME:
+ case VIR_DOMAIN_LIFECYCLE_ACTION_COREDUMP_DESTROY:
+ case VIR_DOMAIN_LIFECYCLE_ACTION_COREDUMP_RESTART:
+ panic = QEMU_MONITOR_ACTION_PANIC_PAUSE;
+ break;
+
case VIR_DOMAIN_LIFECYCLE_ACTION_LAST:
break;
}
break;
case VIR_DOMAIN_LIFECYCLE_POWEROFF:
- case VIR_DOMAIN_LIFECYCLE_CRASH:
case VIR_DOMAIN_LIFECYCLE_LAST:
break;
}
diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
index 8389819ee4..b2506edce0 100644
--- a/src/qemu/qemu_process.c
+++ b/src/qemu/qemu_process.c
@@ -8186,6 +8186,24 @@ qemuProcessSetupLifecycleActions(virDomainObj *vm,
if (vm->def->onReboot == VIR_DOMAIN_LIFECYCLE_ACTION_DESTROY)
reboot = QEMU_MONITOR_ACTION_REBOOT_SHUTDOWN;
+ switch (vm->def->onCrash) {
+ case VIR_DOMAIN_LIFECYCLE_ACTION_PRESERVE_RUNNING:
+ panic = QEMU_MONITOR_ACTION_PANIC_NONE;
+ break;
+
+ case VIR_DOMAIN_LIFECYCLE_ACTION_DESTROY:
+ case VIR_DOMAIN_LIFECYCLE_ACTION_RESTART:
+ case VIR_DOMAIN_LIFECYCLE_ACTION_PRESERVE:
+ case VIR_DOMAIN_LIFECYCLE_ACTION_RESTART_RENAME:
+ case VIR_DOMAIN_LIFECYCLE_ACTION_COREDUMP_DESTROY:
+ case VIR_DOMAIN_LIFECYCLE_ACTION_COREDUMP_RESTART:
+ panic = QEMU_MONITOR_ACTION_PANIC_PAUSE;
+ break;
+
+ case VIR_DOMAIN_LIFECYCLE_ACTION_LAST:
+ break;
+ }
+
if (shutdown == QEMU_MONITOR_ACTION_SHUTDOWN_KEEP &&
reboot == QEMU_MONITOR_ACTION_REBOOT_KEEP &&
watchdog == QEMU_MONITOR_ACTION_WATCHDOG_KEEP &&
diff --git a/tests/qemuxmlconfdata/async-teardown.x86_64-latest.xml b/tests/qemuxmlconfdata/async-teardown.x86_64-latest.xml
index e98308a9b1..1c7c80ae8a 100644
--- a/tests/qemuxmlconfdata/async-teardown.x86_64-latest.xml
+++ b/tests/qemuxmlconfdata/async-teardown.x86_64-latest.xml
@@ -17,7 +17,7 @@
<clock offset='utc'/>
<on_poweroff>destroy</on_poweroff>
<on_reboot>restart</on_reboot>
- <on_crash>destroy</on_crash>
+ <on_crash>preserve-running</on_crash>
<devices>
<emulator>/usr/bin/qemu-system-x86_64</emulator>
<disk type='block' device='disk'>
diff --git a/tests/qemuxmlconfdata/async-teardown.xml b/tests/qemuxmlconfdata/async-teardown.xml
index 70c1eccc55..149b9ed16d 100644
--- a/tests/qemuxmlconfdata/async-teardown.xml
+++ b/tests/qemuxmlconfdata/async-teardown.xml
@@ -11,7 +11,7 @@
<clock offset='utc'/>
<on_poweroff>destroy</on_poweroff>
<on_reboot>restart</on_reboot>
- <on_crash>destroy</on_crash>
+ <on_crash>preserve-running</on_crash>
<features>
<async-teardown enabled='yes'/>
</features>
diff --git a/tests/qemuxmlconftest.c b/tests/qemuxmlconftest.c
index 99925e6241..7ab25f4cf7 100644
--- a/tests/qemuxmlconftest.c
+++ b/tests/qemuxmlconftest.c
@@ -3191,6 +3191,7 @@ mymain(void)
DO_TEST_CAPS_LATEST("crypto-builtin");
+ /* this test case also tests 'preserve-running' onCrash action */
DO_TEST_CAPS_LATEST("async-teardown");
DO_TEST_CAPS_ARCH_LATEST("s390-async-teardown", "s390x");
DO_TEST_CAPS_ARCH_LATEST("s390-async-teardown-no-attrib", "s390x");
diff --git a/tools/virsh-domain.c b/tools/virsh-domain.c
index aa4f2a7a48..0f177fb69a 100644
--- a/tools/virsh-domain.c
+++ b/tools/virsh-domain.c
@@ -6242,7 +6242,8 @@ VIR_ENUM_IMPL(virshDomainLifecycleAction,
"rename-restart",
"preserve",
"coredump-destroy",
- "coredump-restart");
+ "coredump-restart",
+ "none");
static bool
cmdSetLifecycleAction(vshControl *ctl, const vshCmd *cmd)
--
2.55.0

33
centos-10/SOURCES/libvirt-conf-Include-check-for-pci_bus-in-virDomainIOMMUDefEquals.patch

@ -0,0 +1,33 @@
From 1191669a769e280a77107804c6cdbab08e972a1e Mon Sep 17 00:00:00 2001
Message-ID: <1191669a769e280a77107804c6cdbab08e972a1e.1786713643.git.jdenemar@redhat.com>
From: Nathan Chen <nathanc@nvidia.com>
Date: Wed, 5 Aug 2026 15:12:55 -0700
Subject: [PATCH] conf: Include check for pci_bus in virDomainIOMMUDefEquals()
virDomainIOMMUDefEquals() should check for pci_bus being equal
across two virDomainIOMMUDef being compared.
Fixes: 4d6419b286af ("qemu: Implement pluggable-device smmuv3")
Reviewed-by: Pavel Hrdina <phrdina@redhat.com>
Signed-off-by: Nathan Chen <nathanc@nvidia.com>
(cherry picked from commit b2bfc6b4c8b7243840750e1e95514a8646482cd4)
Resolves: https://redhat.atlassian.net/browse/RHEL-138901
---
src/conf/domain_conf.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 17c4a57cd8..94cfb27c1d 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -16849,6 +16849,7 @@ virDomainIOMMUDefEquals(const virDomainIOMMUDef *a,
a->iotlb != b->iotlb ||
a->aw_bits != b->aw_bits ||
a->dma_translation != b->dma_translation ||
+ a->pci_bus != b->pci_bus ||
a->xtsup != b->xtsup ||
a->pt != b->pt ||
a->granule != b->granule)
--
2.55.0

137
centos-10/SOURCES/libvirt-conf-Use-proper-enum-types-for-onReboot-onPoweroff-onCrash-and-onLockFailure.patch

@ -0,0 +1,137 @@
From c85c8ecd53bf4d67b14d7f022813ec7b2801181c Mon Sep 17 00:00:00 2001
Message-ID: <c85c8ecd53bf4d67b14d7f022813ec7b2801181c.1787144197.git.jdenemar@redhat.com>
From: Peter Krempa <pkrempa@redhat.com>
Date: Tue, 21 Jul 2026 10:21:50 +0200
Subject: [PATCH] conf: Use proper enum types for 'onReboot', 'onPoweroff',
'onCrash', and 'onLockFailure'
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
This ensures that 'switch' statements work correctly.
Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
(cherry picked from commit 997b9816dcaef7ed0d7fdbfe4f1b2354b1b82c58)
https://redhat.atlassian.net/browse/RHEL-242545
---
src/conf/domain_conf.c | 10 ++++++----
src/conf/domain_conf.h | 9 ++++-----
src/libxl/xen_common.c | 10 +++++++---
src/qemu/qemu_driver.c | 2 ++
4 files changed, 19 insertions(+), 12 deletions(-)
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index db44ba9a72..d43b8bdd5b 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -14172,21 +14172,23 @@ static int
virDomainEventActionParseXML(xmlXPathContextPtr ctxt,
const char *name,
const char *xpath,
- int *val,
- int defaultVal,
+ unsigned int *val,
+ unsigned int defaultVal,
virEventActionFromStringFunc convFunc)
{
g_autofree char *tmp = virXPathString(xpath, ctxt);
+ int tmpval;
if (tmp == NULL) {
*val = defaultVal;
} else {
- *val = convFunc(tmp);
- if (*val < 0) {
+ tmpval = convFunc(tmp);
+ if (tmpval < 0) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
_("unknown %1$s action: %2$s"), name, tmp);
return -1;
}
+ *val = tmpval;
}
return 0;
}
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index 40ea6090f8..2c017738e3 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -3255,12 +3255,11 @@ struct _virDomainDef {
virDomainResourceDef *resource;
virDomainIdMapDef idmap;
- /* These 3 are based on virDomainLifecycleAction enum flags */
- int onReboot;
- int onPoweroff;
- int onCrash;
+ virDomainLifecycleAction onReboot;
+ virDomainLifecycleAction onPoweroff;
+ virDomainLifecycleAction onCrash;
- int onLockFailure; /* enum virDomainLockFailureAction */
+ virDomainLockFailureAction onLockFailure;
virDomainPowerManagement pm;
diff --git a/src/libxl/xen_common.c b/src/libxl/xen_common.c
index e6a372e078..4b2e47006a 100644
--- a/src/libxl/xen_common.c
+++ b/src/libxl/xen_common.c
@@ -336,33 +336,37 @@ xenParseEventsActions(virConf *conf, virDomainDef *def)
g_autofree char *on_poweroff = NULL;
g_autofree char *on_reboot = NULL;
g_autofree char *on_crash = NULL;
+ int tmp;
if (xenConfigGetString(conf, "on_poweroff", &on_poweroff, "destroy") < 0)
return -1;
- if ((def->onPoweroff = virDomainLifecycleActionTypeFromString(on_poweroff)) < 0) {
+ if ((tmp = virDomainLifecycleActionTypeFromString(on_poweroff)) < 0) {
virReportError(VIR_ERR_INTERNAL_ERROR,
_("unexpected value %1$s for on_poweroff"), on_poweroff);
return -1;
}
+ def->onPoweroff = tmp;
if (xenConfigGetString(conf, "on_reboot", &on_reboot, "restart") < 0)
return -1;
- if ((def->onReboot = virDomainLifecycleActionTypeFromString(on_reboot)) < 0) {
+ if ((tmp = virDomainLifecycleActionTypeFromString(on_reboot)) < 0) {
virReportError(VIR_ERR_INTERNAL_ERROR,
_("unexpected value %1$s for on_reboot"), on_reboot);
return -1;
}
+ def->onReboot = tmp;
if (xenConfigGetString(conf, "on_crash", &on_crash, "restart") < 0)
return -1;
- if ((def->onCrash = virDomainLifecycleActionTypeFromString(on_crash)) < 0) {
+ if ((tmp = virDomainLifecycleActionTypeFromString(on_crash)) < 0) {
virReportError(VIR_ERR_INTERNAL_ERROR,
_("unexpected value %1$s for on_crash"), on_crash);
return -1;
}
+ def->onCrash = tmp;
return 0;
}
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index b7c1a28d5f..cb9f6fb7bf 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -3680,6 +3680,8 @@ processGuestPanicEvent(virQEMUDriver *driver,
/* the VM is kept around for debugging */
break;
+ case VIR_DOMAIN_LIFECYCLE_ACTION_RESTART_RENAME:
+ case VIR_DOMAIN_LIFECYCLE_ACTION_LAST:
default:
break;
}
--
2.55.0

38
centos-10/SOURCES/libvirt-conf-schemas-Allow-.-in-schema-for-CPU-flag-name.patch

@ -0,0 +1,38 @@
From 9cf23fdd0cf7d5b39a1f51cfc61826b4da431db2 Mon Sep 17 00:00:00 2001
Message-ID: <9cf23fdd0cf7d5b39a1f51cfc61826b4da431db2.1786713644.git.jdenemar@redhat.com>
From: Peter Krempa <pkrempa@redhat.com>
Date: Mon, 3 Aug 2026 14:53:25 +0200
Subject: [PATCH] conf: schemas: Allow '.' in schema for CPU flag name
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Allow '.' so that CPU features such as:
<feature name='sse4.1'/>
pass schema validation.
Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
(cherry picked from commit 5225c1cb688170bb2748f2f23455da4a7cb8a1bf)
https://redhat.atlassian.net/browse/RHEL-222549
---
src/conf/schemas/cputypes.rng | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/conf/schemas/cputypes.rng b/src/conf/schemas/cputypes.rng
index 8edf1d14e3..eef3807f1a 100644
--- a/src/conf/schemas/cputypes.rng
+++ b/src/conf/schemas/cputypes.rng
@@ -406,7 +406,7 @@
<element name="feature">
<attribute name="name">
<data type="string">
- <param name="pattern">[a-zA-Z0-9\-_]+</param>
+ <param name="pattern">[a-zA-Z0-9\-_.]+</param>
</data>
</attribute>
<empty/>
--
2.55.0

69
centos-10/SOURCES/libvirt-processGuestPanicEvent-Don-t-pass-panic-action-via-parameter.patch

@ -0,0 +1,69 @@
From 59314b58539370ba53ed27d2efb1d62a78c56fee Mon Sep 17 00:00:00 2001
Message-ID: <59314b58539370ba53ed27d2efb1d62a78c56fee.1787144197.git.jdenemar@redhat.com>
From: Peter Krempa <pkrempa@redhat.com>
Date: Mon, 20 Jul 2026 13:58:55 +0200
Subject: [PATCH] processGuestPanicEvent: Don't pass panic action via parameter
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
'processGuestPanicEvent' gets the full domain object; there's no point
passing it via 'struct qemuProcessEvent'.
Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
(cherry picked from commit 0f18f6813cbd53cab8ccdb00fab098b66b90c0fb)
https://redhat.atlassian.net/browse/RHEL-242545
---
src/qemu/qemu_driver.c | 6 ++----
src/qemu/qemu_process.c | 3 +--
2 files changed, 3 insertions(+), 6 deletions(-)
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 269694fac5..b7c1a28d5f 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -3615,7 +3615,6 @@ qemuProcessGuestPanicEventInfo(virQEMUDriver *driver,
static void
processGuestPanicEvent(virQEMUDriver *driver,
virDomainObj *vm,
- int action,
qemuMonitorEventPanicInfo *info)
{
qemuDomainObjPrivate *priv = vm->privateData;
@@ -3650,7 +3649,7 @@ processGuestPanicEvent(virQEMUDriver *driver,
VIR_WARN("Unable to release lease on %s", vm->def->name);
VIR_DEBUG("Preserving lock state '%s'", NULLSTR(priv->lockState));
- switch (action) {
+ switch (vm->def->onCrash) {
case VIR_DOMAIN_LIFECYCLE_ACTION_COREDUMP_DESTROY:
if (doCoreDumpToAutoDumpPath(driver, vm, flags) < 0)
goto endjob;
@@ -4208,8 +4207,7 @@ qemuProcessEventHandler(void *data,
processWatchdogEvent(driver, vm, processEvent->action);
break;
case QEMU_PROCESS_EVENT_GUESTPANIC:
- processGuestPanicEvent(driver, vm, processEvent->action,
- processEvent->data);
+ processGuestPanicEvent(driver, vm, processEvent->data);
break;
case QEMU_PROCESS_EVENT_DEVICE_DELETED:
processDeviceDeletedEvent(driver, vm, processEvent->data);
diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
index 397082ef04..8389819ee4 100644
--- a/src/qemu/qemu_process.c
+++ b/src/qemu/qemu_process.c
@@ -1359,8 +1359,7 @@ qemuProcessHandleGuestPanic(qemuMonitor *mon G_GNUC_UNUSED,
{
virObjectLock(vm);
- qemuProcessEventSubmit(vm, QEMU_PROCESS_EVENT_GUESTPANIC,
- vm->def->onCrash, 0, info);
+ qemuProcessEventSubmit(vm, QEMU_PROCESS_EVENT_GUESTPANIC, 0, 0, info);
virObjectUnlock(vm);
}
--
2.55.0

371
centos-10/SOURCES/libvirt-qemu-Add-support-for-HW-accelerated-nested-SMMUv3.patch

@ -0,0 +1,371 @@
From 311945c34f1188283be6c71b5c2ddd9e967977ff Mon Sep 17 00:00:00 2001
Message-ID: <311945c34f1188283be6c71b5c2ddd9e967977ff.1786713644.git.jdenemar@redhat.com>
From: Nathan Chen <nathanc@nvidia.com>
Date: Wed, 5 Aug 2026 15:13:00 -0700
Subject: [PATCH] qemu: Add support for HW-accelerated nested SMMUv3
Add support for enabling HW-accelerated nested SMMUv3 via <accel>
attribute and its additional attributes for ATS, SSID, RIL, and OAS
configuration.
Validate the domain iommu accel attribute in qemu_validate.c when
QEMU lacks this capability. Checking accel is sufficient because ats,
ril, ssidsize, and oas were introduced in the same QEMU release, and
it only makes sense to backport accel, ats, ril, ssidsize, and oas
all together.
Reviewed-by: Pavel Hrdina <phrdina@redhat.com>
Signed-off-by: Nathan Chen <nathanc@nvidia.com>
(cherry picked from commit d4605d8279d73bf8d2b8031d49f453529738ef34)
Resolves: https://redhat.atlassian.net/browse/RHEL-138901
---
docs/formatdomain.rst | 38 +++++++++++++++
src/conf/domain_conf.c | 79 +++++++++++++++++++++++++++++++
src/conf/domain_conf.h | 5 ++
src/conf/domain_validate.c | 27 ++++++++++-
src/conf/schemas/domaincommon.rng | 25 ++++++++++
src/qemu/qemu_command.c | 15 ++++++
src/qemu/qemu_validate.c | 12 +++++
7 files changed, 200 insertions(+), 1 deletion(-)
diff --git a/docs/formatdomain.rst b/docs/formatdomain.rst
index a861f9f177..1e8c81c3a5 100644
--- a/docs/formatdomain.rst
+++ b/docs/formatdomain.rst
@@ -9426,6 +9426,44 @@ Examples:
The ``pciBus`` attribute notes the index of the controller that an
IOMMU device is attached to. (QEMU/KVM and ``smmuv3`` model only)
+ ``accel``
+ The ``accel`` attribute with possible values ``on`` and ``off`` can
+ be used to enable hardware acceleration support for smmuv3 IOMMU
+ devices.
+ :since:`Since 12.7.0` (QEMU/KVM and ``smmuv3`` model only)
+
+ ``ats``
+ The ``ats`` attribute with possible values ``on`` and ``off`` can be
+ used to enable reporting Address Translation Services capability to
+ the guest for smmuv3 IOMMU devices with ``accel`` set to ``on``, if
+ the host SMMUv3 supports ATS and the associated passthrough device
+ supports ATS. If ``accel`` is enabled and ``ats`` is not configured,
+ the hypervisor default value is used.
+ :since:`Since 12.7.0` (QEMU/KVM and ``smmuv3`` model only)
+
+ ``ril``
+ The ``ril`` attribute with possible values ``on`` and ``off`` can be
+ used to report whether Range Invalidation for IOMMU devices with
+ ``accel`` set to ``on`` is compatible with host SMMUv3 support. If
+ ``accel`` is enabled and ``ril`` is not configured, the hypervisor
+ default value is used.
+ :since:`Since 12.7.0` (QEMU/KVM and ``smmuv3`` model only)
+
+ ``ssidsize``
+ The ``ssidsize`` attribute sets the number of bits used to
+ represent SubstreamIDs. A value of N allows SSIDs in the range
+ [0 .. 2^N - 1]. The valid range is 0-20, and a value greater than 0
+ is required for enabling PASID support, as doing so advertises PASID
+ capability to the vIOMMU. If ``accel`` is enabled and ``ssidsize`` is
+ not configured, the hypervisor default value is used.
+ :since:`Since 12.7.0` (QEMU/KVM and ``smmuv3`` model only)
+
+ ``oas``
+ The ``oas`` attribute sets the output address size in units of bits.
+ If ``accel`` is enabled and ``oas`` is not configured, the hypervisor
+ default value is used.
+ :since:`Since 12.7.0` (QEMU/KVM and ``smmuv3`` model only)
+
In case of ``virtio`` IOMMU device, the ``driver`` element can optionally
contain ``granule`` subelement that allows to choose which granule will be
used by default. It is useful when running guests with different page size
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 94cfb27c1d..db44ba9a72 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -2863,6 +2863,10 @@ virDomainIOMMUDefNew(void)
iommu->pci_bus = -1;
+ iommu->ssid_size = -1;
+
+ iommu->oas = -1;
+
return g_steal_pointer(&iommu);
}
@@ -14746,6 +14750,26 @@ virDomainIOMMUDefParseXML(virDomainXMLOption *xmlopt,
&iommu->pci_bus, -1) < 0)
return NULL;
+ if (virXMLPropTristateSwitch(driver, "accel", VIR_XML_PROP_NONE,
+ &iommu->accel) < 0)
+ return NULL;
+
+ if (virXMLPropTristateSwitch(driver, "ats", VIR_XML_PROP_NONE,
+ &iommu->ats) < 0)
+ return NULL;
+
+ if (virXMLPropTristateSwitch(driver, "ril", VIR_XML_PROP_NONE,
+ &iommu->ril) < 0)
+ return NULL;
+
+ if (virXMLPropInt(driver, "ssidsize", 10, VIR_XML_PROP_NONE,
+ &iommu->ssid_size, -1) < 0)
+ return NULL;
+
+ if (virXMLPropInt(driver, "oas", 10, VIR_XML_PROP_NONE,
+ &iommu->oas, -1) < 0)
+ return NULL;
+
if ((granule = virXPathNode("./driver/granule", ctxt))) {
g_autofree char *mode = virXMLPropString(granule, "mode");
unsigned long long size;
@@ -16850,6 +16874,11 @@ virDomainIOMMUDefEquals(const virDomainIOMMUDef *a,
a->aw_bits != b->aw_bits ||
a->dma_translation != b->dma_translation ||
a->pci_bus != b->pci_bus ||
+ a->accel != b->accel ||
+ a->ats != b->ats ||
+ a->ril != b->ril ||
+ a->ssid_size != b->ssid_size ||
+ a->oas != b->oas ||
a->xtsup != b->xtsup ||
a->pt != b->pt ||
a->granule != b->granule)
@@ -22734,6 +22763,36 @@ virDomainIOMMUDefCheckABIStability(virDomainIOMMUDef *src,
dst->pci_bus, src->pci_bus);
return false;
}
+ if (src->accel != dst->accel) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+ _("Target domain IOMMU device accel value '%1$d' does not match source '%2$d'"),
+ dst->accel, src->accel);
+ return false;
+ }
+ if (src->ats != dst->ats) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+ _("Target domain IOMMU device ATS value '%1$d' does not match source '%2$d'"),
+ dst->ats, src->ats);
+ return false;
+ }
+ if (src->ril != dst->ril) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+ _("Target domain IOMMU device ril value '%1$d' does not match source '%2$d'"),
+ dst->ril, src->ril);
+ return false;
+ }
+ if (src->ssid_size != dst->ssid_size) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+ _("Target domain IOMMU device ssid_size value '%1$d' does not match source '%2$d'"),
+ dst->ssid_size, src->ssid_size);
+ return false;
+ }
+ if (src->oas != dst->oas) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+ _("Target domain IOMMU device oas value '%1$d' does not match source '%2$d'"),
+ dst->oas, src->oas);
+ return false;
+ }
if (src->dma_translation != dst->dma_translation) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
_("Target domain IOMMU device dma translation '%1$s' does not match source '%2$s'"),
@@ -29204,6 +29263,26 @@ virDomainIOMMUDefFormat(virBuffer *buf,
virBufferAsprintf(&driverAttrBuf, " pciBus='%d'",
iommu->pci_bus);
}
+ if (iommu->accel != VIR_TRISTATE_SWITCH_ABSENT) {
+ virBufferAsprintf(&driverAttrBuf, " accel='%s'",
+ virTristateSwitchTypeToString(iommu->accel));
+ }
+ if (iommu->ats != VIR_TRISTATE_SWITCH_ABSENT) {
+ virBufferAsprintf(&driverAttrBuf, " ats='%s'",
+ virTristateSwitchTypeToString(iommu->ats));
+ }
+ if (iommu->ril != VIR_TRISTATE_SWITCH_ABSENT) {
+ virBufferAsprintf(&driverAttrBuf, " ril='%s'",
+ virTristateSwitchTypeToString(iommu->ril));
+ }
+ if (iommu->ssid_size >= 0) {
+ virBufferAsprintf(&driverAttrBuf, " ssidsize='%d'",
+ iommu->ssid_size);
+ }
+ if (iommu->oas >= 0) {
+ virBufferAsprintf(&driverAttrBuf, " oas='%d'",
+ iommu->oas);
+ }
if (iommu->granule != 0) {
if (iommu->granule == -1) {
virBufferAddLit(&driverChildBuf, "<granule mode='host'/>\n");
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index 0c6c79c413..40ea6090f8 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -3105,6 +3105,11 @@ struct _virDomainIOMMUDef {
virTristateSwitch xtsup;
virTristateSwitch pt;
int granule; /* -1 means 'host', 0 unset, page size in KiB otherwise */
+ virTristateSwitch accel;
+ virTristateSwitch ats;
+ virTristateSwitch ril;
+ int ssid_size;
+ int oas;
};
typedef enum {
diff --git a/src/conf/domain_validate.c b/src/conf/domain_validate.c
index 3946f92182..710a891904 100644
--- a/src/conf/domain_validate.c
+++ b/src/conf/domain_validate.c
@@ -3203,6 +3203,16 @@ virDomainIOMMUDefValidate(const virDomainIOMMUDef *iommu)
virDomainIOMMUModelTypeToString(iommu->model));
return -1;
}
+ if (iommu->accel != VIR_TRISTATE_SWITCH_ON &&
+ (iommu->ats != VIR_TRISTATE_SWITCH_ABSENT ||
+ iommu->ril != VIR_TRISTATE_SWITCH_ABSENT ||
+ iommu->ssid_size >= 0 ||
+ iommu->oas >= 0)) {
+ virReportError(VIR_ERR_XML_ERROR,
+ _("accel must be enabled for iommu model '%1$s' when setting ats, ril, ssidsize, or oas"),
+ virDomainIOMMUModelTypeToString(iommu->model));
+ return -1;
+ }
break;
case VIR_DOMAIN_IOMMU_MODEL_VIRTIO:
if (iommu->intremap != VIR_TRISTATE_SWITCH_ABSENT ||
@@ -3210,7 +3220,12 @@ virDomainIOMMUDefValidate(const virDomainIOMMUDef *iommu)
iommu->eim != VIR_TRISTATE_SWITCH_ABSENT ||
iommu->iotlb != VIR_TRISTATE_SWITCH_ABSENT ||
iommu->dma_translation != VIR_TRISTATE_SWITCH_ABSENT ||
- iommu->pci_bus >= 0) {
+ iommu->pci_bus >= 0 ||
+ iommu->accel != VIR_TRISTATE_SWITCH_ABSENT ||
+ iommu->ats != VIR_TRISTATE_SWITCH_ABSENT ||
+ iommu->ril != VIR_TRISTATE_SWITCH_ABSENT ||
+ iommu->ssid_size >= 0 ||
+ iommu->oas >= 0) {
virReportError(VIR_ERR_XML_ERROR,
_("iommu model '%1$s' doesn't support some additional attributes"),
virDomainIOMMUModelTypeToString(iommu->model));
@@ -3233,6 +3248,11 @@ virDomainIOMMUDefValidate(const virDomainIOMMUDef *iommu)
iommu->aw_bits != 0 ||
iommu->dma_translation != VIR_TRISTATE_SWITCH_ABSENT ||
iommu->pci_bus >= 0 ||
+ iommu->accel != VIR_TRISTATE_SWITCH_ABSENT ||
+ iommu->ats != VIR_TRISTATE_SWITCH_ABSENT ||
+ iommu->ril != VIR_TRISTATE_SWITCH_ABSENT ||
+ iommu->ssid_size >= 0 ||
+ iommu->oas >= 0 ||
iommu->granule != 0) {
virReportError(VIR_ERR_XML_ERROR,
_("iommu model '%1$s' doesn't support some additional attributes"),
@@ -3245,6 +3265,11 @@ virDomainIOMMUDefValidate(const virDomainIOMMUDef *iommu)
if (iommu->pt != VIR_TRISTATE_SWITCH_ABSENT ||
iommu->xtsup != VIR_TRISTATE_SWITCH_ABSENT ||
iommu->pci_bus >= 0 ||
+ iommu->accel != VIR_TRISTATE_SWITCH_ABSENT ||
+ iommu->ats != VIR_TRISTATE_SWITCH_ABSENT ||
+ iommu->ril != VIR_TRISTATE_SWITCH_ABSENT ||
+ iommu->ssid_size >= 0 ||
+ iommu->oas >= 0 ||
iommu->granule != 0) {
virReportError(VIR_ERR_XML_ERROR,
_("iommu model '%1$s' doesn't support some additional attributes"),
diff --git a/src/conf/schemas/domaincommon.rng b/src/conf/schemas/domaincommon.rng
index 121e4e06a6..c7d7ebc876 100644
--- a/src/conf/schemas/domaincommon.rng
+++ b/src/conf/schemas/domaincommon.rng
@@ -6454,6 +6454,31 @@
<empty/>
</element>
</optional>
+ <optional>
+ <attribute name="accel">
+ <ref name="virOnOff"/>
+ </attribute>
+ </optional>
+ <optional>
+ <attribute name="ats">
+ <ref name="virOnOff"/>
+ </attribute>
+ </optional>
+ <optional>
+ <attribute name="ril">
+ <ref name="virOnOff"/>
+ </attribute>
+ </optional>
+ <optional>
+ <attribute name="ssidsize">
+ <data type="int"/>
+ </attribute>
+ </optional>
+ <optional>
+ <attribute name="oas">
+ <data type="int"/>
+ </attribute>
+ </optional>
</element>
</optional>
<optional>
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index e726dc661c..2d5eaa1e80 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -6276,6 +6276,8 @@ qemuBuildPCINestedSmmuv3DevProps(const virDomainDef *def,
{
g_autoptr(virJSONValue) props = NULL;
g_autofree char *bus = NULL;
+ g_autofree char *ssidsizeStr = NULL;
+ g_autofree char *oasStr = NULL;
virPCIDeviceAddress addr = { .bus = iommu->pci_bus };
bus = qemuBuildDeviceAddressPCIGetBus(def, &addr);
@@ -6286,10 +6288,23 @@ qemuBuildPCINestedSmmuv3DevProps(const virDomainDef *def,
return NULL;
}
+ if (iommu->ssid_size >= 0) {
+ ssidsizeStr = g_strdup_printf("%u", iommu->ssid_size);
+ }
+
+ if (iommu->oas >= 0) {
+ oasStr = g_strdup_printf("%u", iommu->oas);
+ }
+
if (virJSONValueObjectAdd(&props,
"s:driver", "arm-smmuv3",
"s:primary-bus", bus,
"s:id", iommu->info.alias,
+ "T:accel", iommu->accel,
+ "S:ats", qemuOnOffAuto(iommu->ats),
+ "S:ril", qemuOnOffAuto(iommu->ril),
+ "S:ssidsize", ssidsizeStr,
+ "S:oas", oasStr,
NULL) < 0)
return NULL;
diff --git a/src/qemu/qemu_validate.c b/src/qemu/qemu_validate.c
index 2da99329c5..1093eb8363 100644
--- a/src/qemu/qemu_validate.c
+++ b/src/qemu/qemu_validate.c
@@ -5827,6 +5827,18 @@ qemuValidateDomainDeviceDefIOMMU(const virDomainIOMMUDef *iommu,
return -1;
}
+ /* While QEMU_CAPS_ARM_SMMUV3_ACCEL tracks the .accel attribute of
+ * arm-smmuv3 it is also a good indicator of .ats, .ril, .ssidsize, and
+ * .oas attributes as all of them were introduced in the same release,
+ * and these features are meant to be backported all together. */
+ if (iommu->model == VIR_DOMAIN_IOMMU_MODEL_SMMUV3 &&
+ iommu->accel != VIR_TRISTATE_SWITCH_ABSENT &&
+ !virQEMUCapsGet(qemuCaps, QEMU_CAPS_ARM_SMMUV3_ACCEL)) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+ _("iommu: accel is not supported with this QEMU binary"));
+ return -1;
+ }
+
if (iommu->granule > 0) {
/* QEMU supports only 4KiB, 8KiB, 16KiB and 64KiB granule size */
if (!(iommu->granule == 4 ||
--
2.55.0

239
centos-10/SOURCES/libvirt-qemu-Always-assume-support-for-QEMU_CAPS_SET_ACTION.patch

@ -0,0 +1,239 @@
From e21a75730bd8cdd57b595222ff1af64d012431f8 Mon Sep 17 00:00:00 2001
Message-ID: <e21a75730bd8cdd57b595222ff1af64d012431f8.1787144196.git.jdenemar@redhat.com>
From: Peter Krempa <pkrempa@redhat.com>
Date: Mon, 20 Jul 2026 13:27:20 +0200
Subject: [PATCH] qemu: Always assume support for 'QEMU_CAPS_SET_ACTION'
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
The 'set-action' QMP command was introduced in qemu-6.0 and can't be
disabled in any way. Oldest qemu we support is qemu-7.2 so all versions
now have it.
Remove all conditional code which depends on the 'set-action' command.
Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
(cherry picked from commit 771f17c9072c6aacc7bc10e01afc14421512c913)
https://redhat.atlassian.net/browse/RHEL-242545
---
src/qemu/qemu_command.c | 13 +++----------
src/qemu/qemu_driver.c | 16 ----------------
src/qemu/qemu_hotplug.c | 10 +---------
src/qemu/qemu_process.c | 31 +------------------------------
src/qemu/qemu_validate.c | 14 ++------------
5 files changed, 7 insertions(+), 77 deletions(-)
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index 2d5eaa1e80..346a7905c5 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -6171,16 +6171,9 @@ qemuBuildPMCommandLine(virCommand *cmd,
{
virQEMUCaps *qemuCaps = priv->qemuCaps;
- if (virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_SET_ACTION)) {
- /* with new qemu we always want '-no-shutdown' on startup and we set
- * all the other behaviour later during startup */
- virCommandAddArg(cmd, "-no-shutdown");
- } else {
- if (priv->allowReboot == VIR_TRISTATE_BOOL_NO)
- virCommandAddArg(cmd, "-no-reboot");
- else
- virCommandAddArg(cmd, "-no-shutdown");
- }
+ /* with new qemu we always want '-no-shutdown' on startup and we set
+ * all the other behaviour later during startup */
+ virCommandAddArg(cmd, "-no-shutdown");
/* Use old syntax of -no-acpi only if qemu didn't report that it supports the
* new syntax */
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 8ec9e1f9c4..b3b853b4c8 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -19551,9 +19551,6 @@ qemuDomainModifyLifecycleActionLive(virDomainObj *vm,
qemuDomainObjPrivate *priv = vm->privateData;
int rc;
- if (!virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_SET_ACTION))
- return 0;
-
/* For now we only update 'reboot' action here as we want to keep the
* shutdown action as is (we're emulating the outcome anyways)) */
if (type != VIR_DOMAIN_LIFECYCLE_REBOOT ||
@@ -19603,7 +19600,6 @@ qemuDomainSetLifecycleAction(virDomainPtr dom,
{
virQEMUDriver *driver = dom->conn->privateData;
g_autoptr(virQEMUDriverConfig) cfg = virQEMUDriverGetConfig(driver);
- qemuDomainObjPrivate *priv;
virDomainObj *vm = NULL;
virDomainDef *def = NULL;
virDomainDef *persistentDef = NULL;
@@ -19620,8 +19616,6 @@ qemuDomainSetLifecycleAction(virDomainPtr dom,
if (!(vm = qemuDomainObjFromDomain(dom)))
goto cleanup;
- priv = vm->privateData;
-
if (virDomainSetLifecycleActionEnsureACL(dom->conn, vm->def) < 0)
goto cleanup;
@@ -19636,16 +19630,6 @@ qemuDomainSetLifecycleAction(virDomainPtr dom,
goto endjob;
if (def) {
- if (!virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_SET_ACTION)) {
- if (priv->allowReboot == VIR_TRISTATE_BOOL_NO ||
- (type == VIR_DOMAIN_LIFECYCLE_REBOOT &&
- def->onReboot != action)) {
- virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
- _("cannot update lifecycle action because QEMU was started with incompatible -no-reboot setting"));
- goto endjob;
- }
- }
-
if (qemuDomainModifyLifecycleActionLive(vm, type, action) < 0)
goto endjob;
diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c
index 5be567b510..8990a716fa 100644
--- a/src/qemu/qemu_hotplug.c
+++ b/src/qemu/qemu_hotplug.c
@@ -3061,7 +3061,7 @@ qemuDomainAttachWatchdog(virDomainObj *vm,
if (vm->def->nwatchdogs) {
/* Domain already has a watchdog and all must have the same action. */
rv = 0;
- } else if (virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_SET_ACTION)) {
+ } else {
/* QEMU doesn't have a 'dump' action; we tell qemu to 'pause', then
libvirt listens for the watchdog event, and we perform the dump
ourselves. so convert 'dump' to 'pause' for the qemu cli */
@@ -3103,14 +3103,6 @@ qemuDomainAttachWatchdog(virDomainObj *vm,
QEMU_MONITOR_ACTION_REBOOT_KEEP,
watchdogaction,
QEMU_MONITOR_ACTION_PANIC_KEEP);
- } else {
- virDomainWatchdogAction actualAction = watchdog->action;
-
- if (actualAction == VIR_DOMAIN_WATCHDOG_ACTION_DUMP)
- actualAction = VIR_DOMAIN_WATCHDOG_ACTION_PAUSE;
-
- rv = qemuMonitorSetWatchdogAction(priv->mon,
- virDomainWatchdogActionTypeToString(actualAction));
}
if (rv >= 0)
diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
index 4c94ff3c91..646ddda7e9 100644
--- a/src/qemu/qemu_process.c
+++ b/src/qemu/qemu_process.c
@@ -6898,24 +6898,6 @@ qemuProcessRebootAllowed(const virDomainDef *def)
}
-static void
-qemuProcessPrepareAllowReboot(virDomainObj *vm)
-{
- virDomainDef *def = vm->def;
- qemuDomainObjPrivate *priv = vm->privateData;
-
- /* with 'set-action' QMP command we don't need to keep this around as
- * we always update qemu with the proper state */
- if (virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_SET_ACTION))
- return;
-
- if (priv->allowReboot != VIR_TRISTATE_BOOL_ABSENT)
- return;
-
- priv->allowReboot = virTristateBoolFromBool(qemuProcessRebootAllowed(def));
-}
-
-
static int
qemuProcessUpdateSEVInfo(virDomainObj *vm)
{
@@ -7087,8 +7069,6 @@ qemuProcessPrepareDomain(virQEMUDriver *driver,
/* Track if this domain remembers original owner */
priv->rememberOwner = cfg->rememberOwner;
- qemuProcessPrepareAllowReboot(vm);
-
/*
* Normally PCI addresses are assigned in the virDomainCreate
* or virDomainDefine methods. We might still need to assign
@@ -8216,9 +8196,6 @@ qemuProcessSetupLifecycleActions(virDomainObj *vm,
qemuDomainObjPrivate *priv = vm->privateData;
int rc;
- if (!(virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_SET_ACTION)))
- return 0;
-
/* for now we handle only onReboot->destroy here as an alternative to
* '-no-reboot' on the commandline */
if (vm->def->onReboot != VIR_DOMAIN_LIFECYCLE_ACTION_DESTROY)
@@ -9909,10 +9886,6 @@ qemuProcessReconnect(void *opaque)
if (qemuExtDevicesInitPaths(cfg, obj->def) < 0)
goto error;
- /* If we are connecting to a guest started by old libvirt there is no
- * allowReboot in status XML and we need to initialize it. */
- qemuProcessPrepareAllowReboot(obj);
-
if (qemuHostdevUpdateActiveDomainDevices(driver, obj->def) < 0)
goto error;
@@ -10147,9 +10120,7 @@ qemuProcessReconnect(void *opaque)
* domain crashed; otherwise, if the monitor was started,
* then we can blame ourselves, else we failed before the
* monitor started so we don't really know. */
- if (!priv->mon && tryMonReconn &&
- (priv->allowReboot == VIR_TRISTATE_BOOL_YES ||
- virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_SET_ACTION)))
+ if (!priv->mon && tryMonReconn)
state = VIR_DOMAIN_SHUTOFF_CRASHED;
else if (priv->mon)
state = VIR_DOMAIN_SHUTOFF_DAEMON;
diff --git a/src/qemu/qemu_validate.c b/src/qemu/qemu_validate.c
index 1093eb8363..61f3bd3278 100644
--- a/src/qemu/qemu_validate.c
+++ b/src/qemu/qemu_validate.c
@@ -3658,10 +3658,7 @@ qemuValidateDomainDeviceDefDiskBlkdeviotune(const virDomainDiskDef *disk,
static int
-qemuValidateDomainDeviceDefDiskTransient(const virDomainDiskDef *disk,
- const virDomainDef *def,
- virQEMUCaps *qemuCaps)
-
+qemuValidateDomainDeviceDefDiskTransient(const virDomainDiskDef *disk)
{
virStorageType actualType = virStorageSourceGetActualType(disk->src);
@@ -3695,13 +3692,6 @@ qemuValidateDomainDeviceDefDiskTransient(const virDomainDiskDef *disk,
}
if (disk->transientShareBacking == VIR_TRISTATE_BOOL_YES) {
- if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_SET_ACTION) &&
- !qemuProcessRebootAllowed(def)) {
- virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
- _("transient disk backing image sharing with destroy action of lifecycle isn't supported by this QEMU binary"));
- return -1;
- }
-
/* sharing the backing file requires hotplug of the disk in the qemu driver */
switch (disk->bus) {
case VIR_DOMAIN_DISK_BUS_USB:
@@ -3747,7 +3737,7 @@ qemuValidateDomainDeviceDefDisk(const virDomainDiskDef *disk,
if (qemuValidateDomainDeviceDefDiskBlkdeviotune(disk, def) < 0)
return -1;
- if (qemuValidateDomainDeviceDefDiskTransient(disk, def, qemuCaps) < 0)
+ if (qemuValidateDomainDeviceDefDiskTransient(disk) < 0)
return -1;
if (disk->src->shared && !disk->src->readonly &&
--
2.55.0

50
centos-10/SOURCES/libvirt-qemu-Fix-proper-ordering-of-virtlockd-shutdown.patch

@ -0,0 +1,50 @@
From 5c17de983248cecad3d35c5afae30c6ce4ddc6d2 Mon Sep 17 00:00:00 2001
Message-ID: <5c17de983248cecad3d35c5afae30c6ce4ddc6d2.1787144197.git.jdenemar@redhat.com>
From: Peter Krempa <pkrempa@redhat.com>
Date: Tue, 18 Aug 2026 10:09:06 +0200
Subject: [PATCH] qemu: Fix proper ordering of 'virtlockd' shutdown
In commit aa1bf13b9caa4ef893cd4fdbaa111d5da73aa120 I attempted to fix
the ordering of virtlockd and virtlogd during shutdown but I made a typo
in the name of 'virtlockd.service' (missing 'd').
Fixes: aa1bf13b9caa4ef893cd4fdbaa111d5da73aa120
Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Pavel Hrdina <phrdina@redhat.com>
Reviewed-by: Martin Kletzander <mkletzan@redhat.com>
(cherry picked from commit 82b39d0580ecb6aa4a6c88eabb85cc6d6bafd559)
https://redhat.atlassian.net/browse/RHEL-185108
---
src/qemu/virtqemud.service.extra.in | 2 +-
src/remote/libvirtd.service.in | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/qemu/virtqemud.service.extra.in b/src/qemu/virtqemud.service.extra.in
index 3cc2edcfd0..df36890704 100644
--- a/src/qemu/virtqemud.service.extra.in
+++ b/src/qemu/virtqemud.service.extra.in
@@ -9,7 +9,7 @@ After=virtlockd.socket
# To ensure that our helper daemons are not shut down before the main daemon
# shuts down we need also explicit ordering with the .service unit
After=virtlogd.service
-After=virtlock.service
+After=virtlockd.service
Wants=systemd-machined.service
After=systemd-machined.service
After=remote-fs.target
diff --git a/src/remote/libvirtd.service.in b/src/remote/libvirtd.service.in
index f26494d646..ccdb8379f3 100644
--- a/src/remote/libvirtd.service.in
+++ b/src/remote/libvirtd.service.in
@@ -18,7 +18,7 @@ After=virtlockd.socket
# To ensure that our helper daemons are not shut down before the main daemon
# shuts down we need also explicit ordering with the .service unit
After=virtlogd.service
-After=virtlock.service
+After=virtlockd.service
Wants=systemd-machined.service
After=network.target
After=dbus.service
--
2.55.0

155
centos-10/SOURCES/libvirt-qemu-Implement-device-info-for-virDomainGetGuestInfo-API.patch

@ -0,0 +1,155 @@
From ecf217dd9ca44b05970ca04085c156d46fa9e513 Mon Sep 17 00:00:00 2001
Message-ID: <ecf217dd9ca44b05970ca04085c156d46fa9e513.1787144197.git.jdenemar@redhat.com>
From: Michal Privoznik <mprivozn@redhat.com>
Date: Wed, 12 Aug 2026 13:44:48 +0200
Subject: [PATCH] qemu: Implement device info for virDomainGetGuestInfo() API
Use freshly introduced qemuAgentGetGuestDeviceInfo() to implement
support of VIR_DOMAIN_GUEST_INFO_DEVICES type of
virDomainGetGuestInfo() API in the QEMU driver.
Resolves: https://redhat.atlassian.net/browse/RHEL-235731
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
Reviewed-by: Peter Krempa <pkrempa@redhat.com>
(cherry picked from commit 21a3c6f27cd60e8c00d4c0f6825f9b96e13a7a34)
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
---
src/hypervisor/qemu_agent.c | 36 ++++++++++++++++++++++++++++++++++++
src/hypervisor/qemu_agent.h | 5 +++++
src/libvirt_private.syms | 1 +
src/qemu/qemu_driver.c | 23 ++++++++++++++++++++++-
4 files changed, 64 insertions(+), 1 deletion(-)
diff --git a/src/hypervisor/qemu_agent.c b/src/hypervisor/qemu_agent.c
index fbfaafc1bb..f5f50e3c92 100644
--- a/src/hypervisor/qemu_agent.c
+++ b/src/hypervisor/qemu_agent.c
@@ -2962,3 +2962,39 @@ qemuAgentGetGuestDeviceInfo(qemuAgent *agent,
g_clear_pointer(info, g_free);
return -1;
}
+
+
+void
+qemuAgentGuestDeviceInfoFormatParams(qemuAgentGuestDeviceInfo **devices,
+ size_t ndevices,
+ virTypedParamList *list)
+{
+ size_t i;
+
+ virTypedParamListAddUInt(list, ndevices, VIR_DOMAIN_GUEST_INFO_DEVICE_COUNT);
+
+ for (i = 0; i < ndevices; i++) {
+ virTypedParamListAddString(list, devices[i]->driverName,
+ VIR_DOMAIN_GUEST_INFO_DEVICE_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_DEVICE_SUFFIX_DRIVER_NAME, i);
+
+ if (devices[i]->driverDate != -1) {
+ /* Guest agent reports this in nanoseconds, our API in seconds. */
+ virTypedParamListAddLLong(list, devices[i]->driverDate / 1000000000,
+ VIR_DOMAIN_GUEST_INFO_DEVICE_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_DEVICE_SUFFIX_DRIVER_DATE, i);
+ }
+
+ if (devices[i]->driverVersion) {
+ virTypedParamListAddString(list, devices[i]->driverVersion,
+ VIR_DOMAIN_GUEST_INFO_DEVICE_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_DEVICE_SUFFIX_DRIVER_VERSION, i);
+ }
+
+ if (devices[i]->pci) {
+ virTypedParamListAddString(list, "pci",
+ VIR_DOMAIN_GUEST_INFO_DEVICE_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_DEVICE_SUFFIX_ID_TYPE, i);
+ virTypedParamListAddUInt(list, devices[i]->pci->vendorID,
+ VIR_DOMAIN_GUEST_INFO_DEVICE_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_DEVICE_SUFFIX_PCI_VENDOR, i);
+ virTypedParamListAddUInt(list, devices[i]->pci->deviceID,
+ VIR_DOMAIN_GUEST_INFO_DEVICE_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_DEVICE_SUFFIX_PCI_DEVICE, i);
+ }
+ }
+}
diff --git a/src/hypervisor/qemu_agent.h b/src/hypervisor/qemu_agent.h
index def4194ab7..ea69524950 100644
--- a/src/hypervisor/qemu_agent.h
+++ b/src/hypervisor/qemu_agent.h
@@ -239,3 +239,8 @@ G_DEFINE_AUTOPTR_CLEANUP_FUNC(qemuAgentGuestDeviceInfo, qemuAgentGuestDeviceInfo
int qemuAgentGetGuestDeviceInfo(qemuAgent *agent,
qemuAgentGuestDeviceInfo ***info,
bool report_unsupported);
+
+void
+qemuAgentGuestDeviceInfoFormatParams(qemuAgentGuestDeviceInfo **devices,
+ size_t ndevices,
+ virTypedParamList *list);
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index 0bd8c6f781..6c6cc7b4ff 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -1735,6 +1735,7 @@ qemuAgentGetTime;
qemuAgentGetTimezone;
qemuAgentGetUsers;
qemuAgentGetVCPUs;
+qemuAgentGuestDeviceInfoFormatParams;
qemuAgentGuestDeviceInfoFree;
qemuAgentInterfaceFormatParams;
qemuAgentNotifyClose;
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index c7892161e3..596c5dda67 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -19990,7 +19990,8 @@ static const unsigned int qemuDomainGetGuestInfoSupportedTypes =
VIR_DOMAIN_GUEST_INFO_FILESYSTEM |
VIR_DOMAIN_GUEST_INFO_DISKS |
VIR_DOMAIN_GUEST_INFO_INTERFACES |
- VIR_DOMAIN_GUEST_INFO_LOAD;
+ VIR_DOMAIN_GUEST_INFO_LOAD |
+ VIR_DOMAIN_GUEST_INFO_DEVICES;
static int
qemuDomainGetGuestInfoCheckSupport(unsigned int types,
@@ -20038,6 +20039,8 @@ qemuDomainGetGuestInfo(virDomainPtr dom,
double load5m = 0;
double load15m = 0;
bool format_load = false;
+ qemuAgentGuestDeviceInfo **devices = NULL;
+ size_t ndevices = 0;
size_t i;
g_autoptr(virTypedParamList) list = virTypedParamListNew();
@@ -20117,6 +20120,14 @@ qemuDomainGetGuestInfo(virDomainPtr dom,
format_load = true;
}
+ if (supportedTypes & VIR_DOMAIN_GUEST_INFO_DEVICES) {
+ rc = qemuAgentGetGuestDeviceInfo(agent, &devices, report_unsupported);
+ if (rc == -1)
+ goto exitagent;
+ if (rc >= 0)
+ ndevices = rc;
+ }
+
qemuDomainObjExitAgent(vm, agent);
virDomainObjEndAgentJob(vm);
@@ -20149,6 +20160,10 @@ qemuDomainGetGuestInfo(virDomainPtr dom,
virTypedParamListAddDouble(list, load15m, VIR_DOMAIN_GUEST_INFO_LOAD_15M);
}
+ if (ndevices > 0) {
+ qemuAgentGuestDeviceInfoFormatParams(devices, ndevices, list);
+ }
+
if (virTypedParamListSteal(list, params, nparams) < 0)
goto cleanup;
@@ -20166,6 +20181,12 @@ qemuDomainGetGuestInfo(virDomainPtr dom,
virDomainInterfaceFree(ifaces[i]);
}
g_free(ifaces);
+ if (devices && ndevices > 0) {
+ for (i = 0; i < ndevices; i++) {
+ qemuAgentGuestDeviceInfoFree(devices[i]);
+ }
+ g_free(devices);
+ }
virDomainObjEndAPI(&vm);
return ret;
--
2.55.0

313
centos-10/SOURCES/libvirt-qemu-Remove-allowReboot-field.patch

@ -0,0 +1,313 @@
From 0b63c24aa265be78e55210ab5d985e24bdb13499 Mon Sep 17 00:00:00 2001
Message-ID: <0b63c24aa265be78e55210ab5d985e24bdb13499.1787144196.git.jdenemar@redhat.com>
From: Peter Krempa <pkrempa@redhat.com>
Date: Mon, 20 Jul 2026 13:35:07 +0200
Subject: [PATCH] qemu: Remove 'allowReboot' field
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
The value is no longer used. Remove it including the status XML
handling.
Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
(cherry picked from commit 94bd5174d20fafafc2fa67fae101b78b46ec6196)
https://redhat.atlassian.net/browse/RHEL-242545
---
src/qemu/qemu_domain.c | 33 -------------------
src/qemu/qemu_domain.h | 17 ----------
.../qemustatusxml2xmldata/backup-pull-in.xml | 1 -
.../blockjob-blockdev-in.xml | 1 -
.../blockjob-mirror-in.xml | 1 -
.../memory-backing-dir-in.xml | 1 -
.../migration-in-params-in.xml | 1 -
.../migration-out-nbd-bitmaps-in.xml | 1 -
.../migration-out-nbd-out.xml | 1 -
.../migration-out-nbd-tls-out.xml | 1 -
.../migration-out-params-in.xml | 1 -
tests/qemustatusxml2xmldata/modern-in.xml | 1 -
.../qcow2-data-file-in.xml | 1 -
.../throttlefilter-out.xml | 1 -
tests/qemustatusxml2xmldata/upgrade-out.xml | 1 -
.../qemustatusxml2xmldata/vcpus-multi-in.xml | 1 -
16 files changed, 64 deletions(-)
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
index e1b805d906..a4e5f92840 100644
--- a/src/qemu/qemu_domain.c
+++ b/src/qemu/qemu_domain.c
@@ -1946,8 +1946,6 @@ qemuDomainObjPrivateDataClear(qemuDomainObjPrivate *priv)
priv->rememberOwner = false;
- priv->allowReboot = VIR_TRISTATE_BOOL_ABSENT;
-
g_clear_pointer(&priv->migrationCaps, virBitmapFree);
virHashRemoveAll(priv->blockjobs);
@@ -2621,17 +2619,6 @@ qemuDomainObjPrivateXMLFormatBackups(virBuffer *buf,
}
-void
-qemuDomainObjPrivateXMLFormatAllowReboot(virBuffer *buf,
- virTristateBool allowReboot)
-{
- if (allowReboot) {
- virBufferAsprintf(buf, "<allowReboot value='%s'/>\n",
- virTristateBoolTypeToString(allowReboot));
- }
-}
-
-
static void
qemuDomainObjPrivateXMLFormatPR(virBuffer *buf,
qemuDomainObjPrivate *priv)
@@ -2812,8 +2799,6 @@ qemuDomainObjPrivateXMLFormat(virBuffer *buf,
if (priv->rememberOwner)
virBufferAddLit(buf, "<rememberOwner/>\n");
- qemuDomainObjPrivateXMLFormatAllowReboot(buf, priv->allowReboot);
-
qemuDomainObjPrivateXMLFormatPR(buf, priv);
virBufferAsprintf(buf, "<nodename index='%llu'/>\n", priv->nodenameindex);
@@ -3302,21 +3287,6 @@ qemuDomainObjPrivateXMLParseBackups(qemuDomainObjPrivate *priv,
}
-int
-qemuDomainObjPrivateXMLParseAllowReboot(xmlXPathContextPtr ctxt,
- virTristateBool *allowReboot)
-{
- xmlNodePtr node = virXPathNode("./allowReboot", ctxt);
-
- /* Allow value='default' as the input here, because old versions
- * of libvirt produced that output and we need to be able to read
- * it back to correctly handle running guests on daemon upgrade */
- return virXMLPropTristateBoolAllowDefault(node, "value",
- VIR_XML_PROP_NONE,
- allowReboot);
-}
-
-
static void
qemuDomainObjPrivateXMLParsePR(xmlXPathContextPtr ctxt,
bool *prDaemonRunning)
@@ -3548,9 +3518,6 @@ qemuDomainObjPrivateXMLParse(xmlXPathContextPtr ctxt,
priv->chardevStdioLogd = virXPathBoolean("boolean(./chardevStdioLogd)",
ctxt) == 1;
- if (qemuDomainObjPrivateXMLParseAllowReboot(ctxt, &priv->allowReboot) < 0)
- return -1;
-
qemuDomainObjPrivateXMLParsePR(ctxt, &priv->prDaemonRunning);
if (qemuDomainObjPrivateXMLParseBlockjobs(vm, priv, ctxt) < 0)
diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h
index 50ab492023..23e99dc68c 100644
--- a/src/qemu/qemu_domain.h
+++ b/src/qemu/qemu_domain.h
@@ -134,15 +134,6 @@ struct _qemuDomainObjPrivate {
bool fakeReboot;
bool fakeReset;
bool pausedShutdown;
- /* allowReboot:
- *
- * Unused with new QEMU versions which have QEMU_CAPS_SET_ACTION.
- *
- * Otherwise if it's set to VIR_TRISTATE_BOOL_YES, QEMU was started with
- * -no-shutdown, and if set to VIR_TRISTATE_BOOL_NO qemu was started with
- * -no-reboot instead.
- */
- virTristateBool allowReboot;
unsigned long migMaxBandwidth;
char *origname;
@@ -1010,14 +1001,6 @@ qemuDomainFixupCPUs(virDomainObj *vm,
char *
qemuDomainGetMachineName(virDomainObj *vm);
-void
-qemuDomainObjPrivateXMLFormatAllowReboot(virBuffer *buf,
- virTristateBool allowReboot);
-
-int
-qemuDomainObjPrivateXMLParseAllowReboot(xmlXPathContextPtr ctxt,
- virTristateBool *allowReboot);
-
void
qemuDomainPrepareDiskSourceData(virDomainDiskDef *disk,
virStorageSource *src);
diff --git a/tests/qemustatusxml2xmldata/backup-pull-in.xml b/tests/qemustatusxml2xmldata/backup-pull-in.xml
index 2cedcc3cf2..fcaff2e38a 100644
--- a/tests/qemustatusxml2xmldata/backup-pull-in.xml
+++ b/tests/qemustatusxml2xmldata/backup-pull-in.xml
@@ -233,7 +233,6 @@
<channelTargetDir path='/var/lib/libvirt/qemu/channel/target/domain-4-copy'/>
<memoryBackingDir path='/var/lib/libvirt/qemu/ram/4-copy'/>
<chardevStdioLogd/>
- <allowReboot value='yes'/>
<nodename index='0'/>
<fdset index='0'/>
<blockjobs active='yes'>
diff --git a/tests/qemustatusxml2xmldata/blockjob-blockdev-in.xml b/tests/qemustatusxml2xmldata/blockjob-blockdev-in.xml
index 1c45fad370..58afae4168 100644
--- a/tests/qemustatusxml2xmldata/blockjob-blockdev-in.xml
+++ b/tests/qemustatusxml2xmldata/blockjob-blockdev-in.xml
@@ -232,7 +232,6 @@
<channelTargetDir path='/var/lib/libvirt/qemu/channel/target/domain-4-copy'/>
<memoryBackingDir path='/var/lib/libvirt/qemu/ram/4-copy'/>
<chardevStdioLogd/>
- <allowReboot value='yes'/>
<nodename index='0'/>
<fdset index='0'/>
<blockjobs active='yes'>
diff --git a/tests/qemustatusxml2xmldata/blockjob-mirror-in.xml b/tests/qemustatusxml2xmldata/blockjob-mirror-in.xml
index df11e83ced..be85202c02 100644
--- a/tests/qemustatusxml2xmldata/blockjob-mirror-in.xml
+++ b/tests/qemustatusxml2xmldata/blockjob-mirror-in.xml
@@ -22,7 +22,6 @@
<libDir path='/tmp'/>
<channelTargetDir path='/var/lib/libvirt/qemu/channel/target'/>
<memoryBackingDir path='/var/lib/libvirt/qemu/ram/1-QEMUGuest1'/>
- <allowReboot value='yes'/>
<nodename index='0'/>
<fdset index='0'/>
<blockjobs active='yes'/>
diff --git a/tests/qemustatusxml2xmldata/memory-backing-dir-in.xml b/tests/qemustatusxml2xmldata/memory-backing-dir-in.xml
index eea671a41c..a1a1845495 100644
--- a/tests/qemustatusxml2xmldata/memory-backing-dir-in.xml
+++ b/tests/qemustatusxml2xmldata/memory-backing-dir-in.xml
@@ -22,7 +22,6 @@
<libDir path='/tmp'/>
<channelTargetDir path='/var/lib/libvirt/qemu/channel/target'/>
<memoryBackingDir path='/some/random/path/1-QEMUGuest1'/>
- <allowReboot value='yes'/>
<nodename index='0'/>
<fdset index='0'/>
<blockjobs active='no'/>
diff --git a/tests/qemustatusxml2xmldata/migration-in-params-in.xml b/tests/qemustatusxml2xmldata/migration-in-params-in.xml
index 861d8eeadb..986e5455aa 100644
--- a/tests/qemustatusxml2xmldata/migration-in-params-in.xml
+++ b/tests/qemustatusxml2xmldata/migration-in-params-in.xml
@@ -256,7 +256,6 @@
<channelTargetDir path='/var/lib/libvirt/qemu/channel/target/domain-1-nest'/>
<memoryBackingDir path='/var/lib/libvirt/qemu/ram/1-nest'/>
<chardevStdioLogd/>
- <allowReboot value='yes'/>
<nodename index='0'/>
<fdset index='0'/>
<blockjobs active='no'/>
diff --git a/tests/qemustatusxml2xmldata/migration-out-nbd-bitmaps-in.xml b/tests/qemustatusxml2xmldata/migration-out-nbd-bitmaps-in.xml
index 5d76545513..4f1fb07c1b 100644
--- a/tests/qemustatusxml2xmldata/migration-out-nbd-bitmaps-in.xml
+++ b/tests/qemustatusxml2xmldata/migration-out-nbd-bitmaps-in.xml
@@ -342,7 +342,6 @@
</cpu>
<chardevStdioLogd/>
<rememberOwner/>
- <allowReboot value='yes'/>
<nodename index='3'/>
<fdset index='0'/>
<blockjobs active='yes'>
diff --git a/tests/qemustatusxml2xmldata/migration-out-nbd-out.xml b/tests/qemustatusxml2xmldata/migration-out-nbd-out.xml
index 581cf28286..a69d1c4590 100644
--- a/tests/qemustatusxml2xmldata/migration-out-nbd-out.xml
+++ b/tests/qemustatusxml2xmldata/migration-out-nbd-out.xml
@@ -259,7 +259,6 @@
<channelTargetDir path='/var/lib/libvirt/qemu/channel/target/domain-4-upstream'/>
<memoryBackingDir path='/var/lib/libvirt/qemu/ram/4-upstream'/>
<chardevStdioLogd/>
- <allowReboot value='yes'/>
<nodename index='0'/>
<fdset index='0'/>
<blockjobs active='no'/>
diff --git a/tests/qemustatusxml2xmldata/migration-out-nbd-tls-out.xml b/tests/qemustatusxml2xmldata/migration-out-nbd-tls-out.xml
index dacaa3e42f..86a7fbc187 100644
--- a/tests/qemustatusxml2xmldata/migration-out-nbd-tls-out.xml
+++ b/tests/qemustatusxml2xmldata/migration-out-nbd-tls-out.xml
@@ -288,7 +288,6 @@
<channelTargetDir path='/var/lib/libvirt/qemu/channel/target/domain-3-upstream'/>
<memoryBackingDir path='/var/lib/libvirt/qemu/ram/3-upstream'/>
<chardevStdioLogd/>
- <allowReboot value='yes'/>
<nodename index='0'/>
<fdset index='0'/>
<blockjobs active='no'/>
diff --git a/tests/qemustatusxml2xmldata/migration-out-params-in.xml b/tests/qemustatusxml2xmldata/migration-out-params-in.xml
index b914236b62..f4e921ab38 100644
--- a/tests/qemustatusxml2xmldata/migration-out-params-in.xml
+++ b/tests/qemustatusxml2xmldata/migration-out-params-in.xml
@@ -270,7 +270,6 @@
<channelTargetDir path='/var/lib/libvirt/qemu/channel/target/domain-7-nest'/>
<memoryBackingDir path='/var/lib/libvirt/qemu/ram/7-nest'/>
<chardevStdioLogd/>
- <allowReboot value='yes'/>
<nodename index='0'/>
<fdset index='0'/>
<blockjobs active='no'/>
diff --git a/tests/qemustatusxml2xmldata/modern-in.xml b/tests/qemustatusxml2xmldata/modern-in.xml
index 050669f554..422a04f3ca 100644
--- a/tests/qemustatusxml2xmldata/modern-in.xml
+++ b/tests/qemustatusxml2xmldata/modern-in.xml
@@ -260,7 +260,6 @@
<channelTargetDir path='/var/lib/libvirt/qemu/channel/target/domain-1-upstream'/>
<memoryBackingDir path='/var/lib/libvirt/qemu/ram/1-upstream'/>
<chardevStdioLogd/>
- <allowReboot value='yes'/>
<nodename index='123'/>
<fdset index='321'/>
<blockjobs active='no'/>
diff --git a/tests/qemustatusxml2xmldata/qcow2-data-file-in.xml b/tests/qemustatusxml2xmldata/qcow2-data-file-in.xml
index 2675214417..951b4abfbe 100644
--- a/tests/qemustatusxml2xmldata/qcow2-data-file-in.xml
+++ b/tests/qemustatusxml2xmldata/qcow2-data-file-in.xml
@@ -22,7 +22,6 @@
<libDir path='/tmp'/>
<channelTargetDir path='/var/lib/libvirt/qemu/channel/target'/>
<memoryBackingDir path='/var/lib/libvirt/qemu/ram/1-QEMUGuest1'/>
- <allowReboot value='yes'/>
<nodename index='0'/>
<fdset index='0'/>
<blockjobs active='no'/>
diff --git a/tests/qemustatusxml2xmldata/throttlefilter-out.xml b/tests/qemustatusxml2xmldata/throttlefilter-out.xml
index 8751a42cce..eee01c79b1 100644
--- a/tests/qemustatusxml2xmldata/throttlefilter-out.xml
+++ b/tests/qemustatusxml2xmldata/throttlefilter-out.xml
@@ -233,7 +233,6 @@
<channelTargetDir path='/var/lib/libvirt/qemu/channel/target/domain-4-copy'/>
<memoryBackingDir path='/var/lib/libvirt/qemu/ram/4-copy'/>
<chardevStdioLogd/>
- <allowReboot value='yes'/>
<nodename index='0'/>
<fdset index='0'/>
<blockjobs active='no'/>
diff --git a/tests/qemustatusxml2xmldata/upgrade-out.xml b/tests/qemustatusxml2xmldata/upgrade-out.xml
index c7bc7128df..fd1c174200 100644
--- a/tests/qemustatusxml2xmldata/upgrade-out.xml
+++ b/tests/qemustatusxml2xmldata/upgrade-out.xml
@@ -258,7 +258,6 @@
<channelTargetDir path='/var/lib/libvirt/qemu/channel/target/domain-1-upstream'/>
<memoryBackingDir path='/var/lib/libvirt/qemu/ram/1-upstream'/>
<chardevStdioLogd/>
- <allowReboot value='yes'/>
<nodename index='0'/>
<fdset index='0'/>
<blockjobs active='no'/>
diff --git a/tests/qemustatusxml2xmldata/vcpus-multi-in.xml b/tests/qemustatusxml2xmldata/vcpus-multi-in.xml
index 6ee688ce03..1d5b34c2b6 100644
--- a/tests/qemustatusxml2xmldata/vcpus-multi-in.xml
+++ b/tests/qemustatusxml2xmldata/vcpus-multi-in.xml
@@ -308,7 +308,6 @@
<libDir path='/tmp'/>
<channelTargetDir path='/var/lib/libvirt/qemu/channel/target'/>
<memoryBackingDir path='/var/lib/libvirt/qemu/ram/1729-QEMUGuest1'/>
- <allowReboot value='yes'/>
<nodename index='0'/>
<fdset index='0'/>
<blockjobs active='no'/>
--
2.55.0

63
centos-10/SOURCES/libvirt-qemu-Remove-unused-qemuProcessRebootAllowed.patch

@ -0,0 +1,63 @@
From 4f5111e3d80b98ce455074f89fea42c4e311bad0 Mon Sep 17 00:00:00 2001
Message-ID: <4f5111e3d80b98ce455074f89fea42c4e311bad0.1787144196.git.jdenemar@redhat.com>
From: Peter Krempa <pkrempa@redhat.com>
Date: Mon, 20 Jul 2026 13:29:50 +0200
Subject: [PATCH] qemu: Remove unused 'qemuProcessRebootAllowed'
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
(cherry picked from commit 8effae01b918f91933a6bd3b5721cb243c50248a)
https://redhat.atlassian.net/browse/RHEL-242545
---
src/qemu/qemu_process.c | 18 ------------------
src/qemu/qemu_process.h | 2 --
2 files changed, 20 deletions(-)
diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
index 646ddda7e9..a1cdce6d17 100644
--- a/src/qemu/qemu_process.c
+++ b/src/qemu/qemu_process.c
@@ -6880,24 +6880,6 @@ qemuProcessPrepareDomainHostdevs(virDomainObj *vm,
}
-/**
- * qemuProcessRebootAllowed:
- * @def: domain definition
- *
- * This function encapsulates the logic which dictated whether '-no-reboot' was
- * used instead of '-no-shutdown' which is used QEMU versions which don't
- * support the 'set-action' QMP command.
- */
-bool
-qemuProcessRebootAllowed(const virDomainDef *def)
-{
- return def->onReboot != VIR_DOMAIN_LIFECYCLE_ACTION_DESTROY ||
- def->onPoweroff != VIR_DOMAIN_LIFECYCLE_ACTION_DESTROY ||
- (def->onCrash != VIR_DOMAIN_LIFECYCLE_ACTION_DESTROY &&
- def->onCrash != VIR_DOMAIN_LIFECYCLE_ACTION_COREDUMP_DESTROY);
-}
-
-
static int
qemuProcessUpdateSEVInfo(virDomainObj *vm)
{
diff --git a/src/qemu/qemu_process.h b/src/qemu/qemu_process.h
index 5874214596..2db5186e08 100644
--- a/src/qemu/qemu_process.h
+++ b/src/qemu/qemu_process.h
@@ -258,8 +258,6 @@ G_DEFINE_AUTOPTR_CLEANUP_FUNC(qemuProcessQMP, qemuProcessQMPFree);
int qemuProcessQMPStart(qemuProcessQMP *proc);
-bool qemuProcessRebootAllowed(const virDomainDef *def);
-
void qemuProcessCleanupMigrationJob(virQEMUDriver *driver,
virDomainObj *vm);
--
2.55.0

539
centos-10/SOURCES/libvirt-qemu-capabilities-Retire-QEMU_CAPS_SET_ACTION.patch

@ -0,0 +1,539 @@
From 3eba80300859ed86f6f23cc2b60ef9426b57a0cf Mon Sep 17 00:00:00 2001
Message-ID: <3eba80300859ed86f6f23cc2b60ef9426b57a0cf.1787144196.git.jdenemar@redhat.com>
From: Peter Krempa <pkrempa@redhat.com>
Date: Mon, 20 Jul 2026 13:43:26 +0200
Subject: [PATCH] qemu: capabilities: Retire QEMU_CAPS_SET_ACTION
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
The capability is no longer used because all qemu versions we support do
have the 'set-action' command.
Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
(cherry picked from commit 01cb769a183e40a3f820ed9f949cf2d8b8cc3498)
https://redhat.atlassian.net/browse/RHEL-242545
---
src/qemu/qemu_capabilities.c | 3 +--
src/qemu/qemu_capabilities.h | 2 +-
tests/qemucapabilitiesdata/caps_10.0.0_aarch64.xml | 1 -
tests/qemucapabilitiesdata/caps_10.0.0_ppc64.xml | 1 -
tests/qemucapabilitiesdata/caps_10.0.0_s390x.xml | 1 -
tests/qemucapabilitiesdata/caps_10.0.0_x86_64+amdsev.xml | 1 -
tests/qemucapabilitiesdata/caps_10.0.0_x86_64.xml | 1 -
tests/qemucapabilitiesdata/caps_10.1.0_s390x.xml | 1 -
tests/qemucapabilitiesdata/caps_10.1.0_x86_64+inteltdx.xml | 1 -
tests/qemucapabilitiesdata/caps_10.1.0_x86_64.xml | 1 -
tests/qemucapabilitiesdata/caps_10.2.0_aarch64.xml | 1 -
tests/qemucapabilitiesdata/caps_10.2.0_x86_64+mshv.xml | 1 -
tests/qemucapabilitiesdata/caps_10.2.0_x86_64.xml | 1 -
tests/qemucapabilitiesdata/caps_11.0.0_aarch64.xml | 1 -
tests/qemucapabilitiesdata/caps_11.0.0_s390x.xml | 1 -
tests/qemucapabilitiesdata/caps_11.0.0_x86_64+sgx.xml | 1 -
tests/qemucapabilitiesdata/caps_11.0.0_x86_64.xml | 1 -
tests/qemucapabilitiesdata/caps_11.1.0_aarch64.xml | 1 -
tests/qemucapabilitiesdata/caps_11.1.0_x86_64.xml | 1 -
tests/qemucapabilitiesdata/caps_7.2.0_ppc.xml | 1 -
tests/qemucapabilitiesdata/caps_7.2.0_x86_64+hvf.xml | 1 -
tests/qemucapabilitiesdata/caps_7.2.0_x86_64.xml | 1 -
tests/qemucapabilitiesdata/caps_8.0.0_x86_64.xml | 1 -
tests/qemucapabilitiesdata/caps_8.1.0_s390x.xml | 1 -
tests/qemucapabilitiesdata/caps_8.1.0_x86_64.xml | 1 -
tests/qemucapabilitiesdata/caps_8.2.0_aarch64.xml | 1 -
tests/qemucapabilitiesdata/caps_8.2.0_armv7l.xml | 1 -
tests/qemucapabilitiesdata/caps_8.2.0_loongarch64.xml | 1 -
tests/qemucapabilitiesdata/caps_8.2.0_s390x.xml | 1 -
tests/qemucapabilitiesdata/caps_8.2.0_x86_64.xml | 1 -
tests/qemucapabilitiesdata/caps_9.0.0_sparc.xml | 1 -
tests/qemucapabilitiesdata/caps_9.0.0_x86_64.xml | 1 -
tests/qemucapabilitiesdata/caps_9.1.0_riscv64.xml | 1 -
tests/qemucapabilitiesdata/caps_9.1.0_s390x.xml | 1 -
tests/qemucapabilitiesdata/caps_9.1.0_x86_64.xml | 1 -
tests/qemucapabilitiesdata/caps_9.2.0_aarch64+hvf.xml | 1 -
tests/qemucapabilitiesdata/caps_9.2.0_s390x.xml | 1 -
tests/qemucapabilitiesdata/caps_9.2.0_x86_64+amdsev.xml | 1 -
tests/qemucapabilitiesdata/caps_9.2.0_x86_64.xml | 1 -
39 files changed, 2 insertions(+), 40 deletions(-)
diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
index c60ca02d97..f46c3b2759 100644
--- a/src/qemu/qemu_capabilities.c
+++ b/src/qemu/qemu_capabilities.c
@@ -643,7 +643,7 @@ VIR_ENUM_IMPL(virQEMUCaps,
"confidential-guest-support", /* QEMU_CAPS_MACHINE_CONFIDENTAL_GUEST_SUPPORT */
"query-display-options", /* X_QEMU_CAPS_QUERY_DISPLAY_OPTIONS */
"s390-pv-guest", /* QEMU_CAPS_S390_PV_GUEST */
- "set-action", /* QEMU_CAPS_SET_ACTION */
+ "set-action", /* X_QEMU_CAPS_SET_ACTION */
"virtio-blk.queue-size", /* QEMU_CAPS_VIRTIO_BLK_QUEUE_SIZE */
/* 410 */
@@ -1291,7 +1291,6 @@ struct virQEMUCapsStringFlags virQEMUCapsCommands[] = {
{ "query-cpu-definitions", QEMU_CAPS_QUERY_CPU_DEFINITIONS },
{ "query-cpu-model-baseline", QEMU_CAPS_QUERY_CPU_MODEL_BASELINE },
{ "query-cpu-model-comparison", QEMU_CAPS_QUERY_CPU_MODEL_COMPARISON },
- { "set-action", QEMU_CAPS_SET_ACTION },
{ "query-dirty-rate", QEMU_CAPS_QUERY_DIRTY_RATE },
{ "sev-inject-launch-secret", QEMU_CAPS_SEV_INJECT_LAUNCH_SECRET },
{ "calc-dirty-rate", QEMU_CAPS_CALC_DIRTY_RATE },
diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h
index 28085144a2..3fcee1dbe2 100644
--- a/src/qemu/qemu_capabilities.h
+++ b/src/qemu/qemu_capabilities.h
@@ -617,7 +617,7 @@ typedef enum { /* virQEMUCapsFlags grouping marker for syntax-check */
QEMU_CAPS_MACHINE_CONFIDENTAL_GUEST_SUPPORT, /* -machine confidential-guest-support */
X_QEMU_CAPS_QUERY_DISPLAY_OPTIONS, /* 'query-display-options' qmp command present */
QEMU_CAPS_S390_PV_GUEST, /* -object s390-pv-guest,... */
- QEMU_CAPS_SET_ACTION, /* 'set-action' QMP command */
+ X_QEMU_CAPS_SET_ACTION, /* 'set-action' QMP command */
QEMU_CAPS_VIRTIO_BLK_QUEUE_SIZE, /* virtio-blk-*.queue-size */
/* 410 */
diff --git a/tests/qemucapabilitiesdata/caps_10.0.0_aarch64.xml b/tests/qemucapabilitiesdata/caps_10.0.0_aarch64.xml
index b2a0872853..48629e494d 100644
--- a/tests/qemucapabilitiesdata/caps_10.0.0_aarch64.xml
+++ b/tests/qemucapabilitiesdata/caps_10.0.0_aarch64.xml
@@ -109,7 +109,6 @@
<flag name='acpi-index'/>
<flag name='input-linux'/>
<flag name='confidential-guest-support'/>
- <flag name='set-action'/>
<flag name='virtio-blk.queue-size'/>
<flag name='virtio-mem-pci'/>
<flag name='memory-backend-file.reserve'/>
diff --git a/tests/qemucapabilitiesdata/caps_10.0.0_ppc64.xml b/tests/qemucapabilitiesdata/caps_10.0.0_ppc64.xml
index 0b9613b921..70bf98c404 100644
--- a/tests/qemucapabilitiesdata/caps_10.0.0_ppc64.xml
+++ b/tests/qemucapabilitiesdata/caps_10.0.0_ppc64.xml
@@ -117,7 +117,6 @@
<flag name='virtio-gpu-gl-pci'/>
<flag name='virtio-vga-gl'/>
<flag name='confidential-guest-support'/>
- <flag name='set-action'/>
<flag name='virtio-blk.queue-size'/>
<flag name='memory-backend-file.reserve'/>
<flag name='netdev.json'/>
diff --git a/tests/qemucapabilitiesdata/caps_10.0.0_s390x.xml b/tests/qemucapabilitiesdata/caps_10.0.0_s390x.xml
index 96eadffcec..25d73b6e1d 100644
--- a/tests/qemucapabilitiesdata/caps_10.0.0_s390x.xml
+++ b/tests/qemucapabilitiesdata/caps_10.0.0_s390x.xml
@@ -81,7 +81,6 @@
<flag name='virtio-gpu-gl-pci'/>
<flag name='confidential-guest-support'/>
<flag name='s390-pv-guest'/>
- <flag name='set-action'/>
<flag name='virtio-blk.queue-size'/>
<flag name='virtio-mem-pci'/>
<flag name='memory-backend-file.reserve'/>
diff --git a/tests/qemucapabilitiesdata/caps_10.0.0_x86_64+amdsev.xml b/tests/qemucapabilitiesdata/caps_10.0.0_x86_64+amdsev.xml
index 945f7364db..53fd51122c 100644
--- a/tests/qemucapabilitiesdata/caps_10.0.0_x86_64+amdsev.xml
+++ b/tests/qemucapabilitiesdata/caps_10.0.0_x86_64+amdsev.xml
@@ -145,7 +145,6 @@
<flag name='virtio-gpu-gl-pci'/>
<flag name='virtio-vga-gl'/>
<flag name='confidential-guest-support'/>
- <flag name='set-action'/>
<flag name='virtio-blk.queue-size'/>
<flag name='virtio-mem-pci'/>
<flag name='memory-backend-file.reserve'/>
diff --git a/tests/qemucapabilitiesdata/caps_10.0.0_x86_64.xml b/tests/qemucapabilitiesdata/caps_10.0.0_x86_64.xml
index 5cd3828f52..ad3fe67638 100644
--- a/tests/qemucapabilitiesdata/caps_10.0.0_x86_64.xml
+++ b/tests/qemucapabilitiesdata/caps_10.0.0_x86_64.xml
@@ -145,7 +145,6 @@
<flag name='virtio-gpu-gl-pci'/>
<flag name='virtio-vga-gl'/>
<flag name='confidential-guest-support'/>
- <flag name='set-action'/>
<flag name='virtio-blk.queue-size'/>
<flag name='virtio-mem-pci'/>
<flag name='memory-backend-file.reserve'/>
diff --git a/tests/qemucapabilitiesdata/caps_10.1.0_s390x.xml b/tests/qemucapabilitiesdata/caps_10.1.0_s390x.xml
index 584a1b304c..0d46b3b20e 100644
--- a/tests/qemucapabilitiesdata/caps_10.1.0_s390x.xml
+++ b/tests/qemucapabilitiesdata/caps_10.1.0_s390x.xml
@@ -82,7 +82,6 @@
<flag name='virtio-gpu-gl-pci'/>
<flag name='confidential-guest-support'/>
<flag name='s390-pv-guest'/>
- <flag name='set-action'/>
<flag name='virtio-blk.queue-size'/>
<flag name='virtio-mem-pci'/>
<flag name='memory-backend-file.reserve'/>
diff --git a/tests/qemucapabilitiesdata/caps_10.1.0_x86_64+inteltdx.xml b/tests/qemucapabilitiesdata/caps_10.1.0_x86_64+inteltdx.xml
index 6dd00c360f..242215f7a8 100644
--- a/tests/qemucapabilitiesdata/caps_10.1.0_x86_64+inteltdx.xml
+++ b/tests/qemucapabilitiesdata/caps_10.1.0_x86_64+inteltdx.xml
@@ -128,7 +128,6 @@
<flag name='acpi-index'/>
<flag name='input-linux'/>
<flag name='confidential-guest-support'/>
- <flag name='set-action'/>
<flag name='virtio-blk.queue-size'/>
<flag name='virtio-mem-pci'/>
<flag name='memory-backend-file.reserve'/>
diff --git a/tests/qemucapabilitiesdata/caps_10.1.0_x86_64.xml b/tests/qemucapabilitiesdata/caps_10.1.0_x86_64.xml
index e7a0818697..a2faddcced 100644
--- a/tests/qemucapabilitiesdata/caps_10.1.0_x86_64.xml
+++ b/tests/qemucapabilitiesdata/caps_10.1.0_x86_64.xml
@@ -147,7 +147,6 @@
<flag name='virtio-gpu-gl-pci'/>
<flag name='virtio-vga-gl'/>
<flag name='confidential-guest-support'/>
- <flag name='set-action'/>
<flag name='virtio-blk.queue-size'/>
<flag name='virtio-mem-pci'/>
<flag name='memory-backend-file.reserve'/>
diff --git a/tests/qemucapabilitiesdata/caps_10.2.0_aarch64.xml b/tests/qemucapabilitiesdata/caps_10.2.0_aarch64.xml
index f3d06927f6..3bbba5ddb1 100644
--- a/tests/qemucapabilitiesdata/caps_10.2.0_aarch64.xml
+++ b/tests/qemucapabilitiesdata/caps_10.2.0_aarch64.xml
@@ -122,7 +122,6 @@
<flag name='input-linux'/>
<flag name='virtio-gpu-gl-pci'/>
<flag name='confidential-guest-support'/>
- <flag name='set-action'/>
<flag name='virtio-blk.queue-size'/>
<flag name='virtio-mem-pci'/>
<flag name='memory-backend-file.reserve'/>
diff --git a/tests/qemucapabilitiesdata/caps_10.2.0_x86_64+mshv.xml b/tests/qemucapabilitiesdata/caps_10.2.0_x86_64+mshv.xml
index 54018639ad..530c0366ea 100644
--- a/tests/qemucapabilitiesdata/caps_10.2.0_x86_64+mshv.xml
+++ b/tests/qemucapabilitiesdata/caps_10.2.0_x86_64+mshv.xml
@@ -135,7 +135,6 @@
<flag name='acpi-index'/>
<flag name='input-linux'/>
<flag name='confidential-guest-support'/>
- <flag name='set-action'/>
<flag name='virtio-blk.queue-size'/>
<flag name='virtio-mem-pci'/>
<flag name='memory-backend-file.reserve'/>
diff --git a/tests/qemucapabilitiesdata/caps_10.2.0_x86_64.xml b/tests/qemucapabilitiesdata/caps_10.2.0_x86_64.xml
index d5cc279e13..b2cd261b99 100644
--- a/tests/qemucapabilitiesdata/caps_10.2.0_x86_64.xml
+++ b/tests/qemucapabilitiesdata/caps_10.2.0_x86_64.xml
@@ -147,7 +147,6 @@
<flag name='virtio-gpu-gl-pci'/>
<flag name='virtio-vga-gl'/>
<flag name='confidential-guest-support'/>
- <flag name='set-action'/>
<flag name='virtio-blk.queue-size'/>
<flag name='virtio-mem-pci'/>
<flag name='memory-backend-file.reserve'/>
diff --git a/tests/qemucapabilitiesdata/caps_11.0.0_aarch64.xml b/tests/qemucapabilitiesdata/caps_11.0.0_aarch64.xml
index ca6def23dc..d77884f401 100644
--- a/tests/qemucapabilitiesdata/caps_11.0.0_aarch64.xml
+++ b/tests/qemucapabilitiesdata/caps_11.0.0_aarch64.xml
@@ -122,7 +122,6 @@
<flag name='input-linux'/>
<flag name='virtio-gpu-gl-pci'/>
<flag name='confidential-guest-support'/>
- <flag name='set-action'/>
<flag name='virtio-blk.queue-size'/>
<flag name='virtio-mem-pci'/>
<flag name='memory-backend-file.reserve'/>
diff --git a/tests/qemucapabilitiesdata/caps_11.0.0_s390x.xml b/tests/qemucapabilitiesdata/caps_11.0.0_s390x.xml
index 99fccc9739..07ee859318 100644
--- a/tests/qemucapabilitiesdata/caps_11.0.0_s390x.xml
+++ b/tests/qemucapabilitiesdata/caps_11.0.0_s390x.xml
@@ -82,7 +82,6 @@
<flag name='virtio-gpu-gl-pci'/>
<flag name='confidential-guest-support'/>
<flag name='s390-pv-guest'/>
- <flag name='set-action'/>
<flag name='virtio-blk.queue-size'/>
<flag name='virtio-mem-pci'/>
<flag name='memory-backend-file.reserve'/>
diff --git a/tests/qemucapabilitiesdata/caps_11.0.0_x86_64+sgx.xml b/tests/qemucapabilitiesdata/caps_11.0.0_x86_64+sgx.xml
index bac7951f73..108f4b0b86 100644
--- a/tests/qemucapabilitiesdata/caps_11.0.0_x86_64+sgx.xml
+++ b/tests/qemucapabilitiesdata/caps_11.0.0_x86_64+sgx.xml
@@ -147,7 +147,6 @@
<flag name='virtio-gpu-gl-pci'/>
<flag name='virtio-vga-gl'/>
<flag name='confidential-guest-support'/>
- <flag name='set-action'/>
<flag name='virtio-blk.queue-size'/>
<flag name='virtio-mem-pci'/>
<flag name='memory-backend-file.reserve'/>
diff --git a/tests/qemucapabilitiesdata/caps_11.0.0_x86_64.xml b/tests/qemucapabilitiesdata/caps_11.0.0_x86_64.xml
index 8724ce5b56..29fdaf20d8 100644
--- a/tests/qemucapabilitiesdata/caps_11.0.0_x86_64.xml
+++ b/tests/qemucapabilitiesdata/caps_11.0.0_x86_64.xml
@@ -147,7 +147,6 @@
<flag name='virtio-gpu-gl-pci'/>
<flag name='virtio-vga-gl'/>
<flag name='confidential-guest-support'/>
- <flag name='set-action'/>
<flag name='virtio-blk.queue-size'/>
<flag name='virtio-mem-pci'/>
<flag name='memory-backend-file.reserve'/>
diff --git a/tests/qemucapabilitiesdata/caps_11.1.0_aarch64.xml b/tests/qemucapabilitiesdata/caps_11.1.0_aarch64.xml
index 306f2981c1..56fbb80028 100644
--- a/tests/qemucapabilitiesdata/caps_11.1.0_aarch64.xml
+++ b/tests/qemucapabilitiesdata/caps_11.1.0_aarch64.xml
@@ -122,7 +122,6 @@
<flag name='input-linux'/>
<flag name='virtio-gpu-gl-pci'/>
<flag name='confidential-guest-support'/>
- <flag name='set-action'/>
<flag name='virtio-blk.queue-size'/>
<flag name='virtio-mem-pci'/>
<flag name='memory-backend-file.reserve'/>
diff --git a/tests/qemucapabilitiesdata/caps_11.1.0_x86_64.xml b/tests/qemucapabilitiesdata/caps_11.1.0_x86_64.xml
index 0c020702b4..1d1eef21ff 100644
--- a/tests/qemucapabilitiesdata/caps_11.1.0_x86_64.xml
+++ b/tests/qemucapabilitiesdata/caps_11.1.0_x86_64.xml
@@ -147,7 +147,6 @@
<flag name='virtio-gpu-gl-pci'/>
<flag name='virtio-vga-gl'/>
<flag name='confidential-guest-support'/>
- <flag name='set-action'/>
<flag name='virtio-blk.queue-size'/>
<flag name='virtio-mem-pci'/>
<flag name='memory-backend-file.reserve'/>
diff --git a/tests/qemucapabilitiesdata/caps_7.2.0_ppc.xml b/tests/qemucapabilitiesdata/caps_7.2.0_ppc.xml
index bc5953f43e..bf67b3d295 100644
--- a/tests/qemucapabilitiesdata/caps_7.2.0_ppc.xml
+++ b/tests/qemucapabilitiesdata/caps_7.2.0_ppc.xml
@@ -109,7 +109,6 @@
<flag name='input-linux'/>
<flag name='virtio-gpu-gl-pci'/>
<flag name='confidential-guest-support'/>
- <flag name='set-action'/>
<flag name='virtio-blk.queue-size'/>
<flag name='memory-backend-file.reserve'/>
<flag name='piix4.acpi-root-pci-hotplug'/>
diff --git a/tests/qemucapabilitiesdata/caps_7.2.0_x86_64+hvf.xml b/tests/qemucapabilitiesdata/caps_7.2.0_x86_64+hvf.xml
index 425c608863..f40d77baa5 100644
--- a/tests/qemucapabilitiesdata/caps_7.2.0_x86_64+hvf.xml
+++ b/tests/qemucapabilitiesdata/caps_7.2.0_x86_64+hvf.xml
@@ -146,7 +146,6 @@
<flag name='virtio-gpu-gl-pci'/>
<flag name='virtio-vga-gl'/>
<flag name='confidential-guest-support'/>
- <flag name='set-action'/>
<flag name='virtio-blk.queue-size'/>
<flag name='virtio-mem-pci'/>
<flag name='memory-backend-file.reserve'/>
diff --git a/tests/qemucapabilitiesdata/caps_7.2.0_x86_64.xml b/tests/qemucapabilitiesdata/caps_7.2.0_x86_64.xml
index 93fe36f48c..8d44ed71e0 100644
--- a/tests/qemucapabilitiesdata/caps_7.2.0_x86_64.xml
+++ b/tests/qemucapabilitiesdata/caps_7.2.0_x86_64.xml
@@ -147,7 +147,6 @@
<flag name='virtio-gpu-gl-pci'/>
<flag name='virtio-vga-gl'/>
<flag name='confidential-guest-support'/>
- <flag name='set-action'/>
<flag name='virtio-blk.queue-size'/>
<flag name='virtio-mem-pci'/>
<flag name='memory-backend-file.reserve'/>
diff --git a/tests/qemucapabilitiesdata/caps_8.0.0_x86_64.xml b/tests/qemucapabilitiesdata/caps_8.0.0_x86_64.xml
index 592df7049b..fcbb68e415 100644
--- a/tests/qemucapabilitiesdata/caps_8.0.0_x86_64.xml
+++ b/tests/qemucapabilitiesdata/caps_8.0.0_x86_64.xml
@@ -147,7 +147,6 @@
<flag name='virtio-gpu-gl-pci'/>
<flag name='virtio-vga-gl'/>
<flag name='confidential-guest-support'/>
- <flag name='set-action'/>
<flag name='virtio-blk.queue-size'/>
<flag name='virtio-mem-pci'/>
<flag name='memory-backend-file.reserve'/>
diff --git a/tests/qemucapabilitiesdata/caps_8.1.0_s390x.xml b/tests/qemucapabilitiesdata/caps_8.1.0_s390x.xml
index 2c540f7f30..65f73d1af8 100644
--- a/tests/qemucapabilitiesdata/caps_8.1.0_s390x.xml
+++ b/tests/qemucapabilitiesdata/caps_8.1.0_s390x.xml
@@ -77,7 +77,6 @@
<flag name='input-linux'/>
<flag name='confidential-guest-support'/>
<flag name='s390-pv-guest'/>
- <flag name='set-action'/>
<flag name='virtio-blk.queue-size'/>
<flag name='memory-backend-file.reserve'/>
<flag name='netdev.json'/>
diff --git a/tests/qemucapabilitiesdata/caps_8.1.0_x86_64.xml b/tests/qemucapabilitiesdata/caps_8.1.0_x86_64.xml
index b29325a465..c730dd7174 100644
--- a/tests/qemucapabilitiesdata/caps_8.1.0_x86_64.xml
+++ b/tests/qemucapabilitiesdata/caps_8.1.0_x86_64.xml
@@ -147,7 +147,6 @@
<flag name='virtio-gpu-gl-pci'/>
<flag name='virtio-vga-gl'/>
<flag name='confidential-guest-support'/>
- <flag name='set-action'/>
<flag name='virtio-blk.queue-size'/>
<flag name='virtio-mem-pci'/>
<flag name='memory-backend-file.reserve'/>
diff --git a/tests/qemucapabilitiesdata/caps_8.2.0_aarch64.xml b/tests/qemucapabilitiesdata/caps_8.2.0_aarch64.xml
index e026abfd96..1f0f68092d 100644
--- a/tests/qemucapabilitiesdata/caps_8.2.0_aarch64.xml
+++ b/tests/qemucapabilitiesdata/caps_8.2.0_aarch64.xml
@@ -115,7 +115,6 @@
<flag name='acpi-index'/>
<flag name='input-linux'/>
<flag name='confidential-guest-support'/>
- <flag name='set-action'/>
<flag name='virtio-blk.queue-size'/>
<flag name='virtio-mem-pci'/>
<flag name='memory-backend-file.reserve'/>
diff --git a/tests/qemucapabilitiesdata/caps_8.2.0_armv7l.xml b/tests/qemucapabilitiesdata/caps_8.2.0_armv7l.xml
index d3af74bcb3..254ec27545 100644
--- a/tests/qemucapabilitiesdata/caps_8.2.0_armv7l.xml
+++ b/tests/qemucapabilitiesdata/caps_8.2.0_armv7l.xml
@@ -120,7 +120,6 @@
<flag name='input-linux'/>
<flag name='virtio-gpu-gl-pci'/>
<flag name='confidential-guest-support'/>
- <flag name='set-action'/>
<flag name='virtio-blk.queue-size'/>
<flag name='virtio-mem-pci'/>
<flag name='memory-backend-file.reserve'/>
diff --git a/tests/qemucapabilitiesdata/caps_8.2.0_loongarch64.xml b/tests/qemucapabilitiesdata/caps_8.2.0_loongarch64.xml
index 640438623a..95eb2dfa21 100644
--- a/tests/qemucapabilitiesdata/caps_8.2.0_loongarch64.xml
+++ b/tests/qemucapabilitiesdata/caps_8.2.0_loongarch64.xml
@@ -108,7 +108,6 @@
<flag name='acpi-index'/>
<flag name='input-linux'/>
<flag name='confidential-guest-support'/>
- <flag name='set-action'/>
<flag name='virtio-blk.queue-size'/>
<flag name='memory-backend-file.reserve'/>
<flag name='netdev.json'/>
diff --git a/tests/qemucapabilitiesdata/caps_8.2.0_s390x.xml b/tests/qemucapabilitiesdata/caps_8.2.0_s390x.xml
index a254e16741..45ab66ec29 100644
--- a/tests/qemucapabilitiesdata/caps_8.2.0_s390x.xml
+++ b/tests/qemucapabilitiesdata/caps_8.2.0_s390x.xml
@@ -77,7 +77,6 @@
<flag name='input-linux'/>
<flag name='confidential-guest-support'/>
<flag name='s390-pv-guest'/>
- <flag name='set-action'/>
<flag name='virtio-blk.queue-size'/>
<flag name='memory-backend-file.reserve'/>
<flag name='netdev.json'/>
diff --git a/tests/qemucapabilitiesdata/caps_8.2.0_x86_64.xml b/tests/qemucapabilitiesdata/caps_8.2.0_x86_64.xml
index 57aa43adab..b46505d24b 100644
--- a/tests/qemucapabilitiesdata/caps_8.2.0_x86_64.xml
+++ b/tests/qemucapabilitiesdata/caps_8.2.0_x86_64.xml
@@ -147,7 +147,6 @@
<flag name='virtio-gpu-gl-pci'/>
<flag name='virtio-vga-gl'/>
<flag name='confidential-guest-support'/>
- <flag name='set-action'/>
<flag name='virtio-blk.queue-size'/>
<flag name='virtio-mem-pci'/>
<flag name='memory-backend-file.reserve'/>
diff --git a/tests/qemucapabilitiesdata/caps_9.0.0_sparc.xml b/tests/qemucapabilitiesdata/caps_9.0.0_sparc.xml
index c2710ecab1..44ddfb0f76 100644
--- a/tests/qemucapabilitiesdata/caps_9.0.0_sparc.xml
+++ b/tests/qemucapabilitiesdata/caps_9.0.0_sparc.xml
@@ -37,7 +37,6 @@
<flag name='rotation-rate'/>
<flag name='input-linux'/>
<flag name='confidential-guest-support'/>
- <flag name='set-action'/>
<flag name='memory-backend-file.reserve'/>
<flag name='netdev.json'/>
<flag name='query-dirty-rate'/>
diff --git a/tests/qemucapabilitiesdata/caps_9.0.0_x86_64.xml b/tests/qemucapabilitiesdata/caps_9.0.0_x86_64.xml
index 3b4aaa202c..2f361bd1c8 100644
--- a/tests/qemucapabilitiesdata/caps_9.0.0_x86_64.xml
+++ b/tests/qemucapabilitiesdata/caps_9.0.0_x86_64.xml
@@ -147,7 +147,6 @@
<flag name='virtio-gpu-gl-pci'/>
<flag name='virtio-vga-gl'/>
<flag name='confidential-guest-support'/>
- <flag name='set-action'/>
<flag name='virtio-blk.queue-size'/>
<flag name='virtio-mem-pci'/>
<flag name='memory-backend-file.reserve'/>
diff --git a/tests/qemucapabilitiesdata/caps_9.1.0_riscv64.xml b/tests/qemucapabilitiesdata/caps_9.1.0_riscv64.xml
index b5ca67b445..f04b2fd302 100644
--- a/tests/qemucapabilitiesdata/caps_9.1.0_riscv64.xml
+++ b/tests/qemucapabilitiesdata/caps_9.1.0_riscv64.xml
@@ -113,7 +113,6 @@
<flag name='virtio-gpu-gl-pci'/>
<flag name='virtio-vga-gl'/>
<flag name='confidential-guest-support'/>
- <flag name='set-action'/>
<flag name='virtio-blk.queue-size'/>
<flag name='memory-backend-file.reserve'/>
<flag name='netdev.json'/>
diff --git a/tests/qemucapabilitiesdata/caps_9.1.0_s390x.xml b/tests/qemucapabilitiesdata/caps_9.1.0_s390x.xml
index 02c8e6f641..990fe255f6 100644
--- a/tests/qemucapabilitiesdata/caps_9.1.0_s390x.xml
+++ b/tests/qemucapabilitiesdata/caps_9.1.0_s390x.xml
@@ -81,7 +81,6 @@
<flag name='virtio-gpu-gl-pci'/>
<flag name='confidential-guest-support'/>
<flag name='s390-pv-guest'/>
- <flag name='set-action'/>
<flag name='virtio-blk.queue-size'/>
<flag name='memory-backend-file.reserve'/>
<flag name='netdev.json'/>
diff --git a/tests/qemucapabilitiesdata/caps_9.1.0_x86_64.xml b/tests/qemucapabilitiesdata/caps_9.1.0_x86_64.xml
index 65d279f5ea..07d7562c84 100644
--- a/tests/qemucapabilitiesdata/caps_9.1.0_x86_64.xml
+++ b/tests/qemucapabilitiesdata/caps_9.1.0_x86_64.xml
@@ -145,7 +145,6 @@
<flag name='virtio-gpu-gl-pci'/>
<flag name='virtio-vga-gl'/>
<flag name='confidential-guest-support'/>
- <flag name='set-action'/>
<flag name='virtio-blk.queue-size'/>
<flag name='virtio-mem-pci'/>
<flag name='memory-backend-file.reserve'/>
diff --git a/tests/qemucapabilitiesdata/caps_9.2.0_aarch64+hvf.xml b/tests/qemucapabilitiesdata/caps_9.2.0_aarch64+hvf.xml
index 8c777c121e..c9e85ff9b3 100644
--- a/tests/qemucapabilitiesdata/caps_9.2.0_aarch64+hvf.xml
+++ b/tests/qemucapabilitiesdata/caps_9.2.0_aarch64+hvf.xml
@@ -87,7 +87,6 @@
<flag name='rotation-rate'/>
<flag name='acpi-index'/>
<flag name='confidential-guest-support'/>
- <flag name='set-action'/>
<flag name='virtio-blk.queue-size'/>
<flag name='netdev.json'/>
<flag name='query-dirty-rate'/>
diff --git a/tests/qemucapabilitiesdata/caps_9.2.0_s390x.xml b/tests/qemucapabilitiesdata/caps_9.2.0_s390x.xml
index 135812b527..a8f830076e 100644
--- a/tests/qemucapabilitiesdata/caps_9.2.0_s390x.xml
+++ b/tests/qemucapabilitiesdata/caps_9.2.0_s390x.xml
@@ -81,7 +81,6 @@
<flag name='virtio-gpu-gl-pci'/>
<flag name='confidential-guest-support'/>
<flag name='s390-pv-guest'/>
- <flag name='set-action'/>
<flag name='virtio-blk.queue-size'/>
<flag name='memory-backend-file.reserve'/>
<flag name='netdev.json'/>
diff --git a/tests/qemucapabilitiesdata/caps_9.2.0_x86_64+amdsev.xml b/tests/qemucapabilitiesdata/caps_9.2.0_x86_64+amdsev.xml
index af4b8bbc3e..f67222578d 100644
--- a/tests/qemucapabilitiesdata/caps_9.2.0_x86_64+amdsev.xml
+++ b/tests/qemucapabilitiesdata/caps_9.2.0_x86_64+amdsev.xml
@@ -146,7 +146,6 @@
<flag name='virtio-gpu-gl-pci'/>
<flag name='virtio-vga-gl'/>
<flag name='confidential-guest-support'/>
- <flag name='set-action'/>
<flag name='virtio-blk.queue-size'/>
<flag name='virtio-mem-pci'/>
<flag name='memory-backend-file.reserve'/>
diff --git a/tests/qemucapabilitiesdata/caps_9.2.0_x86_64.xml b/tests/qemucapabilitiesdata/caps_9.2.0_x86_64.xml
index 933698d99f..efd3eeb9c7 100644
--- a/tests/qemucapabilitiesdata/caps_9.2.0_x86_64.xml
+++ b/tests/qemucapabilitiesdata/caps_9.2.0_x86_64.xml
@@ -145,7 +145,6 @@
<flag name='virtio-gpu-gl-pci'/>
<flag name='virtio-vga-gl'/>
<flag name='confidential-guest-support'/>
- <flag name='set-action'/>
<flag name='virtio-blk.queue-size'/>
<flag name='virtio-mem-pci'/>
<flag name='memory-backend-file.reserve'/>
--
2.55.0

81
centos-10/SOURCES/libvirt-qemu-introduce-QEMU_CAPS_ARM_SMMUV3_ACCEL.patch

@ -0,0 +1,81 @@
From 613935cded2347bf61e0461ac8f72f2f99ceb18f Mon Sep 17 00:00:00 2001
Message-ID: <613935cded2347bf61e0461ac8f72f2f99ceb18f.1786713644.git.jdenemar@redhat.com>
From: Nathan Chen <nathanc@nvidia.com>
Date: Wed, 5 Aug 2026 15:12:59 -0700
Subject: [PATCH] qemu: introduce QEMU_CAPS_ARM_SMMUV3_ACCEL
The arm-smmuv3 accel device property, used for HW-accelerated nested
SMMUv3, was added in QEMU 11.0.0 on top of the pluggable device
introduced in 10.2. Probe it alongside smmu_per_bus via
device-list-properties.
Reviewed-by: Pavel Hrdina <phrdina@redhat.com>
Signed-off-by: Nathan Chen <nathanc@nvidia.com>
(cherry picked from commit 90b01b9d3e3b684837190e92257eba15511515b0)
Resolves: https://redhat.atlassian.net/browse/RHEL-138901
---
src/qemu/qemu_capabilities.c | 2 ++
src/qemu/qemu_capabilities.h | 1 +
tests/qemucapabilitiesdata/caps_11.0.0_aarch64.xml | 1 +
tests/qemucapabilitiesdata/caps_11.1.0_aarch64.xml | 1 +
4 files changed, 5 insertions(+)
diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
index a7d121f917..c60ca02d97 100644
--- a/src/qemu/qemu_capabilities.c
+++ b/src/qemu/qemu_capabilities.c
@@ -769,6 +769,7 @@ VIR_ENUM_IMPL(virQEMUCaps,
"blockdev-mirror.target-is-zero", /* QEMU_CAPS_BLOCKDEV_MIRROR_TARGET_IS_ZERO */
"arm-smmuv3", /* QEMU_CAPS_DEVICE_ARM_SMMUV3 */
"arm-smmuv3.smmu_per_bus", /* QEMU_CAPS_ARM_SMMUV3_SMMU_PER_BUS */
+ "arm-smmuv3.accel", /* QEMU_CAPS_ARM_SMMUV3_ACCEL */
);
@@ -1648,6 +1649,7 @@ static struct virQEMUCapsDevicePropsFlags virQEMUCapsDevicePropsAMDIOMMU[] = {
static struct virQEMUCapsDevicePropsFlags virQEMUCapsDevicePropsArmSmmuv3[] = {
{ "smmu_per_bus", QEMU_CAPS_ARM_SMMUV3_SMMU_PER_BUS, NULL },
+ { "accel", QEMU_CAPS_ARM_SMMUV3_ACCEL, NULL },
};
/* see documentation for virQEMUQAPISchemaPathGet for the query format */
diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h
index 0dc9836ca9..28085144a2 100644
--- a/src/qemu/qemu_capabilities.h
+++ b/src/qemu/qemu_capabilities.h
@@ -743,6 +743,7 @@ typedef enum { /* virQEMUCapsFlags grouping marker for syntax-check */
QEMU_CAPS_BLOCKDEV_MIRROR_TARGET_IS_ZERO, /* 'blockdev-mirror' supports 'target-is-zero' */
QEMU_CAPS_DEVICE_ARM_SMMUV3, /* -device arm-smmuv3 */
QEMU_CAPS_ARM_SMMUV3_SMMU_PER_BUS, /* arm-smmuv3.smmu_per_bus */
+ QEMU_CAPS_ARM_SMMUV3_ACCEL, /* arm-smmuv3.accel */
QEMU_CAPS_LAST /* this must always be the last item */
} virQEMUCapsFlags;
diff --git a/tests/qemucapabilitiesdata/caps_11.0.0_aarch64.xml b/tests/qemucapabilitiesdata/caps_11.0.0_aarch64.xml
index 2280800fca..ca6def23dc 100644
--- a/tests/qemucapabilitiesdata/caps_11.0.0_aarch64.xml
+++ b/tests/qemucapabilitiesdata/caps_11.0.0_aarch64.xml
@@ -190,6 +190,7 @@
<flag name='blockdev-mirror.target-is-zero'/>
<flag name='arm-smmuv3'/>
<flag name='arm-smmuv3.smmu_per_bus'/>
+ <flag name='arm-smmuv3.accel'/>
<version>11000000</version>
<microcodeVersion>61700286</microcodeVersion>
<package>v11.0.0</package>
diff --git a/tests/qemucapabilitiesdata/caps_11.1.0_aarch64.xml b/tests/qemucapabilitiesdata/caps_11.1.0_aarch64.xml
index b4200f35bb..306f2981c1 100644
--- a/tests/qemucapabilitiesdata/caps_11.1.0_aarch64.xml
+++ b/tests/qemucapabilitiesdata/caps_11.1.0_aarch64.xml
@@ -190,6 +190,7 @@
<flag name='blockdev-mirror.target-is-zero'/>
<flag name='arm-smmuv3'/>
<flag name='arm-smmuv3.smmu_per_bus'/>
+ <flag name='arm-smmuv3.accel'/>
<version>11000050</version>
<microcodeVersion>61700287</microcodeVersion>
<package>v11.0.0-1600-g5611a9268d</package>
--
2.55.0

2225
centos-10/SOURCES/libvirt-qemu-introduce-QEMU_CAPS_ARM_SMMUV3_SMMU_PER_BUS.patch

File diff suppressed because it is too large

152
centos-10/SOURCES/libvirt-qemu-introduce-QEMU_CAPS_DEVICE_ARM_SMMUV3.patch

@ -0,0 +1,152 @@
From 59f9683dd189584af437b03fec40006c03be581e Mon Sep 17 00:00:00 2001
Message-ID: <59f9683dd189584af437b03fec40006c03be581e.1786713643.git.jdenemar@redhat.com>
From: Nathan Chen <nathanc@nvidia.com>
Date: Wed, 5 Aug 2026 15:12:57 -0700
Subject: [PATCH] qemu: introduce QEMU_CAPS_DEVICE_ARM_SMMUV3
The arm-smmuv3 QOM type is reported by qom-list-types on ARM QEMU.
Register it as QEMU_CAPS_DEVICE_ARM_SMMUV3 so later device-list-properties
probing for arm-smmuv3 properties can be gated on this capability
instead of an architecture check.
Reviewed-by: Pavel Hrdina <phrdina@redhat.com>
Signed-off-by: Nathan Chen <nathanc@nvidia.com>
(cherry picked from commit 93e0d7845585fd42fc770991e5eb9f365c96d6bb)
Conflicts:
src/qemu/qemu_capabilities.c
src/qemu/qemu_capabilities.h
tests/qemucapabilitiesdata/caps_11.1.0_aarch64.xml
- missing upstream commit 248981ff51116e06d3b7be7dbd33559a45261e24
Resolves: https://redhat.atlassian.net/browse/RHEL-138901
---
src/qemu/qemu_capabilities.c | 2 ++
src/qemu/qemu_capabilities.h | 1 +
tests/qemucapabilitiesdata/caps_10.0.0_aarch64.xml | 1 +
tests/qemucapabilitiesdata/caps_10.2.0_aarch64.xml | 1 +
tests/qemucapabilitiesdata/caps_11.0.0_aarch64.xml | 1 +
tests/qemucapabilitiesdata/caps_11.1.0_aarch64.xml | 1 +
tests/qemucapabilitiesdata/caps_8.2.0_aarch64.xml | 1 +
tests/qemucapabilitiesdata/caps_8.2.0_armv7l.xml | 1 +
tests/qemucapabilitiesdata/caps_9.2.0_aarch64+hvf.xml | 1 +
9 files changed, 10 insertions(+)
diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
index be57dcad8e..33efc6651b 100644
--- a/src/qemu/qemu_capabilities.c
+++ b/src/qemu/qemu_capabilities.c
@@ -767,6 +767,7 @@ VIR_ENUM_IMPL(virQEMUCaps,
/* 495 */
"blockdev-mirror.target-is-zero", /* QEMU_CAPS_BLOCKDEV_MIRROR_TARGET_IS_ZERO */
+ "arm-smmuv3", /* QEMU_CAPS_DEVICE_ARM_SMMUV3 */
);
@@ -1480,6 +1481,7 @@ struct virQEMUCapsStringFlags virQEMUCapsObjectTypes[] = {
{ "iommufd", QEMU_CAPS_OBJECT_IOMMUFD },
{ "uefi-vars-x64", QEMU_CAPS_DEVICE_UEFI_VARS },
{ "uefi-vars-sysbus", QEMU_CAPS_DEVICE_UEFI_VARS },
+ { "arm-smmuv3", QEMU_CAPS_DEVICE_ARM_SMMUV3 },
};
diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h
index 3014f3dc5e..e5d589b0c4 100644
--- a/src/qemu/qemu_capabilities.h
+++ b/src/qemu/qemu_capabilities.h
@@ -741,6 +741,7 @@ typedef enum { /* virQEMUCapsFlags grouping marker for syntax-check */
/* 495 */
QEMU_CAPS_BLOCKDEV_MIRROR_TARGET_IS_ZERO, /* 'blockdev-mirror' supports 'target-is-zero' */
+ QEMU_CAPS_DEVICE_ARM_SMMUV3, /* -device arm-smmuv3 */
QEMU_CAPS_LAST /* this must always be the last item */
} virQEMUCapsFlags;
diff --git a/tests/qemucapabilitiesdata/caps_10.0.0_aarch64.xml b/tests/qemucapabilitiesdata/caps_10.0.0_aarch64.xml
index b6434e6019..b2a0872853 100644
--- a/tests/qemucapabilitiesdata/caps_10.0.0_aarch64.xml
+++ b/tests/qemucapabilitiesdata/caps_10.0.0_aarch64.xml
@@ -166,6 +166,7 @@
<flag name='virtio-iommu.aw-bits'/>
<flag name='iommufd'/>
<flag name='uefi-vars'/>
+ <flag name='arm-smmuv3'/>
<version>10000000</version>
<microcodeVersion>61700285</microcodeVersion>
<package>v10.0.0</package>
diff --git a/tests/qemucapabilitiesdata/caps_10.2.0_aarch64.xml b/tests/qemucapabilitiesdata/caps_10.2.0_aarch64.xml
index df3e2a8275..449f2f65c7 100644
--- a/tests/qemucapabilitiesdata/caps_10.2.0_aarch64.xml
+++ b/tests/qemucapabilitiesdata/caps_10.2.0_aarch64.xml
@@ -186,6 +186,7 @@
<flag name='iommufd'/>
<flag name='uefi-vars'/>
<flag name='blockdev-mirror.target-is-zero'/>
+ <flag name='arm-smmuv3'/>
<version>10002000</version>
<microcodeVersion>61700287</microcodeVersion>
<package>v10.2.0</package>
diff --git a/tests/qemucapabilitiesdata/caps_11.0.0_aarch64.xml b/tests/qemucapabilitiesdata/caps_11.0.0_aarch64.xml
index 3fdc0d6621..b9acf8ac67 100644
--- a/tests/qemucapabilitiesdata/caps_11.0.0_aarch64.xml
+++ b/tests/qemucapabilitiesdata/caps_11.0.0_aarch64.xml
@@ -188,6 +188,7 @@
<flag name='uefi-vars'/>
<flag name='query-block-flat'/>
<flag name='blockdev-mirror.target-is-zero'/>
+ <flag name='arm-smmuv3'/>
<version>11000000</version>
<microcodeVersion>61700286</microcodeVersion>
<package>v11.0.0</package>
diff --git a/tests/qemucapabilitiesdata/caps_11.1.0_aarch64.xml b/tests/qemucapabilitiesdata/caps_11.1.0_aarch64.xml
index f7dd14a1ad..0595e5f88c 100644
--- a/tests/qemucapabilitiesdata/caps_11.1.0_aarch64.xml
+++ b/tests/qemucapabilitiesdata/caps_11.1.0_aarch64.xml
@@ -188,6 +188,7 @@
<flag name='uefi-vars'/>
<flag name='query-block-flat'/>
<flag name='blockdev-mirror.target-is-zero'/>
+ <flag name='arm-smmuv3'/>
<version>11000050</version>
<microcodeVersion>61700287</microcodeVersion>
<package>v11.0.0-1600-g5611a9268d</package>
diff --git a/tests/qemucapabilitiesdata/caps_8.2.0_aarch64.xml b/tests/qemucapabilitiesdata/caps_8.2.0_aarch64.xml
index bb70bcaf1f..e026abfd96 100644
--- a/tests/qemucapabilitiesdata/caps_8.2.0_aarch64.xml
+++ b/tests/qemucapabilitiesdata/caps_8.2.0_aarch64.xml
@@ -161,6 +161,7 @@
<flag name='nvme'/>
<flag name='nvme-ns'/>
<flag name='usb-bot'/>
+ <flag name='arm-smmuv3'/>
<version>8002000</version>
<microcodeVersion>61700246</microcodeVersion>
<package>v8.2.0</package>
diff --git a/tests/qemucapabilitiesdata/caps_8.2.0_armv7l.xml b/tests/qemucapabilitiesdata/caps_8.2.0_armv7l.xml
index 9590bc464a..d3af74bcb3 100644
--- a/tests/qemucapabilitiesdata/caps_8.2.0_armv7l.xml
+++ b/tests/qemucapabilitiesdata/caps_8.2.0_armv7l.xml
@@ -168,6 +168,7 @@
<flag name='nvme'/>
<flag name='nvme-ns'/>
<flag name='usb-bot'/>
+ <flag name='arm-smmuv3'/>
<version>8002000</version>
<microcodeVersion>0</microcodeVersion>
<package>qemu-8.2.0-7.fc39</package>
diff --git a/tests/qemucapabilitiesdata/caps_9.2.0_aarch64+hvf.xml b/tests/qemucapabilitiesdata/caps_9.2.0_aarch64+hvf.xml
index 9c843f9e5c..8c777c121e 100644
--- a/tests/qemucapabilitiesdata/caps_9.2.0_aarch64+hvf.xml
+++ b/tests/qemucapabilitiesdata/caps_9.2.0_aarch64+hvf.xml
@@ -136,6 +136,7 @@
<flag name='usb-bot'/>
<flag name='acpi-generic-initiator'/>
<flag name='virtio-iommu.aw-bits'/>
+ <flag name='arm-smmuv3'/>
<version>9002002</version>
<microcodeVersion>61700247</microcodeVersion>
<package></package>
--
2.55.0

112
centos-10/SOURCES/libvirt-qemu-monitor-Remove-support-for-watchdog-set-action.patch

@ -0,0 +1,112 @@
From a29e30928c9892e9a550af0b8d4df398606fc013 Mon Sep 17 00:00:00 2001
Message-ID: <a29e30928c9892e9a550af0b8d4df398606fc013.1787144196.git.jdenemar@redhat.com>
From: Peter Krempa <pkrempa@redhat.com>
Date: Mon, 20 Jul 2026 13:31:39 +0200
Subject: [PATCH] qemu: monitor: Remove support for 'watchdog-set-action'
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
We now use 'set-action' instead.
Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
(cherry picked from commit 8365c6679fa65b66b85da2773547515a40ae1a8f)
https://redhat.atlassian.net/browse/RHEL-242545
---
src/qemu/qemu_monitor.c | 12 ------------
src/qemu/qemu_monitor.h | 4 ----
src/qemu/qemu_monitor_json.c | 22 ----------------------
src/qemu/qemu_monitor_json.h | 5 -----
4 files changed, 43 deletions(-)
diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c
index baa78dd6fe..85e97562ad 100644
--- a/src/qemu/qemu_monitor.c
+++ b/src/qemu/qemu_monitor.c
@@ -3965,18 +3965,6 @@ qemuMonitorMemoryDeviceSizeChangeFree(qemuMonitorMemoryDeviceSizeChangePtr info)
}
-int
-qemuMonitorSetWatchdogAction(qemuMonitor *mon,
- const char *action)
-{
- VIR_DEBUG("watchdogAction=%s", action);
-
- QEMU_CHECK_MONITOR(mon);
-
- return qemuMonitorJSONSetWatchdogAction(mon, action);
-}
-
-
/**
* qemuMonitorBlockdevCreate:
* @mon: monitor object
diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h
index c2afb580e4..3298095e9c 100644
--- a/src/qemu/qemu_monitor.h
+++ b/src/qemu/qemu_monitor.h
@@ -1640,10 +1640,6 @@ qemuMonitorSetBlockThreshold(qemuMonitor *mon,
const char *nodename,
unsigned long long threshold);
-int
-qemuMonitorSetWatchdogAction(qemuMonitor *mon,
- const char *action);
-
int
qemuMonitorBlockdevCreate(qemuMonitor *mon,
const char *jobname,
diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c
index 28f7d93834..57e4b91874 100644
--- a/src/qemu/qemu_monitor_json.c
+++ b/src/qemu/qemu_monitor_json.c
@@ -7873,28 +7873,6 @@ qemuMonitorJSONSetBlockThreshold(qemuMonitor *mon,
}
-int
-qemuMonitorJSONSetWatchdogAction(qemuMonitor *mon,
- const char *action)
-{
- g_autoptr(virJSONValue) cmd = NULL;
- g_autoptr(virJSONValue) reply = NULL;
-
- if (!(cmd = qemuMonitorJSONMakeCommand("watchdog-set-action",
- "s:action", action,
- NULL)))
- return -1;
-
- if (qemuMonitorJSONCommand(mon, cmd, &reply) < 0)
- return -1;
-
- if (qemuMonitorJSONCheckError(cmd, reply) < 0)
- return -1;
-
- return 0;
-}
-
-
int
qemuMonitorJSONBlockdevCreate(qemuMonitor *mon,
const char *jobname,
diff --git a/src/qemu/qemu_monitor_json.h b/src/qemu/qemu_monitor_json.h
index f4c093d717..3b7b04a11d 100644
--- a/src/qemu/qemu_monitor_json.h
+++ b/src/qemu/qemu_monitor_json.h
@@ -633,11 +633,6 @@ qemuMonitorJSONSetBlockThreshold(qemuMonitor *mon,
unsigned long long threshold)
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
-int
-qemuMonitorJSONSetWatchdogAction(qemuMonitor *mon,
- const char *action)
- ATTRIBUTE_NONNULL(1);
-
int
qemuMonitorJSONBlockdevCreate(qemuMonitor *mon,
const char *jobname,
--
2.55.0

434
centos-10/SOURCES/libvirt-qemu-move-qemuAgent-InfoFormatParams-to-hypervisor-qemu_agent.c.patch

@ -0,0 +1,434 @@
From 49497c4111df88d3fc4a4f0c115cc7fa0d60a8ee Mon Sep 17 00:00:00 2001
Message-ID: <49497c4111df88d3fc4a4f0c115cc7fa0d60a8ee.1787144197.git.jdenemar@redhat.com>
From: Roman Bogorodskiy <bogorodskiy@gmail.com>
Date: Sat, 18 Jul 2026 12:58:33 +0200
Subject: [PATCH] qemu: move qemuAgent*InfoFormatParams to
hypervisor/qemu_agent.c
Move:
* qemuAgentDiskInfoFormatParams
* qemuAgentFSInfoFormatParams
* virDomainInterfaceFormatParams
from the qemu driver to hypervisor/qemu_agent.c so they could be reused
by the other drivers implementing virDomainGetGuestInfo() using the qemu
agent.
Also, rename virDomainInterfaceFormatParams() to
qemuAgentInterfaceFormatParams() to follow the common naming schema as
it's not really used outside of the qemu agent related code.
Signed-off-by: Roman Bogorodskiy <bogorodskiy@gmail.com>
Reviewed-by: Peter Krempa <pkrempa@redhat.com>
(cherry picked from commit c2b1b9f7454e2f23b8e1bdfc9005c9e4dcdbccb5)
Resolves: https://redhat.atlassian.net/browse/RHEL-235731
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
---
src/hypervisor/qemu_agent.c | 162 ++++++++++++++++++++++++++++++++++++
src/hypervisor/qemu_agent.h | 17 ++++
src/libvirt_private.syms | 3 +
src/qemu/qemu_driver.c | 162 +-----------------------------------
4 files changed, 183 insertions(+), 161 deletions(-)
diff --git a/src/hypervisor/qemu_agent.c b/src/hypervisor/qemu_agent.c
index e549947fbf..418386317d 100644
--- a/src/hypervisor/qemu_agent.c
+++ b/src/hypervisor/qemu_agent.c
@@ -2681,3 +2681,165 @@ qemuAgentFSInfoFormat(qemuAgentFSInfo **agentinfo,
}
return ret;
}
+
+
+void
+qemuAgentDiskInfoFormatParams(qemuAgentDiskInfo **info,
+ int ndisks,
+ virDomainDef *vmdef,
+ virTypedParamList *list)
+{
+ size_t i;
+
+ virTypedParamListAddUInt(list, ndisks, VIR_DOMAIN_GUEST_INFO_DISK_COUNT);
+
+ for (i = 0; i < ndisks; i++) {
+ virTypedParamListAddString(list, info[i]->name,
+ VIR_DOMAIN_GUEST_INFO_DISK_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_DISK_SUFFIX_NAME, i);
+ virTypedParamListAddBoolean(list, info[i]->partition,
+ VIR_DOMAIN_GUEST_INFO_DISK_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_DISK_SUFFIX_PARTITION, i);
+
+ if (info[i]->dependencies) {
+ size_t ndeps = g_strv_length(info[i]->dependencies);
+ size_t j;
+
+ if (ndeps > 0)
+ virTypedParamListAddUInt(list, ndeps,
+ VIR_DOMAIN_GUEST_INFO_DISK_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_DISK_SUFFIX_DEPENDENCY_COUNT, i);
+
+ for (j = 0; j < ndeps; j++) {
+ virTypedParamListAddString(list, info[i]->dependencies[j],
+ VIR_DOMAIN_GUEST_INFO_DISK_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_DISK_SUFFIX_DEPENDENCY_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_DISK_SUFFIX_DEPENDENCY_SUFFIX_NAME, i, j);
+ }
+ }
+
+ if (info[i]->address) {
+ qemuAgentDiskAddress *address = info[i]->address;
+ virDomainDiskDef *diskdef = NULL;
+
+ if (address->serial)
+ virTypedParamListAddString(list, address->serial,
+ VIR_DOMAIN_GUEST_INFO_DISK_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_DISK_SUFFIX_SERIAL, i);
+
+ /* match the disk to the target in the vm definition */
+ diskdef = virDomainDiskByAddress(vmdef,
+ &address->pci_controller,
+ address->ccw_addr,
+ address->bus,
+ address->target,
+ address->unit);
+
+ if (diskdef && diskdef->dst)
+ virTypedParamListAddString(list, diskdef->dst,
+ VIR_DOMAIN_GUEST_INFO_DISK_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_DISK_SUFFIX_ALIAS, i);
+
+ if (address->bus_type)
+ virTypedParamListAddString(list, address->bus_type,
+ VIR_DOMAIN_GUEST_INFO_DISK_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_DISK_SUFFIX_GUEST_BUS, i);
+ }
+
+ if (info[i]->alias)
+ virTypedParamListAddString(list, info[i]->alias,
+ VIR_DOMAIN_GUEST_INFO_DISK_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_DISK_SUFFIX_GUEST_ALIAS, i);
+ }
+}
+
+
+void
+qemuAgentFSInfoFormatParams(qemuAgentFSInfo **fsinfo,
+ int nfs,
+ virDomainDef *vmdef,
+ virTypedParamList *list)
+{
+ size_t i;
+
+ virTypedParamListAddUInt(list, nfs, VIR_DOMAIN_GUEST_INFO_FS_COUNT);
+
+ for (i = 0; i < nfs; i++) {
+ size_t j;
+
+ virTypedParamListAddString(list, fsinfo[i]->name,
+ VIR_DOMAIN_GUEST_INFO_FS_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_FS_SUFFIX_NAME, i);
+ virTypedParamListAddString(list, fsinfo[i]->mountpoint,
+ VIR_DOMAIN_GUEST_INFO_FS_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_FS_SUFFIX_MOUNTPOINT, i);
+ virTypedParamListAddString(list, fsinfo[i]->fstype,
+ VIR_DOMAIN_GUEST_INFO_FS_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_FS_SUFFIX_FSTYPE, i);
+
+ /* disk usage values are not returned by older guest agents, so
+ * only add the params if the value is set */
+ if (fsinfo[i]->total_bytes != -1)
+ virTypedParamListAddULLong(list, fsinfo[i]->total_bytes,
+ VIR_DOMAIN_GUEST_INFO_FS_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_FS_SUFFIX_TOTAL_BYTES, i);
+ if (fsinfo[i]->used_bytes != -1)
+ virTypedParamListAddULLong(list, fsinfo[i]->used_bytes,
+ VIR_DOMAIN_GUEST_INFO_FS_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_FS_SUFFIX_USED_BYTES, i);
+
+ virTypedParamListAddUInt(list, fsinfo[i]->ndisks,
+ VIR_DOMAIN_GUEST_INFO_FS_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_FS_SUFFIX_DISK_COUNT, i);
+
+ for (j = 0; j < fsinfo[i]->ndisks; j++) {
+ virDomainDiskDef *diskdef = NULL;
+ qemuAgentDiskAddress *d = fsinfo[i]->disks[j];
+
+ /* match the disk to the target in the vm definition */
+ diskdef = virDomainDiskByAddress(vmdef,
+ &d->pci_controller,
+ d->ccw_addr,
+ d->bus,
+ d->target,
+ d->unit);
+ if (diskdef && diskdef->dst)
+ virTypedParamListAddString(list, diskdef->dst,
+ VIR_DOMAIN_GUEST_INFO_FS_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_FS_SUFFIX_DISK_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_FS_SUFFIX_DISK_SUFFIX_ALIAS, i, j);
+
+ if (d->serial)
+ virTypedParamListAddString(list, d->serial,
+ VIR_DOMAIN_GUEST_INFO_FS_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_FS_SUFFIX_DISK_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_FS_SUFFIX_DISK_SUFFIX_SERIAL, i, j);
+
+ if (d->devnode)
+ virTypedParamListAddString(list, d->devnode,
+ VIR_DOMAIN_GUEST_INFO_FS_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_FS_SUFFIX_DISK_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_FS_SUFFIX_DISK_SUFFIX_DEVICE, i, j);
+ }
+ }
+}
+
+
+void
+qemuAgentInterfaceFormatParams(virDomainInterfacePtr *ifaces,
+ int nifaces,
+ virTypedParamList *list)
+{
+ size_t i;
+
+ virTypedParamListAddUInt(list, nifaces, VIR_DOMAIN_GUEST_INFO_IF_COUNT);
+
+ for (i = 0; i < nifaces; i++) {
+ size_t j;
+
+ virTypedParamListAddString(list, ifaces[i]->name,
+ VIR_DOMAIN_GUEST_INFO_IF_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_IF_SUFFIX_NAME, i);
+ virTypedParamListAddString(list, ifaces[i]->hwaddr,
+ VIR_DOMAIN_GUEST_INFO_IF_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_IF_SUFFIX_HWADDR, i);
+ virTypedParamListAddUInt(list, ifaces[i]->naddrs,
+ VIR_DOMAIN_GUEST_INFO_IF_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_IF_SUFFIX_ADDR_COUNT, i);
+
+ for (j = 0; j < ifaces[i]->naddrs; j++) {
+ switch (ifaces[i]->addrs[j].type) {
+ case VIR_IP_ADDR_TYPE_IPV4:
+ virTypedParamListAddString(list, "ipv4",
+ VIR_DOMAIN_GUEST_INFO_IF_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_IF_SUFFIX_ADDR_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_IF_SUFFIX_ADDR_SUFFIX_TYPE, i, j);
+ break;
+
+ case VIR_IP_ADDR_TYPE_IPV6:
+ virTypedParamListAddString(list, "ipv6",
+ VIR_DOMAIN_GUEST_INFO_IF_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_IF_SUFFIX_ADDR_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_IF_SUFFIX_ADDR_SUFFIX_TYPE, i, j);
+ break;
+ }
+
+ virTypedParamListAddString(list, ifaces[i]->addrs[j].addr,
+ VIR_DOMAIN_GUEST_INFO_IF_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_IF_SUFFIX_ADDR_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_IF_SUFFIX_ADDR_SUFFIX_ADDR, i, j);
+ virTypedParamListAddUInt(list, ifaces[i]->addrs[j].prefix,
+ VIR_DOMAIN_GUEST_INFO_IF_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_IF_SUFFIX_ADDR_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_IF_SUFFIX_ADDR_SUFFIX_PREFIX, i, j);
+ }
+ }
+}
diff --git a/src/hypervisor/qemu_agent.h b/src/hypervisor/qemu_agent.h
index 3dbc3baec1..def6f983d4 100644
--- a/src/hypervisor/qemu_agent.h
+++ b/src/hypervisor/qemu_agent.h
@@ -201,3 +201,20 @@ int qemuAgentFSInfoFormat(qemuAgentFSInfo **agentinfo,
int nagentinfo,
virDomainDef *vmdef,
virDomainFSInfoPtr **info);
+
+void
+qemuAgentDiskInfoFormatParams(qemuAgentDiskInfo **info,
+ int ndisks,
+ virDomainDef *vmdef,
+ virTypedParamList *list);
+
+void
+qemuAgentFSInfoFormatParams(qemuAgentFSInfo **fsinfo,
+ int nfs,
+ virDomainDef *vmdef,
+ virTypedParamList *list);
+
+void
+qemuAgentInterfaceFormatParams(virDomainInterfacePtr *ifaces,
+ int nifaces,
+ virTypedParamList *list);
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index c76e5cb08a..02bd505749 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -1716,9 +1716,11 @@ virDomainInterfaceVportRemove;
# hypervisor/qemu_agent.h
qemuAgentArbitraryCommand;
qemuAgentClose;
+qemuAgentDiskInfoFormatParams;
qemuAgentDiskInfoFree;
qemuAgentFSFreeze;
qemuAgentFSInfoFormat;
+qemuAgentFSInfoFormatParams;
qemuAgentFSInfoFree;
qemuAgentFSThaw;
qemuAgentFSTrim;
@@ -1732,6 +1734,7 @@ qemuAgentGetTime;
qemuAgentGetTimezone;
qemuAgentGetUsers;
qemuAgentGetVCPUs;
+qemuAgentInterfaceFormatParams;
qemuAgentNotifyClose;
qemuAgentNotifyEvent;
qemuAgentOpen;
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index b90a7b07d4..c7892161e3 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -20014,166 +20014,6 @@ qemuDomainGetGuestInfoCheckSupport(unsigned int types,
}
-static void
-qemuAgentDiskInfoFormatParams(qemuAgentDiskInfo **info,
- int ndisks,
- virDomainDef *vmdef,
- virTypedParamList *list)
-{
- size_t i;
-
- virTypedParamListAddUInt(list, ndisks, VIR_DOMAIN_GUEST_INFO_DISK_COUNT);
-
- for (i = 0; i < ndisks; i++) {
- virTypedParamListAddString(list, info[i]->name,
- VIR_DOMAIN_GUEST_INFO_DISK_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_DISK_SUFFIX_NAME, i);
- virTypedParamListAddBoolean(list, info[i]->partition,
- VIR_DOMAIN_GUEST_INFO_DISK_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_DISK_SUFFIX_PARTITION, i);
-
- if (info[i]->dependencies) {
- size_t ndeps = g_strv_length(info[i]->dependencies);
- size_t j;
-
- if (ndeps > 0)
- virTypedParamListAddUInt(list, ndeps,
- VIR_DOMAIN_GUEST_INFO_DISK_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_DISK_SUFFIX_DEPENDENCY_COUNT, i);
-
- for (j = 0; j < ndeps; j++) {
- virTypedParamListAddString(list, info[i]->dependencies[j],
- VIR_DOMAIN_GUEST_INFO_DISK_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_DISK_SUFFIX_DEPENDENCY_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_DISK_SUFFIX_DEPENDENCY_SUFFIX_NAME, i, j);
- }
- }
-
- if (info[i]->address) {
- qemuAgentDiskAddress *address = info[i]->address;
- virDomainDiskDef *diskdef = NULL;
-
- if (address->serial)
- virTypedParamListAddString(list, address->serial,
- VIR_DOMAIN_GUEST_INFO_DISK_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_DISK_SUFFIX_SERIAL, i);
-
- /* match the disk to the target in the vm definition */
- diskdef = virDomainDiskByAddress(vmdef,
- &address->pci_controller,
- address->ccw_addr,
- address->bus,
- address->target,
- address->unit);
-
- if (diskdef && diskdef->dst)
- virTypedParamListAddString(list, diskdef->dst,
- VIR_DOMAIN_GUEST_INFO_DISK_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_DISK_SUFFIX_ALIAS, i);
-
- if (address->bus_type)
- virTypedParamListAddString(list, address->bus_type,
- VIR_DOMAIN_GUEST_INFO_DISK_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_DISK_SUFFIX_GUEST_BUS, i);
- }
-
- if (info[i]->alias)
- virTypedParamListAddString(list, info[i]->alias,
- VIR_DOMAIN_GUEST_INFO_DISK_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_DISK_SUFFIX_GUEST_ALIAS, i);
- }
-}
-
-
-static void
-qemuAgentFSInfoFormatParams(qemuAgentFSInfo **fsinfo,
- int nfs,
- virDomainDef *vmdef,
- virTypedParamList *list)
-{
- size_t i;
-
- virTypedParamListAddUInt(list, nfs, VIR_DOMAIN_GUEST_INFO_FS_COUNT);
-
- for (i = 0; i < nfs; i++) {
- size_t j;
-
- virTypedParamListAddString(list, fsinfo[i]->name,
- VIR_DOMAIN_GUEST_INFO_FS_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_FS_SUFFIX_NAME, i);
- virTypedParamListAddString(list, fsinfo[i]->mountpoint,
- VIR_DOMAIN_GUEST_INFO_FS_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_FS_SUFFIX_MOUNTPOINT, i);
- virTypedParamListAddString(list, fsinfo[i]->fstype,
- VIR_DOMAIN_GUEST_INFO_FS_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_FS_SUFFIX_FSTYPE, i);
-
- /* disk usage values are not returned by older guest agents, so
- * only add the params if the value is set */
- if (fsinfo[i]->total_bytes != -1)
- virTypedParamListAddULLong(list, fsinfo[i]->total_bytes,
- VIR_DOMAIN_GUEST_INFO_FS_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_FS_SUFFIX_TOTAL_BYTES, i);
- if (fsinfo[i]->used_bytes != -1)
- virTypedParamListAddULLong(list, fsinfo[i]->used_bytes,
- VIR_DOMAIN_GUEST_INFO_FS_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_FS_SUFFIX_USED_BYTES, i);
-
- virTypedParamListAddUInt(list, fsinfo[i]->ndisks,
- VIR_DOMAIN_GUEST_INFO_FS_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_FS_SUFFIX_DISK_COUNT, i);
-
- for (j = 0; j < fsinfo[i]->ndisks; j++) {
- virDomainDiskDef *diskdef = NULL;
- qemuAgentDiskAddress *d = fsinfo[i]->disks[j];
-
- /* match the disk to the target in the vm definition */
- diskdef = virDomainDiskByAddress(vmdef,
- &d->pci_controller,
- d->ccw_addr,
- d->bus,
- d->target,
- d->unit);
- if (diskdef && diskdef->dst)
- virTypedParamListAddString(list, diskdef->dst,
- VIR_DOMAIN_GUEST_INFO_FS_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_FS_SUFFIX_DISK_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_FS_SUFFIX_DISK_SUFFIX_ALIAS, i, j);
-
- if (d->serial)
- virTypedParamListAddString(list, d->serial,
- VIR_DOMAIN_GUEST_INFO_FS_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_FS_SUFFIX_DISK_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_FS_SUFFIX_DISK_SUFFIX_SERIAL, i, j);
-
- if (d->devnode)
- virTypedParamListAddString(list, d->devnode,
- VIR_DOMAIN_GUEST_INFO_FS_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_FS_SUFFIX_DISK_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_FS_SUFFIX_DISK_SUFFIX_DEVICE, i, j);
- }
- }
-}
-
-static void
-virDomainInterfaceFormatParams(virDomainInterfacePtr *ifaces,
- int nifaces,
- virTypedParamList *list)
-{
- size_t i;
-
- virTypedParamListAddUInt(list, nifaces, VIR_DOMAIN_GUEST_INFO_IF_COUNT);
-
- for (i = 0; i < nifaces; i++) {
- size_t j;
-
- virTypedParamListAddString(list, ifaces[i]->name,
- VIR_DOMAIN_GUEST_INFO_IF_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_IF_SUFFIX_NAME, i);
- virTypedParamListAddString(list, ifaces[i]->hwaddr,
- VIR_DOMAIN_GUEST_INFO_IF_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_IF_SUFFIX_HWADDR, i);
- virTypedParamListAddUInt(list, ifaces[i]->naddrs,
- VIR_DOMAIN_GUEST_INFO_IF_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_IF_SUFFIX_ADDR_COUNT, i);
-
- for (j = 0; j < ifaces[i]->naddrs; j++) {
- switch (ifaces[i]->addrs[j].type) {
- case VIR_IP_ADDR_TYPE_IPV4:
- virTypedParamListAddString(list, "ipv4",
- VIR_DOMAIN_GUEST_INFO_IF_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_IF_SUFFIX_ADDR_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_IF_SUFFIX_ADDR_SUFFIX_TYPE, i, j);
- break;
-
- case VIR_IP_ADDR_TYPE_IPV6:
- virTypedParamListAddString(list, "ipv6",
- VIR_DOMAIN_GUEST_INFO_IF_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_IF_SUFFIX_ADDR_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_IF_SUFFIX_ADDR_SUFFIX_TYPE, i, j);
- break;
- }
-
- virTypedParamListAddString(list, ifaces[i]->addrs[j].addr,
- VIR_DOMAIN_GUEST_INFO_IF_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_IF_SUFFIX_ADDR_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_IF_SUFFIX_ADDR_SUFFIX_ADDR, i, j);
- virTypedParamListAddUInt(list, ifaces[i]->addrs[j].prefix,
- VIR_DOMAIN_GUEST_INFO_IF_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_IF_SUFFIX_ADDR_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_IF_SUFFIX_ADDR_SUFFIX_PREFIX, i, j);
- }
- }
-}
-
static int
qemuDomainGetGuestInfo(virDomainPtr dom,
unsigned int types,
@@ -20300,7 +20140,7 @@ qemuDomainGetGuestInfo(virDomainPtr dom,
}
if (nifaces > 0) {
- virDomainInterfaceFormatParams(ifaces, nifaces, list);
+ qemuAgentInterfaceFormatParams(ifaces, nifaces, list);
}
if (format_load) {
--
2.55.0

127
centos-10/SOURCES/libvirt-qemu-processGuestPanicEvent-Split-individual-steps-under-separate-conditions.patch

@ -0,0 +1,127 @@
From ce57f5151847c8152673ebeafc7a39039c3d85d2 Mon Sep 17 00:00:00 2001
Message-ID: <ce57f5151847c8152673ebeafc7a39039c3d85d2.1787144197.git.jdenemar@redhat.com>
From: Peter Krempa <pkrempa@redhat.com>
Date: Tue, 21 Jul 2026 15:08:01 +0200
Subject: [PATCH] qemu: processGuestPanicEvent: Split individual steps under
separate conditions
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Separate the individual steps (setting of VM state, dumping, unlocking,
final state transition) under individual switch statements for future
extension.
Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
(cherry picked from commit ce97710da27fa005841c5f38baa2edcdc82f5d30)
https://redhat.atlassian.net/browse/RHEL-242545
---
src/qemu/qemu_driver.c | 66 ++++++++++++++++++++++++++++++------------
1 file changed, 48 insertions(+), 18 deletions(-)
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 391394485e..c6ef5684b5 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -3627,26 +3627,64 @@ processGuestPanicEvent(virQEMUDriver *driver,
qemuDomainLogAppendMessage(driver, vm, "%s: panic %s\n", timestamp, msg);
}
- virDomainObjSetState(vm, VIR_DOMAIN_CRASHED, VIR_DOMAIN_CRASHED_PANICKED);
-
event = virDomainEventLifecycleNewFromObj(vm,
VIR_DOMAIN_EVENT_CRASHED,
VIR_DOMAIN_EVENT_CRASHED_PANICKED);
-
virObjectEventStateQueue(driver->domainEventState, event);
- qemuDomainSaveStatus(vm);
-
- if (virDomainLockProcessPause(driver->lockManager, vm, &priv->lockState) < 0)
- VIR_WARN("Unable to release lease on %s", vm->def->name);
- VIR_DEBUG("Preserving lock state '%s'", NULLSTR(priv->lockState));
-
+ /* Update VM state */
switch (vm->def->onCrash) {
case VIR_DOMAIN_LIFECYCLE_ACTION_COREDUMP_DESTROY:
+ case VIR_DOMAIN_LIFECYCLE_ACTION_DESTROY:
+ case VIR_DOMAIN_LIFECYCLE_ACTION_COREDUMP_RESTART:
+ case VIR_DOMAIN_LIFECYCLE_ACTION_RESTART:
+ case VIR_DOMAIN_LIFECYCLE_ACTION_PRESERVE:
+ case VIR_DOMAIN_LIFECYCLE_ACTION_RESTART_RENAME:
+ virDomainObjSetState(vm, VIR_DOMAIN_CRASHED, VIR_DOMAIN_CRASHED_PANICKED);
+ qemuDomainSaveStatus(vm);
+ break;
+
+ case VIR_DOMAIN_LIFECYCLE_ACTION_LAST:
+ break;
+ }
+
+ /* Handle state of leases/locks */
+ switch (vm->def->onCrash) {
+ case VIR_DOMAIN_LIFECYCLE_ACTION_COREDUMP_DESTROY:
+ case VIR_DOMAIN_LIFECYCLE_ACTION_DESTROY:
+ case VIR_DOMAIN_LIFECYCLE_ACTION_COREDUMP_RESTART:
+ case VIR_DOMAIN_LIFECYCLE_ACTION_RESTART:
+ case VIR_DOMAIN_LIFECYCLE_ACTION_PRESERVE:
+ case VIR_DOMAIN_LIFECYCLE_ACTION_RESTART_RENAME:
+ if (virDomainLockProcessPause(driver->lockManager, vm, &priv->lockState) < 0)
+ VIR_WARN("Unable to release lease on %s", vm->def->name);
+ VIR_DEBUG("Preserving lock state '%s'", NULLSTR(priv->lockState));
+ break;
+
+ case VIR_DOMAIN_LIFECYCLE_ACTION_LAST:
+ break;
+ }
+
+ /* create core dump */
+ switch (vm->def->onCrash) {
+ case VIR_DOMAIN_LIFECYCLE_ACTION_COREDUMP_DESTROY:
+ case VIR_DOMAIN_LIFECYCLE_ACTION_COREDUMP_RESTART:
if (doCoreDumpToAutoDumpPath(driver, vm, flags) < 0)
goto endjob;
- G_GNUC_FALLTHROUGH;
+ break;
+
+ case VIR_DOMAIN_LIFECYCLE_ACTION_DESTROY:
+ case VIR_DOMAIN_LIFECYCLE_ACTION_RESTART:
+ case VIR_DOMAIN_LIFECYCLE_ACTION_PRESERVE:
+ case VIR_DOMAIN_LIFECYCLE_ACTION_RESTART_RENAME:
+ case VIR_DOMAIN_LIFECYCLE_ACTION_LAST:
+ break;
+ }
+
+ /* final state update */
+ switch (vm->def->onCrash) {
+ case VIR_DOMAIN_LIFECYCLE_ACTION_COREDUMP_DESTROY:
case VIR_DOMAIN_LIFECYCLE_ACTION_DESTROY:
qemuProcessStop(vm, VIR_DOMAIN_SHUTOFF_CRASHED, VIR_ASYNC_JOB_DUMP, 0);
event = virDomainEventLifecycleNewFromObj(vm,
@@ -3659,22 +3697,14 @@ processGuestPanicEvent(virQEMUDriver *driver,
break;
case VIR_DOMAIN_LIFECYCLE_ACTION_COREDUMP_RESTART:
- if (doCoreDumpToAutoDumpPath(driver, vm, flags) < 0)
- goto endjob;
- G_GNUC_FALLTHROUGH;
-
case VIR_DOMAIN_LIFECYCLE_ACTION_RESTART:
qemuDomainSetFakeReboot(vm, true);
ignore_value(qemuProcessShutdownOrReboot(vm));
break;
case VIR_DOMAIN_LIFECYCLE_ACTION_PRESERVE:
- /* the VM is kept around for debugging */
- break;
-
case VIR_DOMAIN_LIFECYCLE_ACTION_RESTART_RENAME:
case VIR_DOMAIN_LIFECYCLE_ACTION_LAST:
- default:
break;
}
--
2.55.0

103
centos-10/SOURCES/libvirt-qemuDomainModifyLifecycleActionLive-Prepare-to-handle-other-actions.patch

@ -0,0 +1,103 @@
From 68aef452471aa40f8f09730fe1aca9b7d4fdcdbb Mon Sep 17 00:00:00 2001
Message-ID: <68aef452471aa40f8f09730fe1aca9b7d4fdcdbb.1787144197.git.jdenemar@redhat.com>
From: Peter Krempa <pkrempa@redhat.com>
Date: Wed, 22 Jul 2026 17:05:00 +0200
Subject: [PATCH] qemuDomainModifyLifecycleActionLive: Prepare to handle other
actions
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Rework the code so that it'll be possible to easily extend it to set
other lifecycle actions in qemu.
Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
(cherry picked from commit 79b6d701c7719fbe5e5db8531ff6460edfbed171)
https://redhat.atlassian.net/browse/RHEL-242545
---
src/qemu/qemu_driver.c | 55 ++++++++++++++++++++++++------------------
1 file changed, 32 insertions(+), 23 deletions(-)
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index b3b853b4c8..269694fac5 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -19547,42 +19547,51 @@ qemuDomainModifyLifecycleActionLive(virDomainObj *vm,
virDomainLifecycle type,
virDomainLifecycleAction action)
{
- qemuMonitorActionReboot monReboot = QEMU_MONITOR_ACTION_REBOOT_KEEP;
+ qemuMonitorActionShutdown shutdown = QEMU_MONITOR_ACTION_SHUTDOWN_KEEP;
+ qemuMonitorActionReboot reboot = QEMU_MONITOR_ACTION_REBOOT_KEEP;
+ qemuMonitorActionWatchdog watchdog = QEMU_MONITOR_ACTION_WATCHDOG_KEEP;
+ qemuMonitorActionPanic panic = QEMU_MONITOR_ACTION_PANIC_KEEP;
qemuDomainObjPrivate *priv = vm->privateData;
int rc;
- /* For now we only update 'reboot' action here as we want to keep the
- * shutdown action as is (we're emulating the outcome anyways)) */
- if (type != VIR_DOMAIN_LIFECYCLE_REBOOT ||
- vm->def->onReboot == action)
- return 0;
+ switch (type) {
+ case VIR_DOMAIN_LIFECYCLE_REBOOT:
+ if (vm->def->onReboot == action)
+ break;
+ switch (action) {
+ case VIR_DOMAIN_LIFECYCLE_ACTION_DESTROY:
+ reboot = QEMU_MONITOR_ACTION_REBOOT_SHUTDOWN;
+ break;
- switch (action) {
- case VIR_DOMAIN_LIFECYCLE_ACTION_DESTROY:
- monReboot = QEMU_MONITOR_ACTION_REBOOT_SHUTDOWN;
+ case VIR_DOMAIN_LIFECYCLE_ACTION_RESTART:
+ reboot = QEMU_MONITOR_ACTION_REBOOT_RESET;
+ break;
+
+ case VIR_DOMAIN_LIFECYCLE_ACTION_PRESERVE:
+ case VIR_DOMAIN_LIFECYCLE_ACTION_RESTART_RENAME:
+ case VIR_DOMAIN_LIFECYCLE_ACTION_COREDUMP_DESTROY:
+ case VIR_DOMAIN_LIFECYCLE_ACTION_COREDUMP_RESTART:
+ case VIR_DOMAIN_LIFECYCLE_ACTION_LAST:
+ break;
+ }
break;
- case VIR_DOMAIN_LIFECYCLE_ACTION_RESTART:
- monReboot = QEMU_MONITOR_ACTION_REBOOT_RESET;
+ case VIR_DOMAIN_LIFECYCLE_POWEROFF:
+ case VIR_DOMAIN_LIFECYCLE_CRASH:
+ case VIR_DOMAIN_LIFECYCLE_LAST:
break;
-
- case VIR_DOMAIN_LIFECYCLE_ACTION_PRESERVE:
- case VIR_DOMAIN_LIFECYCLE_ACTION_RESTART_RENAME:
- case VIR_DOMAIN_LIFECYCLE_ACTION_COREDUMP_DESTROY:
- case VIR_DOMAIN_LIFECYCLE_ACTION_COREDUMP_RESTART:
- case VIR_DOMAIN_LIFECYCLE_ACTION_LAST:
- return 0;
}
+ if (shutdown == QEMU_MONITOR_ACTION_SHUTDOWN_KEEP &&
+ reboot == QEMU_MONITOR_ACTION_REBOOT_KEEP &&
+ watchdog == QEMU_MONITOR_ACTION_WATCHDOG_KEEP &&
+ panic == QEMU_MONITOR_ACTION_PANIC_KEEP)
+ return 0;
qemuDomainObjEnterMonitor(vm);
- rc = qemuMonitorSetAction(priv->mon,
- QEMU_MONITOR_ACTION_SHUTDOWN_KEEP,
- monReboot,
- QEMU_MONITOR_ACTION_WATCHDOG_KEEP,
- QEMU_MONITOR_ACTION_PANIC_KEEP);
+ rc = qemuMonitorSetAction(priv->mon, shutdown, reboot, watchdog, panic);
qemuDomainObjExitMonitor(vm);
if (rc < 0)
--
2.55.0

88
centos-10/SOURCES/libvirt-qemuMonitorGuestPanicEventInfoFormatMsg-Directly-return-message.patch

@ -0,0 +1,88 @@
From 434a60c4f126958b0969f0523bf580311af2a786 Mon Sep 17 00:00:00 2001
Message-ID: <434a60c4f126958b0969f0523bf580311af2a786.1787144197.git.jdenemar@redhat.com>
From: Peter Krempa <pkrempa@redhat.com>
Date: Tue, 21 Jul 2026 14:54:50 +0200
Subject: [PATCH] qemuMonitorGuestPanicEventInfoFormatMsg: Directly return
message
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Remove the 'ret' variable and format the panic string on a single line.
Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
(cherry picked from commit 3f41645e3d8bf7b589de58d2d5052123a4d6fe9c)
https://redhat.atlassian.net/browse/RHEL-242545
---
src/qemu/qemu_monitor.c | 40 +++++++++++++++++-----------------------
1 file changed, 17 insertions(+), 23 deletions(-)
diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c
index 85e97562ad..13a6b1ed98 100644
--- a/src/qemu/qemu_monitor.c
+++ b/src/qemu/qemu_monitor.c
@@ -3881,43 +3881,37 @@ qemuMonitorSetBlockThreshold(qemuMonitor *mon,
char *
qemuMonitorGuestPanicEventInfoFormatMsg(qemuMonitorEventPanicInfo *info)
{
- char *ret = NULL;
-
switch (info->type) {
case QEMU_MONITOR_EVENT_PANIC_INFO_TYPE_HYPERV:
- ret = g_strdup_printf("hyper-v: arg1='0x%llx', arg2='0x%llx', "
- "arg3='0x%llx', arg4='0x%llx', arg5='0x%llx'",
- info->data.hyperv.arg1, info->data.hyperv.arg2,
- info->data.hyperv.arg3, info->data.hyperv.arg4,
- info->data.hyperv.arg5);
+ return g_strdup_printf("hyper-v: arg1='0x%llx', arg2='0x%llx', arg3='0x%llx', arg4='0x%llx', arg5='0x%llx'",
+ info->data.hyperv.arg1, info->data.hyperv.arg2,
+ info->data.hyperv.arg3, info->data.hyperv.arg4,
+ info->data.hyperv.arg5);
break;
case QEMU_MONITOR_EVENT_PANIC_INFO_TYPE_S390:
- ret = g_strdup_printf("s390: core='%d' psw-mask='0x%016llx' "
- "psw-addr='0x%016llx' reason='%s'",
- info->data.s390.core,
- info->data.s390.psw_mask,
- info->data.s390.psw_addr,
- info->data.s390.reason);
+ return g_strdup_printf("s390: core='%d' psw-mask='0x%016llx' psw-addr='0x%016llx' reason='%s'",
+ info->data.s390.core,
+ info->data.s390.psw_mask,
+ info->data.s390.psw_addr,
+ info->data.s390.reason);
break;
case QEMU_MONITOR_EVENT_PANIC_INFO_TYPE_TDX:
if (info->data.tdx.has_gpa)
- ret = g_strdup_printf("tdx: error_code='0x%x' message='%s' "
- "additional error information can be found "
- "at gpa page: '0x%016llx'",
- info->data.tdx.error_code,
- info->data.tdx.message,
- info->data.tdx.gpa);
+ return g_strdup_printf("tdx: error_code='0x%x' message='%s' additional error information can be found at gpa page: '0x%016llx'",
+ info->data.tdx.error_code,
+ info->data.tdx.message,
+ info->data.tdx.gpa);
else
- ret = g_strdup_printf("tdx: error_code='0x%x' message='%s'",
- info->data.tdx.error_code,
- info->data.tdx.message);
+ return g_strdup_printf("tdx: error_code='0x%x' message='%s'",
+ info->data.tdx.error_code,
+ info->data.tdx.message);
break;
case QEMU_MONITOR_EVENT_PANIC_INFO_TYPE_NONE:
case QEMU_MONITOR_EVENT_PANIC_INFO_TYPE_LAST:
break;
}
- return ret;
+ return NULL;
}
--
2.55.0

62
centos-10/SOURCES/libvirt-qemuProcessGuestPanicEventInfo-Fold-into-only-caller.patch

@ -0,0 +1,62 @@
From 09be2b6c34897411dfaf321aa2f0cb5cb8802005 Mon Sep 17 00:00:00 2001
Message-ID: <09be2b6c34897411dfaf321aa2f0cb5cb8802005.1787144197.git.jdenemar@redhat.com>
From: Peter Krempa <pkrempa@redhat.com>
Date: Tue, 21 Jul 2026 14:55:38 +0200
Subject: [PATCH] qemuProcessGuestPanicEventInfo: Fold into only caller
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Move the code directly to the only place that calls this function.
Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
(cherry picked from commit bf4ace1bca464fe8432c2eb08f5261d6f9bdaf29)
https://redhat.atlassian.net/browse/RHEL-242545
---
src/qemu/qemu_driver.c | 22 +++++++---------------
1 file changed, 7 insertions(+), 15 deletions(-)
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index cb9f6fb7bf..391394485e 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -3599,19 +3599,6 @@ doCoreDumpToAutoDumpPath(virQEMUDriver *driver,
}
-static void
-qemuProcessGuestPanicEventInfo(virQEMUDriver *driver,
- virDomainObj *vm,
- qemuMonitorEventPanicInfo *info)
-{
- g_autofree char *msg = qemuMonitorGuestPanicEventInfoFormatMsg(info);
- g_autofree char *timestamp = virTimeStringNow();
-
- if (msg && timestamp)
- qemuDomainLogAppendMessage(driver, vm, "%s: panic %s\n", timestamp, msg);
-}
-
-
static void
processGuestPanicEvent(virQEMUDriver *driver,
virDomainObj *vm,
@@ -3632,8 +3619,13 @@ processGuestPanicEvent(virQEMUDriver *driver,
goto endjob;
}
- if (info)
- qemuProcessGuestPanicEventInfo(driver, vm, info);
+ if (info) {
+ g_autofree char *msg = qemuMonitorGuestPanicEventInfoFormatMsg(info);
+ g_autofree char *timestamp = virTimeStringNow();
+
+ if (msg && timestamp)
+ qemuDomainLogAppendMessage(driver, vm, "%s: panic %s\n", timestamp, msg);
+ }
virDomainObjSetState(vm, VIR_DOMAIN_CRASHED, VIR_DOMAIN_CRASHED_PANICKED);
--
2.55.0

62
centos-10/SOURCES/libvirt-qemuProcessSetupLifecycleActions-Prepare-to-handle-other-actions.patch

@ -0,0 +1,62 @@
From bd4a2bf8b7bd25adfdcf693f84a8df15e4473261 Mon Sep 17 00:00:00 2001
Message-ID: <bd4a2bf8b7bd25adfdcf693f84a8df15e4473261.1787144196.git.jdenemar@redhat.com>
From: Peter Krempa <pkrempa@redhat.com>
Date: Mon, 20 Jul 2026 13:48:51 +0200
Subject: [PATCH] qemuProcessSetupLifecycleActions: Prepare to handle other
actions
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Rework the code so that it'll be possible to easily extend it to set
other lifecycle actions in qemu.
Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
(cherry picked from commit 30a548c894dc2f5787d7004d68b266caa404f6af)
https://redhat.atlassian.net/browse/RHEL-242545
---
src/qemu/qemu_process.c | 18 ++++++++++++------
1 file changed, 12 insertions(+), 6 deletions(-)
diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
index a1cdce6d17..397082ef04 100644
--- a/src/qemu/qemu_process.c
+++ b/src/qemu/qemu_process.c
@@ -8176,21 +8176,27 @@ qemuProcessSetupLifecycleActions(virDomainObj *vm,
virDomainAsyncJob asyncJob)
{
qemuDomainObjPrivate *priv = vm->privateData;
+ qemuMonitorActionShutdown shutdown = QEMU_MONITOR_ACTION_SHUTDOWN_KEEP;
+ qemuMonitorActionReboot reboot = QEMU_MONITOR_ACTION_REBOOT_KEEP;
+ qemuMonitorActionWatchdog watchdog = QEMU_MONITOR_ACTION_WATCHDOG_KEEP;
+ qemuMonitorActionPanic panic = QEMU_MONITOR_ACTION_PANIC_KEEP;
int rc;
/* for now we handle only onReboot->destroy here as an alternative to
* '-no-reboot' on the commandline */
- if (vm->def->onReboot != VIR_DOMAIN_LIFECYCLE_ACTION_DESTROY)
+ if (vm->def->onReboot == VIR_DOMAIN_LIFECYCLE_ACTION_DESTROY)
+ reboot = QEMU_MONITOR_ACTION_REBOOT_SHUTDOWN;
+
+ if (shutdown == QEMU_MONITOR_ACTION_SHUTDOWN_KEEP &&
+ reboot == QEMU_MONITOR_ACTION_REBOOT_KEEP &&
+ watchdog == QEMU_MONITOR_ACTION_WATCHDOG_KEEP &&
+ panic == QEMU_MONITOR_ACTION_PANIC_KEEP)
return 0;
if (qemuDomainObjEnterMonitorAsync(vm, asyncJob) < 0)
return -1;
- rc = qemuMonitorSetAction(priv->mon,
- QEMU_MONITOR_ACTION_SHUTDOWN_KEEP,
- QEMU_MONITOR_ACTION_REBOOT_SHUTDOWN,
- QEMU_MONITOR_ACTION_WATCHDOG_KEEP,
- QEMU_MONITOR_ACTION_PANIC_KEEP);
+ rc = qemuMonitorSetAction(priv->mon, shutdown, reboot, watchdog, panic);
qemuDomainObjExitMonitor(vm);
if (rc < 0)
--
2.55.0

211
centos-10/SOURCES/libvirt-qemu_agent-Introduce-guest-get-devices.patch

@ -0,0 +1,211 @@
From 97cc433df8d7eebda4985b76e4b38b0597c6ddc6 Mon Sep 17 00:00:00 2001
Message-ID: <97cc433df8d7eebda4985b76e4b38b0597c6ddc6.1787144197.git.jdenemar@redhat.com>
From: Michal Privoznik <mprivozn@redhat.com>
Date: Tue, 11 Aug 2026 17:08:05 +0200
Subject: [PATCH] qemu_agent: Introduce guest-get-devices
QEMU agent has 'guest-get-devices` command. Even though it's
currently implemented only for Windows, it shows some interesting
information from inside the guest, like device drivers, their
versions, and so on.
Looking at the command definition in qga/qapi-schema.json the
only non-optional field in returned data is 'driver-name'. The
rest is optional. Although looking at the current implementation
either all fields are set or device is ignored completely.
Nevertheless, our code should follow QMP schema.
New qemuAgentGuestDeviceInfo structure is introduced among with
qemuAgentGetGuestDeviceInfo() function which parses reply from
agent and fills the structure. Optional fields are either set to
NULL or -1, if missing.
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
Reviewed-by: Peter Krempa <pkrempa@redhat.com>
(cherry picked from commit 7dea038439aa025d18c716e3343d3f0e9ccd672a)
Resolves: https://redhat.atlassian.net/browse/RHEL-235731
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
---
src/hypervisor/qemu_agent.c | 119 ++++++++++++++++++++++++++++++++++++
src/hypervisor/qemu_agent.h | 21 +++++++
src/libvirt_private.syms | 2 +
3 files changed, 142 insertions(+)
diff --git a/src/hypervisor/qemu_agent.c b/src/hypervisor/qemu_agent.c
index 418386317d..fbfaafc1bb 100644
--- a/src/hypervisor/qemu_agent.c
+++ b/src/hypervisor/qemu_agent.c
@@ -2843,3 +2843,122 @@ qemuAgentInterfaceFormatParams(virDomainInterfacePtr *ifaces,
}
}
}
+
+
+void
+qemuAgentGuestDeviceInfoFree(qemuAgentGuestDeviceInfo *info)
+{
+ if (!info)
+ return;
+
+ g_free(info->driverName);
+ g_free(info->driverVersion);
+ g_free(info->pci);
+ g_free(info);
+}
+
+
+int
+qemuAgentGetGuestDeviceInfo(qemuAgent *agent,
+ qemuAgentGuestDeviceInfo ***info,
+ bool report_unsupported)
+{
+ g_autoptr(virJSONValue) cmd = NULL;
+ g_autoptr(virJSONValue) reply = NULL;
+ virJSONValue *data = NULL;
+ size_t ndata;
+ size_t i;
+ int rc;
+
+ if (!(cmd = qemuAgentMakeCommand("guest-get-devices", NULL)))
+ return -1;
+
+ if ((rc = qemuAgentCommandFull(agent, cmd, &reply, agent->timeout,
+ report_unsupported)) < 0)
+ return rc;
+
+ if (!(data = virJSONValueObjectGetArray(reply, "return"))) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("qemu agent didn't return an array of devices"));
+ return -1;
+ }
+
+ ndata = virJSONValueArraySize(data);
+
+ *info = g_new0(qemuAgentGuestDeviceInfo *, ndata);
+
+ for (i = 0; i < ndata; i++) {
+ g_autoptr(qemuAgentGuestDeviceInfo) oneInfo = NULL;
+ virJSONValue *entry = virJSONValueArrayGet(data, i);
+ virJSONValue *dDate = NULL;
+ virJSONValue *idObj = NULL;
+
+ if (!entry) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("array element missing in guest-get-devices return value"));
+ goto error;
+ }
+
+ oneInfo = g_new0(qemuAgentGuestDeviceInfo, 1);
+
+ oneInfo->driverName = g_strdup(virJSONValueObjectGetString(entry, "driver-name"));
+ if (!oneInfo->driverName) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("'driver-name' missing in reply of guest-get-devices"));
+ goto error;
+ }
+
+ if ((dDate = virJSONValueObjectGet(entry, "driver-date"))) {
+ if (virJSONValueGetNumberLong(dDate, &oneInfo->driverDate) < 0) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("malformed 'driver-date' in reply of guest-get-devices"));
+ goto error;
+ }
+ } else {
+ oneInfo->driverDate = -1;
+ }
+
+ oneInfo->driverVersion = g_strdup(virJSONValueObjectGetString(entry, "driver-version"));
+
+ if ((idObj = virJSONValueObjectGet(entry, "id"))) {
+ const char *type = NULL;
+
+ if (!(type = virJSONValueObjectGetString(idObj, "type"))) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("missing 'type' in reply of guest-get-devices"));
+ goto error;
+ }
+
+ if (STREQ("pci", type)) {
+ g_autofree qemuAgentGuestDeviceInfoPCI *pci = NULL;
+
+ pci = g_new0(qemuAgentGuestDeviceInfoPCI, 1);
+
+ if (virJSONValueObjectGetNumberUint(idObj, "vendor-id", &pci->vendorID) < 0) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("missing or malformed 'vendor-id' in reply of guest-get-devices"));
+ goto error;
+ }
+
+ if (virJSONValueObjectGetNumberUint(idObj, "device-id", &pci->deviceID) < 0) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("missing or malformed 'device-id' in reply of guest-get-devices"));
+ goto error;
+ }
+
+ oneInfo->pci = g_steal_pointer(&pci);
+ }
+ }
+
+ (*info)[i] = g_steal_pointer(&oneInfo);
+ }
+
+ return ndata;
+
+ error:
+ for (i = 0; i < ndata; i++) {
+ qemuAgentGuestDeviceInfoFree((*info)[i]);
+ }
+ g_clear_pointer(info, g_free);
+ return -1;
+}
diff --git a/src/hypervisor/qemu_agent.h b/src/hypervisor/qemu_agent.h
index def6f983d4..def4194ab7 100644
--- a/src/hypervisor/qemu_agent.h
+++ b/src/hypervisor/qemu_agent.h
@@ -218,3 +218,24 @@ void
qemuAgentInterfaceFormatParams(virDomainInterfacePtr *ifaces,
int nifaces,
virTypedParamList *list);
+
+typedef struct _qemuAgentGuestDeviceInfoPCI qemuAgentGuestDeviceInfoPCI;
+struct _qemuAgentGuestDeviceInfoPCI {
+ unsigned int vendorID;
+ unsigned int deviceID;
+};
+
+typedef struct _qemuAgentGuestDeviceInfo qemuAgentGuestDeviceInfo;
+struct _qemuAgentGuestDeviceInfo {
+ char *driverName;
+ long long driverDate; /* In nanoseconds since the epoch */
+ char *driverVersion;
+ qemuAgentGuestDeviceInfoPCI *pci;
+};
+
+void qemuAgentGuestDeviceInfoFree(qemuAgentGuestDeviceInfo *info);
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(qemuAgentGuestDeviceInfo, qemuAgentGuestDeviceInfoFree);
+
+int qemuAgentGetGuestDeviceInfo(qemuAgent *agent,
+ qemuAgentGuestDeviceInfo ***info,
+ bool report_unsupported);
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index 02bd505749..0bd8c6f781 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -1726,6 +1726,7 @@ qemuAgentFSThaw;
qemuAgentFSTrim;
qemuAgentGetDisks;
qemuAgentGetFSInfo;
+qemuAgentGetGuestDeviceInfo;
qemuAgentGetHostname;
qemuAgentGetInterfaces;
qemuAgentGetLoadAvg;
@@ -1734,6 +1735,7 @@ qemuAgentGetTime;
qemuAgentGetTimezone;
qemuAgentGetUsers;
qemuAgentGetVCPUs;
+qemuAgentGuestDeviceInfoFree;
qemuAgentInterfaceFormatParams;
qemuAgentNotifyClose;
qemuAgentNotifyEvent;
--
2.55.0

164
centos-10/SOURCES/libvirt-qemuagenttest-Introduce-GetGuestDeviceInfo-test-case.patch

@ -0,0 +1,164 @@
From 59f656a08ba5557f3bbd6f617248b585b8e911a9 Mon Sep 17 00:00:00 2001
Message-ID: <59f656a08ba5557f3bbd6f617248b585b8e911a9.1787144197.git.jdenemar@redhat.com>
From: Michal Privoznik <mprivozn@redhat.com>
Date: Wed, 12 Aug 2026 14:08:37 +0200
Subject: [PATCH] qemuagenttest: Introduce GetGuestDeviceInfo test case
Introduce a test case for newly introduced
qemuAgentGetGuestDeviceInfo(). The expected data started as a
genuine reply from a qemu-ga running inside a Windows VM. But
then was modified to cover more cases (like an optional key
missing).
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
Reviewed-by: Peter Krempa <pkrempa@redhat.com>
(cherry picked from commit c56a2479ab59167af6cc9094981ef6e1c0a83a01)
Resolves: https://redhat.atlassian.net/browse/RHEL-235731
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
---
tests/qemuagenttest.c | 123 ++++++++++++++++++++++++++++++++++++++++++
1 file changed, 123 insertions(+)
diff --git a/tests/qemuagenttest.c b/tests/qemuagenttest.c
index 74cd317e74..7c726a6b85 100644
--- a/tests/qemuagenttest.c
+++ b/tests/qemuagenttest.c
@@ -1394,6 +1394,128 @@ testQemuAgentGetLoadAvg(const void *data)
}
+static const char *testQemuAgentGetGuestDeviceInfoResponse =
+"{"
+" \"return\": ["
+" {"
+" \"driver-date\": 1736726400000000000,"
+" \"driver-name\": \"Red Hat VirtIO Ethernet Adapter\","
+" \"driver-version\": \"100.100.104.27100\","
+" \"id\": {"
+" \"device-id\": 4161,"
+" \"vendor-id\": 6900,"
+" \"type\": \"pci\""
+" }"
+" },"
+" {"
+" \"driver-name\": \"VirtIO Serial Driver\","
+" \"driver-version\": \"100.100.104.27100\","
+" \"id\": {"
+" \"device-id\": 4163,"
+" \"vendor-id\": 6900,"
+" \"type\": \"pci\""
+" }"
+" },"
+" {"
+" \"driver-date\": 1736726400000000000,"
+" \"driver-name\": \"VirtIO Balloon Driver\","
+" \"id\": {"
+" \"device-id\": 4165,"
+" \"vendor-id\": 6900,"
+" \"type\": \"pci\""
+" }"
+" },"
+" {"
+" \"driver-date\": 1736726400000000000,"
+" \"driver-name\": \"Red Hat VirtIO GPU DOD controller\","
+" \"driver-version\": \"100.100.104.27100\""
+" }"
+" ]"
+"}";
+
+
+static int
+testQemuAgentGetGuestDeviceInfo(const void *data)
+{
+ virDomainXMLOption *xmlopt = (virDomainXMLOption *)data;
+ g_autoptr(qemuMonitorTest) test = qemuMonitorTestNewAgent(xmlopt);
+ qemuAgentGuestDeviceInfo **devices = NULL;
+ int ret = -1;
+ size_t i;
+ int ndevices;
+
+ if (!test)
+ return -1;
+
+ if (qemuMonitorTestAddAgentSyncResponse(test) < 0)
+ return -1;
+
+ if (qemuMonitorTestAddItem(test, "guest-get-devices",
+ testQemuAgentGetGuestDeviceInfoResponse) < 0)
+ return -1;
+
+ ndevices = qemuAgentGetGuestDeviceInfo(qemuMonitorTestGetAgent(test),
+ &devices, true);
+
+ if (ndevices < 0)
+ return -1;
+
+ if (ndevices != 4) {
+ virReportError(VIR_ERR_INTERNAL_ERROR,
+ "unexpected number of guest devices returned (%d), expected 4",
+ ndevices);
+ goto cleanup;
+ }
+
+ if (STRNEQ(devices[0]->driverName, "Red Hat VirtIO Ethernet Adapter") ||
+ STRNEQ(devices[0]->driverVersion, "100.100.104.27100") ||
+ devices[0]->driverDate != 1736726400000000000LL ||
+ devices[0]->pci->vendorID != 6900 ||
+ devices[0]->pci->deviceID != 4161) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ "unexpected device info returned for device #0");
+ goto cleanup;
+ }
+
+ if (STRNEQ(devices[1]->driverName, "VirtIO Serial Driver") ||
+ STRNEQ(devices[1]->driverVersion, "100.100.104.27100") ||
+ devices[1]->driverDate != -1LL ||
+ devices[1]->pci->vendorID != 6900 ||
+ devices[1]->pci->deviceID != 4163) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ "unexpected device info returned for device #1");
+ goto cleanup;
+ }
+
+ if (STRNEQ(devices[2]->driverName, "VirtIO Balloon Driver") ||
+ devices[2]->driverVersion ||
+ devices[2]->driverDate != 1736726400000000000LL ||
+ devices[2]->pci->vendorID != 6900 ||
+ devices[2]->pci->deviceID != 4165) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ "unexpected device info returned for device #2");
+ goto cleanup;
+ }
+
+ if (STRNEQ(devices[3]->driverName, "Red Hat VirtIO GPU DOD controller") ||
+ STRNEQ(devices[3]->driverVersion, "100.100.104.27100") ||
+ devices[3]->driverDate != 1736726400000000000LL ||
+ devices[3]->pci) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ "unexpected device info returned for device #3");
+ goto cleanup;
+ }
+
+ ret = 0;
+ cleanup:
+ for (i = 0; i < ndevices; i++) {
+ qemuAgentGuestDeviceInfoFree(devices[i]);
+ }
+ g_free(devices);
+ return ret;
+}
+
+
static int
mymain(void)
{
@@ -1431,6 +1553,7 @@ mymain(void)
DO_TEST(SSHKeys);
DO_TEST(GetDisks);
DO_TEST(GetLoadAvg);
+ DO_TEST(GetGuestDeviceInfo);
DO_TEST(Timeout); /* Timeout should always be called last */
--
2.55.0

1063
centos-10/SOURCES/libvirt-tests-capabilityschemadata-Add-a-real-test-example.patch

File diff suppressed because it is too large

395
centos-10/SOURCES/libvirt-tests-qemuxmlconfdata-provide-HW-accel-smmuv3-sample-XML-and-CLI-args.patch

@ -0,0 +1,395 @@
From d07415461c5105075aca563fdc4595df8443a9e1 Mon Sep 17 00:00:00 2001
Message-ID: <d07415461c5105075aca563fdc4595df8443a9e1.1786713644.git.jdenemar@redhat.com>
From: Nathan Chen <nathanc@nvidia.com>
Date: Wed, 5 Aug 2026 15:13:01 -0700
Subject: [PATCH] tests: qemuxmlconfdata: provide HW-accel smmuv3 sample XML
and CLI args
Provide sample XML and CLI args for the HW-accel smmuv3 XML schema
for virt machine types.
Reviewed-by: Pavel Hrdina <phrdina@redhat.com>
Signed-off-by: Nathan Chen <nathanc@nvidia.com>
(cherry picked from commit 6fcebd5bbbc7c31b732b8fe4c8019ced78fce0de)
Conflicts:
tests/qemuxmlconfdata/iommu-smmuv3-pci-bus-accel-auto.aarch64-latest.args
tests/qemuxmlconfdata/iommu-smmuv3-pci-bus-accel.aarch64-latest.args
- missing upstream commit d071782577a83fcd5a8c6730838e853699439f1a
Resolves: https://redhat.atlassian.net/browse/RHEL-138901
---
...uv3-pci-bus-accel-auto.aarch64-latest.args | 38 +++++++++++
...muv3-pci-bus-accel-auto.aarch64-latest.xml | 63 +++++++++++++++++++
.../iommu-smmuv3-pci-bus-accel-auto.xml | 53 ++++++++++++++++
...u-smmuv3-pci-bus-accel.aarch64-latest.args | 38 +++++++++++
...mu-smmuv3-pci-bus-accel.aarch64-latest.xml | 63 +++++++++++++++++++
.../iommu-smmuv3-pci-bus-accel.xml | 53 ++++++++++++++++
tests/qemuxmlconftest.c | 2 +
7 files changed, 310 insertions(+)
create mode 100644 tests/qemuxmlconfdata/iommu-smmuv3-pci-bus-accel-auto.aarch64-latest.args
create mode 100644 tests/qemuxmlconfdata/iommu-smmuv3-pci-bus-accel-auto.aarch64-latest.xml
create mode 100644 tests/qemuxmlconfdata/iommu-smmuv3-pci-bus-accel-auto.xml
create mode 100644 tests/qemuxmlconfdata/iommu-smmuv3-pci-bus-accel.aarch64-latest.args
create mode 100644 tests/qemuxmlconfdata/iommu-smmuv3-pci-bus-accel.aarch64-latest.xml
create mode 100644 tests/qemuxmlconfdata/iommu-smmuv3-pci-bus-accel.xml
diff --git a/tests/qemuxmlconfdata/iommu-smmuv3-pci-bus-accel-auto.aarch64-latest.args b/tests/qemuxmlconfdata/iommu-smmuv3-pci-bus-accel-auto.aarch64-latest.args
new file mode 100644
index 0000000000..40423e505d
--- /dev/null
+++ b/tests/qemuxmlconfdata/iommu-smmuv3-pci-bus-accel-auto.aarch64-latest.args
@@ -0,0 +1,38 @@
+LC_ALL=C \
+PATH=/bin \
+HOME=/var/lib/libvirt/qemu/domain--1-guest \
+USER=test \
+LOGNAME=test \
+XDG_DATA_HOME=/var/lib/libvirt/qemu/domain--1-guest/.local/share \
+XDG_CACHE_HOME=/var/lib/libvirt/qemu/domain--1-guest/.cache \
+XDG_CONFIG_HOME=/var/lib/libvirt/qemu/domain--1-guest/.config \
+/usr/bin/qemu-system-aarch64 \
+-name guest=guest,debug-threads=on \
+-S \
+-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/var/lib/libvirt/qemu/domain--1-guest/master-key.aes"}' \
+-machine virt,usb=off,gic-version=2,dump-guest-core=off,memory-backend=mach-virt.ram,acpi=off \
+-accel tcg \
+-m size=1048576k \
+-object '{"qom-type":"memory-backend-ram","id":"mach-virt.ram","size":1073741824}' \
+-overcommit mem-lock=off \
+-smp 1,sockets=1,cores=1,threads=1 \
+-uuid 1ccfd97d-5eb4-478a-bbe6-88d254c16db7 \
+-display none \
+-no-user-config \
+-nodefaults \
+-chardev socket,id=charmonitor,fd=@mon-fd@,server=on,wait=off \
+-mon chardev=charmonitor,id=monitor,mode=control \
+-rtc base=utc \
+-no-shutdown \
+-boot strict=on \
+-device '{"driver":"pxb-pcie","bus_nr":252,"id":"pci.1","bus":"pcie.0","addr":"0x1"}' \
+-device '{"driver":"pxb-pcie","bus_nr":248,"id":"pci.2","bus":"pcie.0","addr":"0x2"}' \
+-device '{"driver":"pcie-root-port","port":0,"chassis":21,"id":"pci.3","bus":"pci.1","addr":"0x0"}' \
+-device '{"driver":"pcie-root-port","port":168,"chassis":22,"id":"pci.4","bus":"pci.2","addr":"0x0"}' \
+-device '{"driver":"arm-smmuv3","primary-bus":"pci.1","id":"iommu0","accel":true}' \
+-device '{"driver":"arm-smmuv3","primary-bus":"pci.2","id":"iommu1","accel":true}' \
+-audiodev '{"id":"audio1","driver":"none"}' \
+-device '{"driver":"vfio-pci","host":"0000:06:00.0","id":"hostdev0","bus":"pci.3","addr":"0x0"}' \
+-device '{"driver":"vfio-pci","host":"0000:06:01.0","id":"hostdev1","bus":"pci.4","addr":"0x0"}' \
+-sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,resourcecontrol=deny \
+-msg timestamp=on
diff --git a/tests/qemuxmlconfdata/iommu-smmuv3-pci-bus-accel-auto.aarch64-latest.xml b/tests/qemuxmlconfdata/iommu-smmuv3-pci-bus-accel-auto.aarch64-latest.xml
new file mode 100644
index 0000000000..08fb17fb6f
--- /dev/null
+++ b/tests/qemuxmlconfdata/iommu-smmuv3-pci-bus-accel-auto.aarch64-latest.xml
@@ -0,0 +1,63 @@
+<domain type='qemu'>
+ <name>guest</name>
+ <uuid>1ccfd97d-5eb4-478a-bbe6-88d254c16db7</uuid>
+ <memory unit='KiB'>1048576</memory>
+ <currentMemory unit='KiB'>1048576</currentMemory>
+ <vcpu placement='static'>1</vcpu>
+ <os>
+ <type arch='aarch64' machine='virt'>hvm</type>
+ <boot dev='hd'/>
+ </os>
+ <features>
+ <gic version='2'/>
+ </features>
+ <clock offset='utc'/>
+ <on_poweroff>destroy</on_poweroff>
+ <on_reboot>restart</on_reboot>
+ <on_crash>destroy</on_crash>
+ <devices>
+ <emulator>/usr/bin/qemu-system-aarch64</emulator>
+ <controller type='usb' index='0' model='none'/>
+ <controller type='pci' index='0' model='pcie-root'/>
+ <controller type='pci' index='1' model='pcie-expander-bus'>
+ <model name='pxb-pcie'/>
+ <target busNr='252'/>
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x0'/>
+ </controller>
+ <controller type='pci' index='2' model='pcie-expander-bus'>
+ <model name='pxb-pcie'/>
+ <target busNr='248'/>
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
+ </controller>
+ <controller type='pci' index='3' model='pcie-root-port'>
+ <model name='pcie-root-port'/>
+ <target chassis='21' port='0x0'/>
+ <address type='pci' domain='0x0000' bus='0x01' slot='0x00' function='0x0'/>
+ </controller>
+ <controller type='pci' index='4' model='pcie-root-port'>
+ <model name='pcie-root-port'/>
+ <target chassis='22' port='0xa8'/>
+ <address type='pci' domain='0x0000' bus='0x02' slot='0x00' function='0x0'/>
+ </controller>
+ <audio id='1' type='none'/>
+ <hostdev mode='subsystem' type='pci' managed='no'>
+ <source>
+ <address domain='0x0000' bus='0x06' slot='0x00' function='0x0'/>
+ </source>
+ <address type='pci' domain='0x0000' bus='0x03' slot='0x00' function='0x0'/>
+ </hostdev>
+ <hostdev mode='subsystem' type='pci' managed='no'>
+ <source>
+ <address domain='0x0000' bus='0x06' slot='0x01' function='0x0'/>
+ </source>
+ <address type='pci' domain='0x0000' bus='0x04' slot='0x00' function='0x0'/>
+ </hostdev>
+ <memballoon model='none'/>
+ <iommu model='smmuv3'>
+ <driver pciBus='1' accel='on'/>
+ </iommu>
+ <iommu model='smmuv3'>
+ <driver pciBus='2' accel='on'/>
+ </iommu>
+ </devices>
+</domain>
diff --git a/tests/qemuxmlconfdata/iommu-smmuv3-pci-bus-accel-auto.xml b/tests/qemuxmlconfdata/iommu-smmuv3-pci-bus-accel-auto.xml
new file mode 100644
index 0000000000..abbc22e291
--- /dev/null
+++ b/tests/qemuxmlconfdata/iommu-smmuv3-pci-bus-accel-auto.xml
@@ -0,0 +1,53 @@
+<domain type='qemu'>
+ <name>guest</name>
+ <uuid>1ccfd97d-5eb4-478a-bbe6-88d254c16db7</uuid>
+ <memory unit='KiB'>1048576</memory>
+ <vcpu placement='static'>1</vcpu>
+ <os>
+ <type arch='aarch64' machine='virt'>hvm</type>
+ </os>
+ <devices>
+ <emulator>/usr/bin/qemu-system-aarch64</emulator>
+ <controller type='usb' model='none'/>
+ <memballoon model='none'/>
+ <controller type='pci' index='0' model='pcie-root'/>
+ <controller type='pci' index='1' model='pcie-expander-bus'>
+ <model name='pxb-pcie'/>
+ <target busNr='252'/>
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x0'/>
+ </controller>
+ <controller type='pci' index='2' model='pcie-expander-bus'>
+ <model name='pxb-pcie'/>
+ <target busNr='248'/>
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
+ </controller>
+ <controller type='pci' index='3' model='pcie-root-port'>
+ <model name='pcie-root-port'/>
+ <target chassis='21' port='0x0'/>
+ <address type='pci' domain='0x0000' bus='0x01' slot='0x00' function='0x0'/>
+ </controller>
+ <controller type='pci' index='4' model='pcie-root-port'>
+ <model name='pcie-root-port'/>
+ <target chassis='22' port='0xa8'/>
+ <address type='pci' domain='0x0000' bus='0x02' slot='0x00' function='0x0'/>
+ </controller>
+ <hostdev mode='subsystem' type='pci' managed='no'>
+ <source>
+ <address domain='0x0000' bus='0x06' slot='0x00' function='0x0'/>
+ </source>
+ <address type='pci' domain='0x0000' bus='0x03' slot='0x00' function='0x0'/>
+ </hostdev>
+ <hostdev mode='subsystem' type='pci' managed='no'>
+ <source>
+ <address domain='0x0000' bus='0x06' slot='0x01' function='0x0'/>
+ </source>
+ <address type='pci' domain='0x0000' bus='0x04' slot='0x00' function='0x0'/>
+ </hostdev>
+ <iommu model='smmuv3'>
+ <driver pciBus='1' accel='on'/>
+ </iommu>
+ <iommu model='smmuv3'>
+ <driver pciBus='2' accel='on'/>
+ </iommu>
+ </devices>
+</domain>
diff --git a/tests/qemuxmlconfdata/iommu-smmuv3-pci-bus-accel.aarch64-latest.args b/tests/qemuxmlconfdata/iommu-smmuv3-pci-bus-accel.aarch64-latest.args
new file mode 100644
index 0000000000..69ec53784e
--- /dev/null
+++ b/tests/qemuxmlconfdata/iommu-smmuv3-pci-bus-accel.aarch64-latest.args
@@ -0,0 +1,38 @@
+LC_ALL=C \
+PATH=/bin \
+HOME=/var/lib/libvirt/qemu/domain--1-guest \
+USER=test \
+LOGNAME=test \
+XDG_DATA_HOME=/var/lib/libvirt/qemu/domain--1-guest/.local/share \
+XDG_CACHE_HOME=/var/lib/libvirt/qemu/domain--1-guest/.cache \
+XDG_CONFIG_HOME=/var/lib/libvirt/qemu/domain--1-guest/.config \
+/usr/bin/qemu-system-aarch64 \
+-name guest=guest,debug-threads=on \
+-S \
+-object '{"qom-type":"secret","id":"masterKey0","format":"raw","file":"/var/lib/libvirt/qemu/domain--1-guest/master-key.aes"}' \
+-machine virt,usb=off,gic-version=2,dump-guest-core=off,memory-backend=mach-virt.ram,acpi=off \
+-accel tcg \
+-m size=1048576k \
+-object '{"qom-type":"memory-backend-ram","id":"mach-virt.ram","size":1073741824}' \
+-overcommit mem-lock=off \
+-smp 1,sockets=1,cores=1,threads=1 \
+-uuid 1ccfd97d-5eb4-478a-bbe6-88d254c16db7 \
+-display none \
+-no-user-config \
+-nodefaults \
+-chardev socket,id=charmonitor,fd=@mon-fd@,server=on,wait=off \
+-mon chardev=charmonitor,id=monitor,mode=control \
+-rtc base=utc \
+-no-shutdown \
+-boot strict=on \
+-device '{"driver":"pxb-pcie","bus_nr":252,"id":"pci.1","bus":"pcie.0","addr":"0x1"}' \
+-device '{"driver":"pxb-pcie","bus_nr":248,"id":"pci.2","bus":"pcie.0","addr":"0x2"}' \
+-device '{"driver":"pcie-root-port","port":0,"chassis":21,"id":"pci.3","bus":"pci.1","addr":"0x0"}' \
+-device '{"driver":"pcie-root-port","port":168,"chassis":22,"id":"pci.4","bus":"pci.2","addr":"0x0"}' \
+-device '{"driver":"arm-smmuv3","primary-bus":"pci.1","id":"iommu0","accel":true,"ats":"on","ril":"off","ssidsize":"20","oas":"44"}' \
+-device '{"driver":"arm-smmuv3","primary-bus":"pci.2","id":"iommu1","accel":true,"ats":"on","ril":"off","ssidsize":"20","oas":"44"}' \
+-audiodev '{"id":"audio1","driver":"none"}' \
+-device '{"driver":"vfio-pci","host":"0000:06:00.0","id":"hostdev0","bus":"pci.3","addr":"0x0"}' \
+-device '{"driver":"vfio-pci","host":"0000:06:01.0","id":"hostdev1","bus":"pci.4","addr":"0x0"}' \
+-sandbox on,obsolete=deny,elevateprivileges=deny,spawn=deny,resourcecontrol=deny \
+-msg timestamp=on
diff --git a/tests/qemuxmlconfdata/iommu-smmuv3-pci-bus-accel.aarch64-latest.xml b/tests/qemuxmlconfdata/iommu-smmuv3-pci-bus-accel.aarch64-latest.xml
new file mode 100644
index 0000000000..221a4185e5
--- /dev/null
+++ b/tests/qemuxmlconfdata/iommu-smmuv3-pci-bus-accel.aarch64-latest.xml
@@ -0,0 +1,63 @@
+<domain type='qemu'>
+ <name>guest</name>
+ <uuid>1ccfd97d-5eb4-478a-bbe6-88d254c16db7</uuid>
+ <memory unit='KiB'>1048576</memory>
+ <currentMemory unit='KiB'>1048576</currentMemory>
+ <vcpu placement='static'>1</vcpu>
+ <os>
+ <type arch='aarch64' machine='virt'>hvm</type>
+ <boot dev='hd'/>
+ </os>
+ <features>
+ <gic version='2'/>
+ </features>
+ <clock offset='utc'/>
+ <on_poweroff>destroy</on_poweroff>
+ <on_reboot>restart</on_reboot>
+ <on_crash>destroy</on_crash>
+ <devices>
+ <emulator>/usr/bin/qemu-system-aarch64</emulator>
+ <controller type='usb' index='0' model='none'/>
+ <controller type='pci' index='0' model='pcie-root'/>
+ <controller type='pci' index='1' model='pcie-expander-bus'>
+ <model name='pxb-pcie'/>
+ <target busNr='252'/>
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x0'/>
+ </controller>
+ <controller type='pci' index='2' model='pcie-expander-bus'>
+ <model name='pxb-pcie'/>
+ <target busNr='248'/>
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
+ </controller>
+ <controller type='pci' index='3' model='pcie-root-port'>
+ <model name='pcie-root-port'/>
+ <target chassis='21' port='0x0'/>
+ <address type='pci' domain='0x0000' bus='0x01' slot='0x00' function='0x0'/>
+ </controller>
+ <controller type='pci' index='4' model='pcie-root-port'>
+ <model name='pcie-root-port'/>
+ <target chassis='22' port='0xa8'/>
+ <address type='pci' domain='0x0000' bus='0x02' slot='0x00' function='0x0'/>
+ </controller>
+ <audio id='1' type='none'/>
+ <hostdev mode='subsystem' type='pci' managed='no'>
+ <source>
+ <address domain='0x0000' bus='0x06' slot='0x00' function='0x0'/>
+ </source>
+ <address type='pci' domain='0x0000' bus='0x03' slot='0x00' function='0x0'/>
+ </hostdev>
+ <hostdev mode='subsystem' type='pci' managed='no'>
+ <source>
+ <address domain='0x0000' bus='0x06' slot='0x01' function='0x0'/>
+ </source>
+ <address type='pci' domain='0x0000' bus='0x04' slot='0x00' function='0x0'/>
+ </hostdev>
+ <memballoon model='none'/>
+ <iommu model='smmuv3'>
+ <driver pciBus='1' accel='on' ats='on' ril='off' ssidsize='20' oas='44'/>
+ </iommu>
+ <iommu model='smmuv3'>
+ <driver pciBus='2' accel='on' ats='on' ril='off' ssidsize='20' oas='44'/>
+ </iommu>
+ </devices>
+</domain>
diff --git a/tests/qemuxmlconfdata/iommu-smmuv3-pci-bus-accel.xml b/tests/qemuxmlconfdata/iommu-smmuv3-pci-bus-accel.xml
new file mode 100644
index 0000000000..8dbae00540
--- /dev/null
+++ b/tests/qemuxmlconfdata/iommu-smmuv3-pci-bus-accel.xml
@@ -0,0 +1,53 @@
+<domain type='qemu'>
+ <name>guest</name>
+ <uuid>1ccfd97d-5eb4-478a-bbe6-88d254c16db7</uuid>
+ <memory unit='KiB'>1048576</memory>
+ <vcpu placement='static'>1</vcpu>
+ <os>
+ <type arch='aarch64' machine='virt'>hvm</type>
+ </os>
+ <devices>
+ <emulator>/usr/bin/qemu-system-aarch64</emulator>
+ <controller type='usb' model='none'/>
+ <memballoon model='none'/>
+ <controller type='pci' index='0' model='pcie-root'/>
+ <controller type='pci' index='1' model='pcie-expander-bus'>
+ <model name='pxb-pcie'/>
+ <target busNr='252'/>
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x0'/>
+ </controller>
+ <controller type='pci' index='2' model='pcie-expander-bus'>
+ <model name='pxb-pcie'/>
+ <target busNr='248'/>
+ <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/>
+ </controller>
+ <controller type='pci' index='3' model='pcie-root-port'>
+ <model name='pcie-root-port'/>
+ <target chassis='21' port='0x0'/>
+ <address type='pci' domain='0x0000' bus='0x01' slot='0x00' function='0x0'/>
+ </controller>
+ <controller type='pci' index='4' model='pcie-root-port'>
+ <model name='pcie-root-port'/>
+ <target chassis='22' port='0xa8'/>
+ <address type='pci' domain='0x0000' bus='0x02' slot='0x00' function='0x0'/>
+ </controller>
+ <hostdev mode='subsystem' type='pci' managed='no'>
+ <source>
+ <address domain='0x0000' bus='0x06' slot='0x00' function='0x0'/>
+ </source>
+ <address type='pci' domain='0x0000' bus='0x03' slot='0x00' function='0x0'/>
+ </hostdev>
+ <hostdev mode='subsystem' type='pci' managed='no'>
+ <source>
+ <address domain='0x0000' bus='0x06' slot='0x01' function='0x0'/>
+ </source>
+ <address type='pci' domain='0x0000' bus='0x04' slot='0x00' function='0x0'/>
+ </hostdev>
+ <iommu model='smmuv3'>
+ <driver pciBus='1' accel='on' ats='on' ril='off' ssidsize='20' oas='44'/>
+ </iommu>
+ <iommu model='smmuv3'>
+ <driver pciBus='2' accel='on' ats='on' ril='off' ssidsize='20' oas='44'/>
+ </iommu>
+ </devices>
+</domain>
diff --git a/tests/qemuxmlconftest.c b/tests/qemuxmlconftest.c
index a1389775b9..99925e6241 100644
--- a/tests/qemuxmlconftest.c
+++ b/tests/qemuxmlconftest.c
@@ -2988,6 +2988,8 @@ mymain(void)
DO_TEST_CAPS_ARCH_LATEST("iommu-smmuv3", "aarch64");
DO_TEST_CAPS_ARCH_LATEST("iommu-smmuv3-pci-bus", "aarch64");
DO_TEST_CAPS_ARCH_LATEST("iommu-smmuv3-pci-bus-single", "aarch64");
+ DO_TEST_CAPS_ARCH_LATEST("iommu-smmuv3-pci-bus-accel", "aarch64");
+ DO_TEST_CAPS_ARCH_LATEST("iommu-smmuv3-pci-bus-accel-auto", "aarch64");
DO_TEST_CAPS_LATEST("virtio-iommu-x86_64");
DO_TEST_CAPS_ARCH_LATEST("virtio-iommu-aarch64", "aarch64");
DO_TEST_CAPS_LATEST_PARSE_ERROR("virtio-iommu-wrong-machine");
--
2.55.0

50
centos-10/SOURCES/libvirt-tools-virsh-fix-crash-on-error.patch

@ -0,0 +1,50 @@
From 90450dd1485b7c9412492d375d92bb578dc5a7f9 Mon Sep 17 00:00:00 2001
Message-ID: <90450dd1485b7c9412492d375d92bb578dc5a7f9.1786713643.git.jdenemar@redhat.com>
From: Jim Fehlig <jfehlig@suse.com>
Date: Tue, 4 Aug 2026 11:27:59 -0600
Subject: [PATCH] tools: virsh: fix crash on error
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Commit 9899c91515 introduced the potential for a NULL pointer dereference
crash when the 'ctl' parameter to vshPrintStderr() is NULL. Below is an
example backtrace of the crash when attempting to detach a non-existent
disk with 'virsh detach-disk test vdz'
#0 vshPrintStderr (ctl=0x0, level=4, format=<optimized out>, ap=<optimized out>) at ../tools/vsh.c:2148
#1 0x00005555555e6b2c in vshError (ctl=ctl@entry=0x0, format=<optimized out>) at ../tools/vsh.c:2170
#2 0x00005555555afec7 in virshFindDisk
(doc=doc@entry=0x555555696ee0 "<domain type='kvm' id='1'>\n <name>test</name>\n <uuid>9b27a21e-dfa2-4c1e-9d11-2de275aefb03</uuid>\n <metadata>\n <libosinfo:libosinfo xmlns:libosinfo=\"http://libosinfo.org/xmlns/libvirt/domain/1."..., path=0x555555651240 "vdz", type=type@entry=0) at ../tools/virsh-domain.c:13055
#3 0x00005555555b0151 in cmdDetachDisk (ctl=0x7fffffffdac0, cmd=0x5555556914c0) at ../tools/virsh-domain.c:13231
#4 0x00005555555e6ddb in vshCommandRun (ctl=ctl@entry=0x7fffffffdac0, cmd=0x5555556914c0) at ../tools/vsh.c:1383
#5 0x000055555559347a in main (argc=<optimized out>, argv=0x7fffffffdeb8) at ../tools/virsh.c:908
Ensure 'ctl' is valid before dereferencing it.
Fixes: 9899c91515d79595d19800ccc895df18eb7bb3f7
Signed-off-by: Jim Fehlig <jfehlig@suse.com>
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
(cherry picked from commit c6560a7223927e1e5fa249572750bc376bba67fa)
https://redhat.atlassian.net/browse/RHEL-234911
Signed-off-by: Ján Tomko <jtomko@redhat.com>
---
tools/vsh.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/tools/vsh.c b/tools/vsh.c
index ccf2f21d64..667cc1a0d2 100644
--- a/tools/vsh.c
+++ b/tools/vsh.c
@@ -2145,7 +2145,7 @@ vshPrintStderr(vshControl *ctl,
if (ctl)
vshOutputLogFile(ctl, level, str);
- if (ctl->stderr_closed)
+ if (ctl && ctl->stderr_closed)
return;
/* Most output is to stdout, but if someone ran virsh 2>&1, then
--
2.55.0

71
centos-10/SOURCES/libvirt-util-virFileChownFiles-do-not-follow-symlinks.patch

@ -0,0 +1,71 @@
From d8f7346b329f6594eeb32318c37fadde391c19b2 Mon Sep 17 00:00:00 2001
Message-ID: <d8f7346b329f6594eeb32318c37fadde391c19b2.1786713644.git.jdenemar@redhat.com>
From: =?UTF-8?q?HE=20WEI=EF=BC=88=E3=82=AE=E3=82=AB=E3=82=AF=EF=BC=89?=
<skyexpoc@gmail.com>
Date: Tue, 28 Jul 2026 17:49:02 +0100
Subject: [PATCH] util: virFileChownFiles: do not follow symlinks
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
virFileChownFiles() selected entries with virFileIsRegular() (stat(), follows
symlinks) and changed ownership with chown() (follows symlinks). A component
that owns the target directory at a lower privilege (e.g. the swtpm/tss state
directory) can plant a symlink to an arbitrary regular file and have the root
caller chown that file. Use lstat() to skip non-regular entries and
fchownat(..., AT_SYMLINK_NOFOLLOW) so a symlink final component is never
followed.
Fixes: CVE-2026-63622
Signed-off-by: HE WEI(ギカク) <skyexpoc@gmail.com>
[DB: use g_lstat instead of stat; use lchown instead of
fchownat for portability; added comment]
Reviewed-by: Ján Tomko <jtomko@redhat.com>
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
(cherry picked from commit 801160fd414ca2cc402bc01ead09b7ed4c3b8f5b)
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
---
src/util/virfile.c | 16 ++++++++++++++--
1 file changed, 14 insertions(+), 2 deletions(-)
diff --git a/src/util/virfile.c b/src/util/virfile.c
index a0c6cb8048..c9d838eeeb 100644
--- a/src/util/virfile.c
+++ b/src/util/virfile.c
@@ -3306,6 +3306,12 @@ int virDirIsEmpty(const char *path,
*
* Change ownership of all regular files in a directory.
*
+ * This will NOT follow any symlinks, to avoid security risks.
+ * It is assumed the process using content under @name will
+ * be unprivileged, thus less trusted than libvirt. If it is
+ * compromised it might attempt to create symlinks in @name to
+ * escalate privileges on a subsequent call to virFileChownFiles.
+ *
* Returns -1 on error, with error already reported, 0 on success.
*/
#ifndef WIN32
@@ -3322,13 +3328,19 @@ int virFileChownFiles(const char *name,
while ((direrr = virDirRead(dir, &ent, name)) > 0) {
g_autofree char *path = NULL;
+ struct stat sb;
path = g_build_filename(name, ent->d_name, NULL);
- if (!virFileIsRegular(path))
+ if (g_lstat(path, &sb) < 0) {
+ virReportSystemError(errno, _("cannot stat '%1$s'"), path);
+ return -1;
+ }
+
+ if (!S_ISREG(sb.st_mode))
continue;
- if (chown(path, uid, gid) < 0) {
+ if (lchown(path, uid, gid) < 0) {
virReportSystemError(errno,
_("cannot chown '%1$s' to (%2$u, %3$u)"),
ent->d_name, (unsigned int) uid,
--
2.55.0

88
centos-10/SOURCES/libvirt-virsh-Add-support-for-VIR_DOMAIN_GUEST_INFO_DEVICES.patch

@ -0,0 +1,88 @@
From 3f0bb5923811b9f04929a2c0c2debc046ef57a5a Mon Sep 17 00:00:00 2001
Message-ID: <3f0bb5923811b9f04929a2c0c2debc046ef57a5a.1787144197.git.jdenemar@redhat.com>
From: Michal Privoznik <mprivozn@redhat.com>
Date: Wed, 12 Aug 2026 15:11:20 +0200
Subject: [PATCH] virsh: Add support for VIR_DOMAIN_GUEST_INFO_DEVICES
The virDomainGetGuestInfo() API is exposed as 'guestinfo'
command. Introduce new --devices option for it to reflect
introduction of VIR_DOMAIN_GUEST_INFO_DEVICES type.
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
Reviewed-by: Peter Krempa <pkrempa@redhat.com>
(cherry picked from commit a634a99a07cf510658939164b6982297789025b8)
Resolves: https://redhat.atlassian.net/browse/RHEL-235731
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
---
docs/manpages/virsh.rst | 17 +++++++++++++----
tools/virsh-domain.c | 6 ++++++
2 files changed, 19 insertions(+), 4 deletions(-)
diff --git a/docs/manpages/virsh.rst b/docs/manpages/virsh.rst
index a10d29e0ea..e9f4a6f851 100644
--- a/docs/manpages/virsh.rst
+++ b/docs/manpages/virsh.rst
@@ -3277,7 +3277,7 @@ guestinfo
::
guestinfo domain [--user] [--os] [--timezone] [--hostname] [--filesystem]
- [--disk] [--interface]
+ [--disk] [--interface] [--devices]
Print information about the guest from the point of view of the guest agent.
Note that this command requires a guest agent to be configured and running in
@@ -3289,9 +3289,9 @@ Success is always reported in this case.
You can limit the types of information that are returned by specifying one or
more flags. Available information types flags are *--user*, *--os*,
-*--timezone*, *--hostname*, *--filesystem*, *--disk*, *--interface* and *--load*.
-If an explicitly requested information type is not supported by the guest agent
-at that point, the processes will provide an exit code of 1.
+*--timezone*, *--hostname*, *--filesystem*, *--disk*, *--interface*, *--load*
+and *--devices*. If an explicitly requested information type is not supported
+by the guest agent at that point, the processes will provide an exit code of 1.
Note that depending on the hypervisor type and the version of the guest agent
running within the domain, not all of the following information may be
@@ -3374,6 +3374,15 @@ returned:
* ``load.5m`` - average load in guest for last 5 minutes
* ``load.15m`` - average load in guest for last 15 minutes
+*--devices* returns:
+* ``device.count`` - the number of devices that info is returned for
+* ``device.<num>.driverName`` - name of the driver associated with device
+* ``device.<num>.driverDate`` - driver release date in seconds since the epoch
+* ``device.<num>.driverVersion`` - version of the driver associated with the device
+* ``device.<num>.idType`` - device identification type (e.g. pci)
+* ``device.<num>.pciVendor`` - vendor ID for PCI device (in decimal)
+* ``device.<num>.pciDevice`` - device ID for PCI device (in decimal)
+
guestvcpus
----------
diff --git a/tools/virsh-domain.c b/tools/virsh-domain.c
index 0f177fb69a..563f69c939 100644
--- a/tools/virsh-domain.c
+++ b/tools/virsh-domain.c
@@ -13749,6 +13749,10 @@ static const vshCmdOptDef opts_guestinfo[] = {
.type = VSH_OT_BOOL,
.help = N_("report load averages information"),
},
+ {.name = "devices",
+ .type = VSH_OT_BOOL,
+ .help = N_("report devices information"),
+ },
{.name = NULL}
};
@@ -13778,6 +13782,8 @@ cmdGuestInfo(vshControl *ctl, const vshCmd *cmd)
types |= VIR_DOMAIN_GUEST_INFO_INTERFACES;
if (vshCommandOptBool(cmd, "load"))
types |= VIR_DOMAIN_GUEST_INFO_LOAD;
+ if (vshCommandOptBool(cmd, "devices"))
+ types |= VIR_DOMAIN_GUEST_INFO_DEVICES;
if (!(dom = virshCommandOptDomain(ctl, cmd, NULL)))
return false;
--
2.55.0

70
centos-10/SPECS/libvirt.spec

@ -287,7 +287,7 @@
Summary: Library providing a simple virtualization API Summary: Library providing a simple virtualization API
Name: libvirt Name: libvirt
Version: 12.5.0 Version: 12.5.0
Release: 1%{?dist}%{?extra_release} Release: 3%{?dist}%{?extra_release}
License: GPL-2.0-or-later AND LGPL-2.1-only AND LGPL-2.1-or-later AND OFL-1.1 License: GPL-2.0-or-later AND LGPL-2.1-only AND LGPL-2.1-or-later AND OFL-1.1
URL: https://libvirt.org/ URL: https://libvirt.org/
@ -295,6 +295,37 @@ URL: https://libvirt.org/
%define mainturl stable_updates/ %define mainturl stable_updates/
%endif %endif
Source: https://download.libvirt.org/%{?mainturl}libvirt-%{version}.tar.xz Source: https://download.libvirt.org/%{?mainturl}libvirt-%{version}.tar.xz
Patch1: libvirt-tools-virsh-fix-crash-on-error.patch
Patch2: libvirt-conf-Include-check-for-pci_bus-in-virDomainIOMMUDefEquals.patch
Patch3: libvirt-qemu-introduce-QEMU_CAPS_DEVICE_ARM_SMMUV3.patch
Patch4: libvirt-qemu-introduce-QEMU_CAPS_ARM_SMMUV3_SMMU_PER_BUS.patch
Patch5: libvirt-qemu-introduce-QEMU_CAPS_ARM_SMMUV3_ACCEL.patch
Patch6: libvirt-qemu-Add-support-for-HW-accelerated-nested-SMMUv3.patch
Patch7: libvirt-tests-qemuxmlconfdata-provide-HW-accel-smmuv3-sample-XML-and-CLI-args.patch
Patch8: libvirt-conf-schemas-Allow-.-in-schema-for-CPU-flag-name.patch
Patch9: libvirt-tests-capabilityschemadata-Add-a-real-test-example.patch
Patch10: libvirt-util-virFileChownFiles-do-not-follow-symlinks.patch
Patch11: libvirt-qemu-Always-assume-support-for-QEMU_CAPS_SET_ACTION.patch
Patch12: libvirt-qemu-Remove-unused-qemuProcessRebootAllowed.patch
Patch13: libvirt-qemu-monitor-Remove-support-for-watchdog-set-action.patch
Patch14: libvirt-qemu-Remove-allowReboot-field.patch
Patch15: libvirt-qemu-capabilities-Retire-QEMU_CAPS_SET_ACTION.patch
Patch16: libvirt-qemuProcessSetupLifecycleActions-Prepare-to-handle-other-actions.patch
Patch17: libvirt-qemuDomainModifyLifecycleActionLive-Prepare-to-handle-other-actions.patch
Patch18: libvirt-processGuestPanicEvent-Don-t-pass-panic-action-via-parameter.patch
Patch19: libvirt-conf-Use-proper-enum-types-for-onReboot-onPoweroff-onCrash-and-onLockFailure.patch
Patch20: libvirt-qemuMonitorGuestPanicEventInfoFormatMsg-Directly-return-message.patch
Patch21: libvirt-qemuProcessGuestPanicEventInfo-Fold-into-only-caller.patch
Patch22: libvirt-qemu-processGuestPanicEvent-Split-individual-steps-under-separate-conditions.patch
Patch23: libvirt-Add-support-for-keeping-VM-running-when-panic-notifier-is-used.patch
Patch24: libvirt-qemu-Fix-proper-ordering-of-virtlockd-shutdown.patch
Patch25: libvirt-qemu-move-qemuAgent-InfoFormatParams-to-hypervisor-qemu_agent.c.patch
Patch26: libvirt-Add-guest-device-info-to-virDomainGetGuestInfo.patch
Patch27: libvirt-qemu_agent-Introduce-guest-get-devices.patch
Patch28: libvirt-qemuagenttest-Introduce-GetGuestDeviceInfo-test-case.patch
Patch29: libvirt-qemu-Implement-device-info-for-virDomainGetGuestInfo-API.patch
Patch30: libvirt-virsh-Add-support-for-VIR_DOMAIN_GUEST_INFO_DEVICES.patch
Requires: libvirt-daemon = %{version}-%{release} Requires: libvirt-daemon = %{version}-%{release}
Requires: libvirt-daemon-config-network = %{version}-%{release} Requires: libvirt-daemon-config-network = %{version}-%{release}
@ -1161,6 +1192,9 @@ MinGW Windows libvirt virtualization library.
%prep %prep
%autosetup -S git_am -N %autosetup -S git_am -N
%autopatch
%build %build
%if 0%{?fedora} >= %{min_fedora} || 0%{?rhel} >= %{min_rhel} %if 0%{?fedora} >= %{min_fedora} || 0%{?rhel} >= %{min_rhel}
%define supported_platform 1 %define supported_platform 1
@ -2693,6 +2727,40 @@ exit 0
%endif %endif
%changelog %changelog
* Wed Aug 19 2026 Jiri Denemark <jdenemar@redhat.com> - 12.5.0-3
- qemu: Always assume support for 'QEMU_CAPS_SET_ACTION' (RHEL-242545)
- qemu: Remove unused 'qemuProcessRebootAllowed' (RHEL-242545)
- qemu: monitor: Remove support for 'watchdog-set-action' (RHEL-242545)
- qemu: Remove 'allowReboot' field (RHEL-242545)
- qemu: capabilities: Retire QEMU_CAPS_SET_ACTION (RHEL-242545)
- qemuProcessSetupLifecycleActions: Prepare to handle other actions (RHEL-242545)
- qemuDomainModifyLifecycleActionLive: Prepare to handle other actions (RHEL-242545)
- processGuestPanicEvent: Don't pass panic action via parameter (RHEL-242545)
- conf: Use proper enum types for 'onReboot', 'onPoweroff', 'onCrash', and 'onLockFailure' (RHEL-242545)
- qemuMonitorGuestPanicEventInfoFormatMsg: Directly return message (RHEL-242545)
- qemuProcessGuestPanicEventInfo: Fold into only caller (RHEL-242545)
- qemu: processGuestPanicEvent: Split individual steps under separate conditions (RHEL-242545)
- Add support for keeping VM running when panic notifier is used (RHEL-242545)
- qemu: Fix proper ordering of 'virtlockd' shutdown (RHEL-185108)
- qemu: move qemuAgent*InfoFormatParams to hypervisor/qemu_agent.c (RHEL-235731)
- Add guest device info to virDomainGetGuestInfo (RHEL-235731)
- qemu_agent: Introduce guest-get-devices (RHEL-235731)
- qemuagenttest: Introduce GetGuestDeviceInfo test case (RHEL-235731)
- qemu: Implement device info for virDomainGetGuestInfo() API (RHEL-235731)
- virsh: Add support for VIR_DOMAIN_GUEST_INFO_DEVICES (RHEL-235731)
* Fri Aug 14 2026 Jiri Denemark <jdenemar@redhat.com> - 12.5.0-2
- tools: virsh: fix crash on error (RHEL-234911)
- conf: Include check for pci_bus in virDomainIOMMUDefEquals() (RHEL-138901)
- qemu: introduce QEMU_CAPS_DEVICE_ARM_SMMUV3 (RHEL-138901)
- qemu: introduce QEMU_CAPS_ARM_SMMUV3_SMMU_PER_BUS (RHEL-138901)
- qemu: introduce QEMU_CAPS_ARM_SMMUV3_ACCEL (RHEL-138901)
- qemu: Add support for HW-accelerated nested SMMUv3 (RHEL-138901)
- tests: qemuxmlconfdata: provide HW-accel smmuv3 sample XML and CLI args (RHEL-138901)
- conf: schemas: Allow '.' in schema for CPU flag name (RHEL-222549)
- tests: capabilityschemadata: Add a real test example (RHEL-222549)
- util: virFileChownFiles: do not follow symlinks (CVE-2026-63622)
* Wed Jul 1 2026 Jiri Denemark <jdenemar@redhat.com> - 12.5.0-1 * Wed Jul 1 2026 Jiri Denemark <jdenemar@redhat.com> - 12.5.0-1
- Rebased to libvirt-12.5.0 (RHEL-156861) - Rebased to libvirt-12.5.0 (RHEL-156861)
- The rebase also fixes the following bugs: - The rebase also fixes the following bugs:

134
centos-9/SOURCES/libvirt-Add-guest-device-info-to-virDomainGetGuestInfo.patch

@ -0,0 +1,134 @@
From df1527ef32effff10b7901be3542811ed13498a7 Mon Sep 17 00:00:00 2001
Message-ID: <df1527ef32effff10b7901be3542811ed13498a7.1787144643.git.jdenemar@redhat.com>
From: Michal Privoznik <mprivozn@redhat.com>
Date: Wed, 12 Aug 2026 15:11:12 +0200
Subject: [PATCH] Add guest device info to virDomainGetGuestInfo
QEMU guest agent has 'guest-get-devices` command, which returns
information on guest devices (driver name, version, release date,
and so on). In this commit the public API part is introduced.
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
Reviewed-by: Peter Krempa <pkrempa@redhat.com>
(cherry picked from commit 3033dae6989083fde1d06427ee2840242cfd8dca)
Resolves: https://redhat.atlassian.net/browse/RHEL-243300
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
---
include/libvirt/libvirt-domain.h | 78 ++++++++++++++++++++++++++++++++
src/libvirt-domain.c | 5 ++
2 files changed, 83 insertions(+)
diff --git a/include/libvirt/libvirt-domain.h b/include/libvirt/libvirt-domain.h
index f469ed428d..b1c4b10f97 100644
--- a/include/libvirt/libvirt-domain.h
+++ b/include/libvirt/libvirt-domain.h
@@ -8594,6 +8594,83 @@ int virDomainSetLaunchSecurityState(virDomainPtr domain,
*/
# define VIR_DOMAIN_GUEST_INFO_LOAD_15M "load.15m"
+/**
+ * VIR_DOMAIN_GUEST_INFO_DEVICE_COUNT:
+ *
+ * The number of guest devices that detailed information is fetched for as
+ * unsigned int.
+ *
+ * Since: 12.7.0
+ */
+# define VIR_DOMAIN_GUEST_INFO_DEVICE_COUNT "device.count"
+
+/**
+ * VIR_DOMAIN_GUEST_INFO_DEVICE_PREFIX:
+ *
+ * The parameter name prefix to access each device entry. Concatenate the
+ * prefix, the entry number formatted as an unsigned integer and one of the
+ * device suffix parameters to form a complete parameter name.
+ *
+ * Since: 12.7.0
+ */
+# define VIR_DOMAIN_GUEST_INFO_DEVICE_PREFIX "device."
+
+/**
+ * VIR_DOMAIN_GUEST_INFO_DEVICE_SUFFIX_DRIVER_NAME:
+ *
+ * Name of the device driver (e.g. ``VirtIO Balloon Driver``) as a string.
+ *
+ * Since: 12.7.0
+ */
+# define VIR_DOMAIN_GUEST_INFO_DEVICE_SUFFIX_DRIVER_NAME ".driverName"
+
+/**
+ * VIR_DOMAIN_GUEST_INFO_DEVICE_SUFFIX_DRIVER_DATE:
+ *
+ * Driver release date in seconds since the epoch (e.g. 1736726400) as long long.
+ *
+ * Since: 12.7.0
+ */
+# define VIR_DOMAIN_GUEST_INFO_DEVICE_SUFFIX_DRIVER_DATE ".driverDate"
+
+/**
+ * VIR_DOMAIN_GUEST_INFO_DEVICE_SUFFIX_DRIVER_VERSION:
+ *
+ * Driver version (e.g. ``100.100.104.27100``) as a string.
+ *
+ * Since: 12.7.0
+ */
+# define VIR_DOMAIN_GUEST_INFO_DEVICE_SUFFIX_DRIVER_VERSION ".driverVersion"
+
+/**
+ * VIR_DOMAIN_GUEST_INFO_DEVICE_SUFFIX_ID_TYPE:
+ *
+ * Device identification (e.g. ``pci``) as a string.
+ *
+ * Since: 12.7.0
+ */
+# define VIR_DOMAIN_GUEST_INFO_DEVICE_SUFFIX_ID_TYPE ".idType"
+
+/**
+ * VIR_DOMAIN_GUEST_INFO_DEVICE_SUFFIX_PCI_VENDOR:
+ *
+ * PCI device (a device with VIR_DOMAIN_GUEST_INFO_DEVICE_SUFFIX_ID_TYPE equal
+ * to ``pci``) vendor id (e.g. 6900) as a unsigned int.
+ *
+ * Since: 12.7.0
+ */
+# define VIR_DOMAIN_GUEST_INFO_DEVICE_SUFFIX_PCI_VENDOR ".pciVendor"
+
+/**
+ * VIR_DOMAIN_GUEST_INFO_DEVICE_SUFFIX_PCI_DEVICE:
+ *
+ * PCI device (a device with VIR_DOMAIN_GUEST_INFO_DEVICE_SUFFIX_ID_TYPE equal
+ * to ``pci``) device id (e.g. 4165) as a unsigned int.
+ *
+ * Since: 12.7.0
+ */
+# define VIR_DOMAIN_GUEST_INFO_DEVICE_SUFFIX_PCI_DEVICE ".pciDevice"
+
/**
* virDomainGuestInfoTypes:
*
@@ -8608,6 +8685,7 @@ typedef enum {
VIR_DOMAIN_GUEST_INFO_DISKS = (1 << 5), /* return disks information (Since: 7.0.0) */
VIR_DOMAIN_GUEST_INFO_INTERFACES = (1 << 6), /* return interfaces information (Since: 7.10.0) */
VIR_DOMAIN_GUEST_INFO_LOAD = (1 << 7), /* return load averages (Since: 11.2.0) */
+ VIR_DOMAIN_GUEST_INFO_DEVICES = (1 << 8), /* return devices information (Since: 12.7.0) */
} virDomainGuestInfoTypes;
int virDomainGetGuestInfo(virDomainPtr domain,
diff --git a/src/libvirt-domain.c b/src/libvirt-domain.c
index 0ae48654df..1dc9468968 100644
--- a/src/libvirt-domain.c
+++ b/src/libvirt-domain.c
@@ -13226,6 +13226,11 @@ virDomainSetVcpu(virDomainPtr domain,
* The VIR_DOMAIN_GUEST_INFO_LOAD_* constants define the known typed parameter
* keys.
*
+ * VIR_DOMAIN_GUEST_INFO_DEVICES:
+ * Returns information on guest devices.
+ * The VIR_DOMAIN_GUEST_INFO_DEVICE_* constants define the known typed
+ * parameter keys.
+ *
* Using 0 for @types returns all information groups supported by the given
* hypervisor.
*
--
2.55.0

306
centos-9/SOURCES/libvirt-Add-support-for-keeping-VM-running-when-panic-notifier-is-used.patch

@ -0,0 +1,306 @@
From 64e5603f8ea139cd8b7c61b643a0a02bba5885c3 Mon Sep 17 00:00:00 2001
Message-ID: <64e5603f8ea139cd8b7c61b643a0a02bba5885c3.1787144643.git.jdenemar@redhat.com>
From: Peter Krempa <pkrempa@redhat.com>
Date: Wed, 22 Jul 2026 17:13:15 +0200
Subject: [PATCH] Add support for keeping VM running when panic notifier is
used
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Some guest OSes (e.g. windows) can do an internal crash dump and reboot
after a crash. They unfortunately notify the OS before doing the crash
dump though so we need a new possibility for the <on_crash> action to
keep the VM as is.
This patch introduces 'preserve-running' mode for on_crash and wires it
up into the qemu driver.
Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
(cherry picked from commit cdea89dd87a10cd94deb3b067bae483d98c558ed)
https://redhat.atlassian.net/browse/RHEL-242546
---
docs/formatdomain.rst | 3 ++
include/libvirt/libvirt-domain.h | 1 +
src/conf/domain_conf.c | 2 ++
src/conf/schemas/domaincommon.rng | 2 ++
src/libxl/libxl_conf.c | 1 +
src/libxl/libxl_domain.c | 3 ++
src/qemu/qemu_driver.c | 34 ++++++++++++++++++-
src/qemu/qemu_process.c | 18 ++++++++++
.../async-teardown.x86_64-latest.xml | 2 +-
tests/qemuxmlconfdata/async-teardown.xml | 2 +-
tests/qemuxmlconftest.c | 1 +
tools/virsh-domain.c | 3 +-
12 files changed, 68 insertions(+), 4 deletions(-)
diff --git a/docs/formatdomain.rst b/docs/formatdomain.rst
index 8e7577f3b7..b48254f35b 100644
--- a/docs/formatdomain.rst
+++ b/docs/formatdomain.rst
@@ -1998,6 +1998,9 @@ The ``on_crash`` event supports these additional actions :since:`since 0.8.4`.
``coredump-restart``
The crashed domain's core will be dumped, and then the domain will be
restarted with the same configuration
+``preserve-running``
+ The crashed domain will continue to run. This is useful if the guest OS can
+ do an internal crash dump and reboot itself. :since:`Since 12.6.0`
:since:`Since 3.9.0`, the lifecycle events can be configured via the
`virDomainSetLifecycleAction <html/libvirt-libvirt-domain.html#virDomainSetLifecycleAction>`__
diff --git a/include/libvirt/libvirt-domain.h b/include/libvirt/libvirt-domain.h
index 4d7c0099ef..f469ed428d 100644
--- a/include/libvirt/libvirt-domain.h
+++ b/include/libvirt/libvirt-domain.h
@@ -7955,6 +7955,7 @@ typedef enum {
VIR_DOMAIN_LIFECYCLE_ACTION_PRESERVE = 3, /* (Since: 3.9.0) */
VIR_DOMAIN_LIFECYCLE_ACTION_COREDUMP_DESTROY = 4, /* (Since: 3.9.0) */
VIR_DOMAIN_LIFECYCLE_ACTION_COREDUMP_RESTART = 5, /* (Since: 3.9.0) */
+ VIR_DOMAIN_LIFECYCLE_ACTION_PRESERVE_RUNNING = 6, /* (Since: 12.6.0) */
# ifdef VIR_ENUM_SENTINELS
VIR_DOMAIN_LIFECYCLE_ACTION_LAST /* (Since: 3.9.0) */
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 7097ff7065..048aaa10a6 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -302,6 +302,7 @@ VIR_ENUM_IMPL(virDomainLifecycleAction,
"preserve",
"coredump-destroy",
"coredump-restart",
+ "preserve-running",
);
VIR_ENUM_IMPL(virDomainLockFailure,
@@ -5483,6 +5484,7 @@ virDomainDefLifecycleActionAllowed(virDomainLifecycle type,
return true;
case VIR_DOMAIN_LIFECYCLE_ACTION_COREDUMP_DESTROY:
case VIR_DOMAIN_LIFECYCLE_ACTION_COREDUMP_RESTART:
+ case VIR_DOMAIN_LIFECYCLE_ACTION_PRESERVE_RUNNING:
break;
}
break;
diff --git a/src/conf/schemas/domaincommon.rng b/src/conf/schemas/domaincommon.rng
index b8283f129e..f091c87702 100644
--- a/src/conf/schemas/domaincommon.rng
+++ b/src/conf/schemas/domaincommon.rng
@@ -4973,6 +4973,7 @@
destroy: The domain is cleaned up
restart: A new domain is started in place of the old one
preserve: The domain will remain in memory until it is destroyed manually
+ preserve-running: Keep the domain as is, let the guest handle the crash.
rename-restart: a variant of the previous one but where the old domain is
renamed before being saved to allow a restart
coredump-destroy: The crashed domain's core will be dumped, and then the
@@ -4989,6 +4990,7 @@
<value>rename-restart</value>
<value>coredump-destroy</value>
<value>coredump-restart</value>
+ <value>preserve-running</value>
</choice>
</define>
<!--
diff --git a/src/libxl/libxl_conf.c b/src/libxl/libxl_conf.c
index 2b988157fa..c7ca81374b 100644
--- a/src/libxl/libxl_conf.c
+++ b/src/libxl/libxl_conf.c
@@ -111,6 +111,7 @@ libxlActionFromVirLifecycle(virDomainLifecycleAction action)
case VIR_DOMAIN_LIFECYCLE_ACTION_COREDUMP_RESTART:
return LIBXL_ACTION_ON_SHUTDOWN_COREDUMP_RESTART;
+ case VIR_DOMAIN_LIFECYCLE_ACTION_PRESERVE_RUNNING:
case VIR_DOMAIN_LIFECYCLE_ACTION_LAST:
break;
}
diff --git a/src/libxl/libxl_domain.c b/src/libxl/libxl_domain.c
index 9842d6fece..f8b50e2751 100644
--- a/src/libxl/libxl_domain.c
+++ b/src/libxl/libxl_domain.c
@@ -503,6 +503,7 @@ libxlDomainShutdownThread(void *opaque)
case VIR_DOMAIN_LIFECYCLE_ACTION_PRESERVE:
case VIR_DOMAIN_LIFECYCLE_ACTION_COREDUMP_DESTROY:
case VIR_DOMAIN_LIFECYCLE_ACTION_COREDUMP_RESTART:
+ case VIR_DOMAIN_LIFECYCLE_ACTION_PRESERVE_RUNNING:
case VIR_DOMAIN_LIFECYCLE_ACTION_LAST:
goto endjob;
}
@@ -523,6 +524,7 @@ libxlDomainShutdownThread(void *opaque)
goto endjob;
case VIR_DOMAIN_LIFECYCLE_ACTION_PRESERVE:
case VIR_DOMAIN_LIFECYCLE_ACTION_LAST:
+ case VIR_DOMAIN_LIFECYCLE_ACTION_PRESERVE_RUNNING:
goto endjob;
case VIR_DOMAIN_LIFECYCLE_ACTION_COREDUMP_DESTROY:
libxlDomainAutoCoreDump(driver, vm);
@@ -551,6 +553,7 @@ libxlDomainShutdownThread(void *opaque)
case VIR_DOMAIN_LIFECYCLE_ACTION_PRESERVE:
case VIR_DOMAIN_LIFECYCLE_ACTION_COREDUMP_DESTROY:
case VIR_DOMAIN_LIFECYCLE_ACTION_COREDUMP_RESTART:
+ case VIR_DOMAIN_LIFECYCLE_ACTION_PRESERVE_RUNNING:
case VIR_DOMAIN_LIFECYCLE_ACTION_LAST:
goto endjob;
}
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 7e5c374e4c..adc7054f5e 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -3548,6 +3548,11 @@ processGuestPanicEvent(virQEMUDriver *driver,
qemuDomainSaveStatus(vm);
break;
+ case VIR_DOMAIN_LIFECYCLE_ACTION_PRESERVE_RUNNING:
+ virDomainObjSetState(vm, VIR_DOMAIN_RUNNING, VIR_DOMAIN_RUNNING_CRASHED);
+ qemuDomainSaveStatus(vm);
+ break;
+
case VIR_DOMAIN_LIFECYCLE_ACTION_LAST:
break;
}
@@ -3565,6 +3570,8 @@ processGuestPanicEvent(virQEMUDriver *driver,
VIR_DEBUG("Preserving lock state '%s'", NULLSTR(priv->lockState));
break;
+ case VIR_DOMAIN_LIFECYCLE_ACTION_PRESERVE_RUNNING:
+ /* we need to keep resources locked */
case VIR_DOMAIN_LIFECYCLE_ACTION_LAST:
break;
}
@@ -3582,6 +3589,7 @@ processGuestPanicEvent(virQEMUDriver *driver,
case VIR_DOMAIN_LIFECYCLE_ACTION_RESTART:
case VIR_DOMAIN_LIFECYCLE_ACTION_PRESERVE:
case VIR_DOMAIN_LIFECYCLE_ACTION_RESTART_RENAME:
+ case VIR_DOMAIN_LIFECYCLE_ACTION_PRESERVE_RUNNING:
case VIR_DOMAIN_LIFECYCLE_ACTION_LAST:
break;
}
@@ -3608,6 +3616,7 @@ processGuestPanicEvent(virQEMUDriver *driver,
case VIR_DOMAIN_LIFECYCLE_ACTION_PRESERVE:
case VIR_DOMAIN_LIFECYCLE_ACTION_RESTART_RENAME:
+ case VIR_DOMAIN_LIFECYCLE_ACTION_PRESERVE_RUNNING:
case VIR_DOMAIN_LIFECYCLE_ACTION_LAST:
break;
}
@@ -19291,13 +19300,36 @@ qemuDomainModifyLifecycleActionLive(virDomainObj *vm,
case VIR_DOMAIN_LIFECYCLE_ACTION_RESTART_RENAME:
case VIR_DOMAIN_LIFECYCLE_ACTION_COREDUMP_DESTROY:
case VIR_DOMAIN_LIFECYCLE_ACTION_COREDUMP_RESTART:
+ case VIR_DOMAIN_LIFECYCLE_ACTION_PRESERVE_RUNNING:
+ case VIR_DOMAIN_LIFECYCLE_ACTION_LAST:
+ break;
+ }
+ break;
+
+ case VIR_DOMAIN_LIFECYCLE_CRASH:
+ if (vm->def->onCrash == action)
+ break;
+
+ switch (vm->def->onCrash) {
+ case VIR_DOMAIN_LIFECYCLE_ACTION_PRESERVE_RUNNING:
+ panic = QEMU_MONITOR_ACTION_PANIC_NONE;
+ break;
+
+ case VIR_DOMAIN_LIFECYCLE_ACTION_DESTROY:
+ case VIR_DOMAIN_LIFECYCLE_ACTION_RESTART:
+ case VIR_DOMAIN_LIFECYCLE_ACTION_PRESERVE:
+ case VIR_DOMAIN_LIFECYCLE_ACTION_RESTART_RENAME:
+ case VIR_DOMAIN_LIFECYCLE_ACTION_COREDUMP_DESTROY:
+ case VIR_DOMAIN_LIFECYCLE_ACTION_COREDUMP_RESTART:
+ panic = QEMU_MONITOR_ACTION_PANIC_PAUSE;
+ break;
+
case VIR_DOMAIN_LIFECYCLE_ACTION_LAST:
break;
}
break;
case VIR_DOMAIN_LIFECYCLE_POWEROFF:
- case VIR_DOMAIN_LIFECYCLE_CRASH:
case VIR_DOMAIN_LIFECYCLE_LAST:
break;
}
diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
index f14c03c458..dfd70c4c35 100644
--- a/src/qemu/qemu_process.c
+++ b/src/qemu/qemu_process.c
@@ -8100,6 +8100,24 @@ qemuProcessSetupLifecycleActions(virDomainObj *vm,
if (vm->def->onReboot == VIR_DOMAIN_LIFECYCLE_ACTION_DESTROY)
reboot = QEMU_MONITOR_ACTION_REBOOT_SHUTDOWN;
+ switch (vm->def->onCrash) {
+ case VIR_DOMAIN_LIFECYCLE_ACTION_PRESERVE_RUNNING:
+ panic = QEMU_MONITOR_ACTION_PANIC_NONE;
+ break;
+
+ case VIR_DOMAIN_LIFECYCLE_ACTION_DESTROY:
+ case VIR_DOMAIN_LIFECYCLE_ACTION_RESTART:
+ case VIR_DOMAIN_LIFECYCLE_ACTION_PRESERVE:
+ case VIR_DOMAIN_LIFECYCLE_ACTION_RESTART_RENAME:
+ case VIR_DOMAIN_LIFECYCLE_ACTION_COREDUMP_DESTROY:
+ case VIR_DOMAIN_LIFECYCLE_ACTION_COREDUMP_RESTART:
+ panic = QEMU_MONITOR_ACTION_PANIC_PAUSE;
+ break;
+
+ case VIR_DOMAIN_LIFECYCLE_ACTION_LAST:
+ break;
+ }
+
if (shutdown == QEMU_MONITOR_ACTION_SHUTDOWN_KEEP &&
reboot == QEMU_MONITOR_ACTION_REBOOT_KEEP &&
watchdog == QEMU_MONITOR_ACTION_WATCHDOG_KEEP &&
diff --git a/tests/qemuxmlconfdata/async-teardown.x86_64-latest.xml b/tests/qemuxmlconfdata/async-teardown.x86_64-latest.xml
index e98308a9b1..1c7c80ae8a 100644
--- a/tests/qemuxmlconfdata/async-teardown.x86_64-latest.xml
+++ b/tests/qemuxmlconfdata/async-teardown.x86_64-latest.xml
@@ -17,7 +17,7 @@
<clock offset='utc'/>
<on_poweroff>destroy</on_poweroff>
<on_reboot>restart</on_reboot>
- <on_crash>destroy</on_crash>
+ <on_crash>preserve-running</on_crash>
<devices>
<emulator>/usr/bin/qemu-system-x86_64</emulator>
<disk type='block' device='disk'>
diff --git a/tests/qemuxmlconfdata/async-teardown.xml b/tests/qemuxmlconfdata/async-teardown.xml
index 70c1eccc55..149b9ed16d 100644
--- a/tests/qemuxmlconfdata/async-teardown.xml
+++ b/tests/qemuxmlconfdata/async-teardown.xml
@@ -11,7 +11,7 @@
<clock offset='utc'/>
<on_poweroff>destroy</on_poweroff>
<on_reboot>restart</on_reboot>
- <on_crash>destroy</on_crash>
+ <on_crash>preserve-running</on_crash>
<features>
<async-teardown enabled='yes'/>
</features>
diff --git a/tests/qemuxmlconftest.c b/tests/qemuxmlconftest.c
index 45e9a37794..ffceac549c 100644
--- a/tests/qemuxmlconftest.c
+++ b/tests/qemuxmlconftest.c
@@ -3318,6 +3318,7 @@ mymain(void)
DO_TEST_CAPS_LATEST("crypto-builtin");
+ /* this test case also tests 'preserve-running' onCrash action */
DO_TEST_CAPS_LATEST("async-teardown");
DO_TEST_CAPS_ARCH_LATEST("s390-async-teardown", "s390x");
DO_TEST_CAPS_ARCH_LATEST("s390-async-teardown-no-attrib", "s390x");
diff --git a/tools/virsh-domain.c b/tools/virsh-domain.c
index 6e18d195e6..536c0350c7 100644
--- a/tools/virsh-domain.c
+++ b/tools/virsh-domain.c
@@ -6124,7 +6124,8 @@ VIR_ENUM_IMPL(virshDomainLifecycleAction,
"rename-restart",
"preserve",
"coredump-destroy",
- "coredump-restart");
+ "coredump-restart",
+ "none");
static bool
cmdSetLifecycleAction(vshControl *ctl, const vshCmd *cmd)
--
2.55.0

137
centos-9/SOURCES/libvirt-conf-Use-proper-enum-types-for-onReboot-onPoweroff-onCrash-and-onLockFailure.patch

@ -0,0 +1,137 @@
From 1dac70d29c2782687113be80990c29389cfda28e Mon Sep 17 00:00:00 2001
Message-ID: <1dac70d29c2782687113be80990c29389cfda28e.1787144643.git.jdenemar@redhat.com>
From: Peter Krempa <pkrempa@redhat.com>
Date: Tue, 21 Jul 2026 10:21:50 +0200
Subject: [PATCH] conf: Use proper enum types for 'onReboot', 'onPoweroff',
'onCrash', and 'onLockFailure'
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
This ensures that 'switch' statements work correctly.
Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
(cherry picked from commit 997b9816dcaef7ed0d7fdbfe4f1b2354b1b82c58)
https://redhat.atlassian.net/browse/RHEL-242546
---
src/conf/domain_conf.c | 10 ++++++----
src/conf/domain_conf.h | 9 ++++-----
src/libxl/xen_common.c | 10 +++++++---
src/qemu/qemu_driver.c | 2 ++
4 files changed, 19 insertions(+), 12 deletions(-)
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 47200d27c5..7097ff7065 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -14078,21 +14078,23 @@ static int
virDomainEventActionParseXML(xmlXPathContextPtr ctxt,
const char *name,
const char *xpath,
- int *val,
- int defaultVal,
+ unsigned int *val,
+ unsigned int defaultVal,
virEventActionFromStringFunc convFunc)
{
g_autofree char *tmp = virXPathString(xpath, ctxt);
+ int tmpval;
if (tmp == NULL) {
*val = defaultVal;
} else {
- *val = convFunc(tmp);
- if (*val < 0) {
+ tmpval = convFunc(tmp);
+ if (tmpval < 0) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
_("unknown %1$s action: %2$s"), name, tmp);
return -1;
}
+ *val = tmpval;
}
return 0;
}
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index 3a1a2fdce1..fc7584b6c1 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -3217,12 +3217,11 @@ struct _virDomainDef {
virDomainResourceDef *resource;
virDomainIdMapDef idmap;
- /* These 3 are based on virDomainLifecycleAction enum flags */
- int onReboot;
- int onPoweroff;
- int onCrash;
+ virDomainLifecycleAction onReboot;
+ virDomainLifecycleAction onPoweroff;
+ virDomainLifecycleAction onCrash;
- int onLockFailure; /* enum virDomainLockFailureAction */
+ virDomainLockFailureAction onLockFailure;
virDomainPowerManagement pm;
diff --git a/src/libxl/xen_common.c b/src/libxl/xen_common.c
index f19e4f6abb..fcb0339b35 100644
--- a/src/libxl/xen_common.c
+++ b/src/libxl/xen_common.c
@@ -336,33 +336,37 @@ xenParseEventsActions(virConf *conf, virDomainDef *def)
g_autofree char *on_poweroff = NULL;
g_autofree char *on_reboot = NULL;
g_autofree char *on_crash = NULL;
+ int tmp;
if (xenConfigGetString(conf, "on_poweroff", &on_poweroff, "destroy") < 0)
return -1;
- if ((def->onPoweroff = virDomainLifecycleActionTypeFromString(on_poweroff)) < 0) {
+ if ((tmp = virDomainLifecycleActionTypeFromString(on_poweroff)) < 0) {
virReportError(VIR_ERR_INTERNAL_ERROR,
_("unexpected value %1$s for on_poweroff"), on_poweroff);
return -1;
}
+ def->onPoweroff = tmp;
if (xenConfigGetString(conf, "on_reboot", &on_reboot, "restart") < 0)
return -1;
- if ((def->onReboot = virDomainLifecycleActionTypeFromString(on_reboot)) < 0) {
+ if ((tmp = virDomainLifecycleActionTypeFromString(on_reboot)) < 0) {
virReportError(VIR_ERR_INTERNAL_ERROR,
_("unexpected value %1$s for on_reboot"), on_reboot);
return -1;
}
+ def->onReboot = tmp;
if (xenConfigGetString(conf, "on_crash", &on_crash, "restart") < 0)
return -1;
- if ((def->onCrash = virDomainLifecycleActionTypeFromString(on_crash)) < 0) {
+ if ((tmp = virDomainLifecycleActionTypeFromString(on_crash)) < 0) {
virReportError(VIR_ERR_INTERNAL_ERROR,
_("unexpected value %1$s for on_crash"), on_crash);
return -1;
}
+ def->onCrash = tmp;
return 0;
}
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index cae7072831..ddd6e8f7ac 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -3584,6 +3584,8 @@ processGuestPanicEvent(virQEMUDriver *driver,
/* the VM is kept around for debugging */
break;
+ case VIR_DOMAIN_LIFECYCLE_ACTION_RESTART_RENAME:
+ case VIR_DOMAIN_LIFECYCLE_ACTION_LAST:
default:
break;
}
--
2.55.0

38
centos-9/SOURCES/libvirt-conf-schemas-Allow-.-in-schema-for-CPU-flag-name.patch

@ -0,0 +1,38 @@
From 0c8a9769c18f6da3a91e6186833710d32a8f26d6 Mon Sep 17 00:00:00 2001
Message-ID: <0c8a9769c18f6da3a91e6186833710d32a8f26d6.1786713428.git.jdenemar@redhat.com>
From: Peter Krempa <pkrempa@redhat.com>
Date: Mon, 3 Aug 2026 14:53:25 +0200
Subject: [PATCH] conf: schemas: Allow '.' in schema for CPU flag name
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Allow '.' so that CPU features such as:
<feature name='sse4.1'/>
pass schema validation.
Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
(cherry picked from commit 5225c1cb688170bb2748f2f23455da4a7cb8a1bf)
https://redhat.atlassian.net/browse/RHEL-222551
---
src/conf/schemas/cputypes.rng | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/conf/schemas/cputypes.rng b/src/conf/schemas/cputypes.rng
index 8edf1d14e3..eef3807f1a 100644
--- a/src/conf/schemas/cputypes.rng
+++ b/src/conf/schemas/cputypes.rng
@@ -406,7 +406,7 @@
<element name="feature">
<attribute name="name">
<data type="string">
- <param name="pattern">[a-zA-Z0-9\-_]+</param>
+ <param name="pattern">[a-zA-Z0-9\-_.]+</param>
</data>
</attribute>
<empty/>
--
2.55.0

69
centos-9/SOURCES/libvirt-processGuestPanicEvent-Don-t-pass-panic-action-via-parameter.patch

@ -0,0 +1,69 @@
From 5a76fe7b353b85b60ac913860a508989757def1f Mon Sep 17 00:00:00 2001
Message-ID: <5a76fe7b353b85b60ac913860a508989757def1f.1787144643.git.jdenemar@redhat.com>
From: Peter Krempa <pkrempa@redhat.com>
Date: Mon, 20 Jul 2026 13:58:55 +0200
Subject: [PATCH] processGuestPanicEvent: Don't pass panic action via parameter
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
'processGuestPanicEvent' gets the full domain object; there's no point
passing it via 'struct qemuProcessEvent'.
Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
(cherry picked from commit 0f18f6813cbd53cab8ccdb00fab098b66b90c0fb)
https://redhat.atlassian.net/browse/RHEL-242546
---
src/qemu/qemu_driver.c | 6 ++----
src/qemu/qemu_process.c | 3 +--
2 files changed, 3 insertions(+), 6 deletions(-)
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 410cfad066..cae7072831 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -3519,7 +3519,6 @@ qemuProcessGuestPanicEventInfo(virQEMUDriver *driver,
static void
processGuestPanicEvent(virQEMUDriver *driver,
virDomainObj *vm,
- int action,
qemuMonitorEventPanicInfo *info)
{
qemuDomainObjPrivate *priv = vm->privateData;
@@ -3554,7 +3553,7 @@ processGuestPanicEvent(virQEMUDriver *driver,
VIR_WARN("Unable to release lease on %s", vm->def->name);
VIR_DEBUG("Preserving lock state '%s'", NULLSTR(priv->lockState));
- switch (action) {
+ switch (vm->def->onCrash) {
case VIR_DOMAIN_LIFECYCLE_ACTION_COREDUMP_DESTROY:
if (doCoreDumpToAutoDumpPath(driver, vm, flags) < 0)
goto endjob;
@@ -4103,8 +4102,7 @@ static void qemuProcessEventHandler(void *data, void *opaque)
processWatchdogEvent(driver, vm, processEvent->action);
break;
case QEMU_PROCESS_EVENT_GUESTPANIC:
- processGuestPanicEvent(driver, vm, processEvent->action,
- processEvent->data);
+ processGuestPanicEvent(driver, vm, processEvent->data);
break;
case QEMU_PROCESS_EVENT_DEVICE_DELETED:
processDeviceDeletedEvent(driver, vm, processEvent->data);
diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
index 6955e8152c..f14c03c458 100644
--- a/src/qemu/qemu_process.c
+++ b/src/qemu/qemu_process.c
@@ -1358,8 +1358,7 @@ qemuProcessHandleGuestPanic(qemuMonitor *mon G_GNUC_UNUSED,
{
virObjectLock(vm);
- qemuProcessEventSubmit(vm, QEMU_PROCESS_EVENT_GUESTPANIC,
- vm->def->onCrash, 0, info);
+ qemuProcessEventSubmit(vm, QEMU_PROCESS_EVENT_GUESTPANIC, 0, 0, info);
virObjectUnlock(vm);
}
--
2.55.0

239
centos-9/SOURCES/libvirt-qemu-Always-assume-support-for-QEMU_CAPS_SET_ACTION.patch

@ -0,0 +1,239 @@
From 000b2e9a69d6b361eb6b435cdfafdf8267c1f925 Mon Sep 17 00:00:00 2001
Message-ID: <000b2e9a69d6b361eb6b435cdfafdf8267c1f925.1787144643.git.jdenemar@redhat.com>
From: Peter Krempa <pkrempa@redhat.com>
Date: Mon, 20 Jul 2026 13:27:20 +0200
Subject: [PATCH] qemu: Always assume support for 'QEMU_CAPS_SET_ACTION'
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
The 'set-action' QMP command was introduced in qemu-6.0 and can't be
disabled in any way. Oldest qemu we support is qemu-7.2 so all versions
now have it.
Remove all conditional code which depends on the 'set-action' command.
Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
(cherry picked from commit 771f17c9072c6aacc7bc10e01afc14421512c913)
https://redhat.atlassian.net/browse/RHEL-242546
---
src/qemu/qemu_command.c | 13 +++----------
src/qemu/qemu_driver.c | 16 ----------------
src/qemu/qemu_hotplug.c | 10 +---------
src/qemu/qemu_process.c | 31 +------------------------------
src/qemu/qemu_validate.c | 14 ++------------
5 files changed, 7 insertions(+), 77 deletions(-)
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index 963dc2afa3..6bec3ad316 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -6167,16 +6167,9 @@ qemuBuildPMCommandLine(virCommand *cmd,
{
virQEMUCaps *qemuCaps = priv->qemuCaps;
- if (virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_SET_ACTION)) {
- /* with new qemu we always want '-no-shutdown' on startup and we set
- * all the other behaviour later during startup */
- virCommandAddArg(cmd, "-no-shutdown");
- } else {
- if (priv->allowReboot == VIR_TRISTATE_BOOL_NO)
- virCommandAddArg(cmd, "-no-reboot");
- else
- virCommandAddArg(cmd, "-no-shutdown");
- }
+ /* with new qemu we always want '-no-shutdown' on startup and we set
+ * all the other behaviour later during startup */
+ virCommandAddArg(cmd, "-no-shutdown");
/* Use old syntax of -no-acpi only if qemu didn't report that it supports the
* new syntax */
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 3c7de45301..e24ac26f59 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -19248,9 +19248,6 @@ qemuDomainModifyLifecycleActionLive(virDomainObj *vm,
qemuDomainObjPrivate *priv = vm->privateData;
int rc;
- if (!virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_SET_ACTION))
- return 0;
-
/* For now we only update 'reboot' action here as we want to keep the
* shutdown action as is (we're emulating the outcome anyways)) */
if (type != VIR_DOMAIN_LIFECYCLE_REBOOT ||
@@ -19300,7 +19297,6 @@ qemuDomainSetLifecycleAction(virDomainPtr dom,
{
virQEMUDriver *driver = dom->conn->privateData;
g_autoptr(virQEMUDriverConfig) cfg = virQEMUDriverGetConfig(driver);
- qemuDomainObjPrivate *priv;
virDomainObj *vm = NULL;
virDomainDef *def = NULL;
virDomainDef *persistentDef = NULL;
@@ -19317,8 +19313,6 @@ qemuDomainSetLifecycleAction(virDomainPtr dom,
if (!(vm = qemuDomainObjFromDomain(dom)))
goto cleanup;
- priv = vm->privateData;
-
if (virDomainSetLifecycleActionEnsureACL(dom->conn, vm->def) < 0)
goto cleanup;
@@ -19333,16 +19327,6 @@ qemuDomainSetLifecycleAction(virDomainPtr dom,
goto endjob;
if (def) {
- if (!virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_SET_ACTION)) {
- if (priv->allowReboot == VIR_TRISTATE_BOOL_NO ||
- (type == VIR_DOMAIN_LIFECYCLE_REBOOT &&
- def->onReboot != action)) {
- virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
- _("cannot update lifecycle action because QEMU was started with incompatible -no-reboot setting"));
- goto endjob;
- }
- }
-
if (qemuDomainModifyLifecycleActionLive(vm, type, action) < 0)
goto endjob;
diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c
index 8944062aa4..86cbe438a3 100644
--- a/src/qemu/qemu_hotplug.c
+++ b/src/qemu/qemu_hotplug.c
@@ -3069,7 +3069,7 @@ qemuDomainAttachWatchdog(virDomainObj *vm,
if (vm->def->nwatchdogs) {
/* Domain already has a watchdog and all must have the same action. */
rv = 0;
- } else if (virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_SET_ACTION)) {
+ } else {
/* QEMU doesn't have a 'dump' action; we tell qemu to 'pause', then
libvirt listens for the watchdog event, and we perform the dump
ourselves. so convert 'dump' to 'pause' for the qemu cli */
@@ -3111,14 +3111,6 @@ qemuDomainAttachWatchdog(virDomainObj *vm,
QEMU_MONITOR_ACTION_REBOOT_KEEP,
watchdogaction,
QEMU_MONITOR_ACTION_PANIC_KEEP);
- } else {
- virDomainWatchdogAction actualAction = watchdog->action;
-
- if (actualAction == VIR_DOMAIN_WATCHDOG_ACTION_DUMP)
- actualAction = VIR_DOMAIN_WATCHDOG_ACTION_PAUSE;
-
- rv = qemuMonitorSetWatchdogAction(priv->mon,
- virDomainWatchdogActionTypeToString(actualAction));
}
if (rv >= 0)
diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
index 1540c74087..5dfc9e5db3 100644
--- a/src/qemu/qemu_process.c
+++ b/src/qemu/qemu_process.c
@@ -6811,24 +6811,6 @@ qemuProcessRebootAllowed(const virDomainDef *def)
}
-static void
-qemuProcessPrepareAllowReboot(virDomainObj *vm)
-{
- virDomainDef *def = vm->def;
- qemuDomainObjPrivate *priv = vm->privateData;
-
- /* with 'set-action' QMP command we don't need to keep this around as
- * we always update qemu with the proper state */
- if (virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_SET_ACTION))
- return;
-
- if (priv->allowReboot != VIR_TRISTATE_BOOL_ABSENT)
- return;
-
- priv->allowReboot = virTristateBoolFromBool(qemuProcessRebootAllowed(def));
-}
-
-
static int
qemuProcessUpdateSEVInfo(virDomainObj *vm)
{
@@ -7000,8 +6982,6 @@ qemuProcessPrepareDomain(virQEMUDriver *driver,
/* Track if this domain remembers original owner */
priv->rememberOwner = cfg->rememberOwner;
- qemuProcessPrepareAllowReboot(vm);
-
/*
* Normally PCI addresses are assigned in the virDomainCreate
* or virDomainDefine methods. We might still need to assign
@@ -8130,9 +8110,6 @@ qemuProcessSetupLifecycleActions(virDomainObj *vm,
qemuDomainObjPrivate *priv = vm->privateData;
int rc;
- if (!(virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_SET_ACTION)))
- return 0;
-
/* for now we handle only onReboot->destroy here as an alternative to
* '-no-reboot' on the commandline */
if (vm->def->onReboot != VIR_DOMAIN_LIFECYCLE_ACTION_DESTROY)
@@ -9826,10 +9803,6 @@ qemuProcessReconnect(void *opaque)
if (qemuExtDevicesInitPaths(cfg, obj->def) < 0)
goto error;
- /* If we are connecting to a guest started by old libvirt there is no
- * allowReboot in status XML and we need to initialize it. */
- qemuProcessPrepareAllowReboot(obj);
-
if (qemuHostdevUpdateActiveDomainDevices(driver, obj->def) < 0)
goto error;
@@ -10064,9 +10037,7 @@ qemuProcessReconnect(void *opaque)
* domain crashed; otherwise, if the monitor was started,
* then we can blame ourselves, else we failed before the
* monitor started so we don't really know. */
- if (!priv->mon && tryMonReconn &&
- (priv->allowReboot == VIR_TRISTATE_BOOL_YES ||
- virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_SET_ACTION)))
+ if (!priv->mon && tryMonReconn)
state = VIR_DOMAIN_SHUTOFF_CRASHED;
else if (priv->mon)
state = VIR_DOMAIN_SHUTOFF_DAEMON;
diff --git a/src/qemu/qemu_validate.c b/src/qemu/qemu_validate.c
index 3e84ef7139..fd22ac1375 100644
--- a/src/qemu/qemu_validate.c
+++ b/src/qemu/qemu_validate.c
@@ -3589,10 +3589,7 @@ qemuValidateDomainDeviceDefDiskBlkdeviotune(const virDomainDiskDef *disk,
static int
-qemuValidateDomainDeviceDefDiskTransient(const virDomainDiskDef *disk,
- const virDomainDef *def,
- virQEMUCaps *qemuCaps)
-
+qemuValidateDomainDeviceDefDiskTransient(const virDomainDiskDef *disk)
{
virStorageType actualType = virStorageSourceGetActualType(disk->src);
@@ -3626,13 +3623,6 @@ qemuValidateDomainDeviceDefDiskTransient(const virDomainDiskDef *disk,
}
if (disk->transientShareBacking == VIR_TRISTATE_BOOL_YES) {
- if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_SET_ACTION) &&
- !qemuProcessRebootAllowed(def)) {
- virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
- _("transient disk backing image sharing with destroy action of lifecycle isn't supported by this QEMU binary"));
- return -1;
- }
-
/* sharing the backing file requires hotplug of the disk in the qemu driver */
switch (disk->bus) {
case VIR_DOMAIN_DISK_BUS_USB:
@@ -3678,7 +3668,7 @@ qemuValidateDomainDeviceDefDisk(const virDomainDiskDef *disk,
if (qemuValidateDomainDeviceDefDiskBlkdeviotune(disk, def) < 0)
return -1;
- if (qemuValidateDomainDeviceDefDiskTransient(disk, def, qemuCaps) < 0)
+ if (qemuValidateDomainDeviceDefDiskTransient(disk) < 0)
return -1;
if (disk->src->shared && !disk->src->readonly &&
--
2.55.0

50
centos-9/SOURCES/libvirt-qemu-Fix-proper-ordering-of-virtlockd-shutdown.patch

@ -0,0 +1,50 @@
From c2b993df4c9dfa1c8ff49db685761dd59ba72073 Mon Sep 17 00:00:00 2001
Message-ID: <c2b993df4c9dfa1c8ff49db685761dd59ba72073.1787144643.git.jdenemar@redhat.com>
From: Peter Krempa <pkrempa@redhat.com>
Date: Tue, 18 Aug 2026 10:09:06 +0200
Subject: [PATCH] qemu: Fix proper ordering of 'virtlockd' shutdown
In commit aa1bf13b9caa4ef893cd4fdbaa111d5da73aa120 I attempted to fix
the ordering of virtlockd and virtlogd during shutdown but I made a typo
in the name of 'virtlockd.service' (missing 'd').
Fixes: aa1bf13b9caa4ef893cd4fdbaa111d5da73aa120
Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Pavel Hrdina <phrdina@redhat.com>
Reviewed-by: Martin Kletzander <mkletzan@redhat.com>
(cherry picked from commit 82b39d0580ecb6aa4a6c88eabb85cc6d6bafd559)
https://redhat.atlassian.net/browse/RHEL-180876
---
src/qemu/virtqemud.service.extra.in | 2 +-
src/remote/libvirtd.service.in | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/qemu/virtqemud.service.extra.in b/src/qemu/virtqemud.service.extra.in
index 3cc2edcfd0..df36890704 100644
--- a/src/qemu/virtqemud.service.extra.in
+++ b/src/qemu/virtqemud.service.extra.in
@@ -9,7 +9,7 @@ After=virtlockd.socket
# To ensure that our helper daemons are not shut down before the main daemon
# shuts down we need also explicit ordering with the .service unit
After=virtlogd.service
-After=virtlock.service
+After=virtlockd.service
Wants=systemd-machined.service
After=systemd-machined.service
After=remote-fs.target
diff --git a/src/remote/libvirtd.service.in b/src/remote/libvirtd.service.in
index f26494d646..ccdb8379f3 100644
--- a/src/remote/libvirtd.service.in
+++ b/src/remote/libvirtd.service.in
@@ -18,7 +18,7 @@ After=virtlockd.socket
# To ensure that our helper daemons are not shut down before the main daemon
# shuts down we need also explicit ordering with the .service unit
After=virtlogd.service
-After=virtlock.service
+After=virtlockd.service
Wants=systemd-machined.service
After=network.target
After=dbus.service
--
2.55.0

149
centos-9/SOURCES/libvirt-qemu-Implement-device-info-for-virDomainGetGuestInfo-API.patch

@ -0,0 +1,149 @@
From 4d9f92a466e0d78d3c5388a03eaf56f67ac67211 Mon Sep 17 00:00:00 2001
Message-ID: <4d9f92a466e0d78d3c5388a03eaf56f67ac67211.1787144643.git.jdenemar@redhat.com>
From: Michal Privoznik <mprivozn@redhat.com>
Date: Wed, 12 Aug 2026 13:44:48 +0200
Subject: [PATCH] qemu: Implement device info for virDomainGetGuestInfo() API
Use freshly introduced qemuAgentGetGuestDeviceInfo() to implement
support of VIR_DOMAIN_GUEST_INFO_DEVICES type of
virDomainGetGuestInfo() API in the QEMU driver.
Resolves: https://redhat.atlassian.net/browse/RHEL-235731
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
Reviewed-by: Peter Krempa <pkrempa@redhat.com>
(cherry picked from commit 21a3c6f27cd60e8c00d4c0f6825f9b96e13a7a34)
Conflicts:
src/libvirt_private.syms: Because v12.4.0-rc1~76 is not being backported
(it moved parts of the agent code under
src/hypervisor for wider use).
Resolves: https://redhat.atlassian.net/browse/RHEL-243300
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
---
src/qemu/qemu_agent.c | 36 ++++++++++++++++++++++++++++++++++++
src/qemu/qemu_agent.h | 5 +++++
src/qemu/qemu_driver.c | 23 ++++++++++++++++++++++-
3 files changed, 63 insertions(+), 1 deletion(-)
diff --git a/src/qemu/qemu_agent.c b/src/qemu/qemu_agent.c
index 67faa5aa97..4add6345b6 100644
--- a/src/qemu/qemu_agent.c
+++ b/src/qemu/qemu_agent.c
@@ -2718,3 +2718,39 @@ qemuAgentGetGuestDeviceInfo(qemuAgent *agent,
g_clear_pointer(info, g_free);
return -1;
}
+
+
+void
+qemuAgentGuestDeviceInfoFormatParams(qemuAgentGuestDeviceInfo **devices,
+ size_t ndevices,
+ virTypedParamList *list)
+{
+ size_t i;
+
+ virTypedParamListAddUInt(list, ndevices, VIR_DOMAIN_GUEST_INFO_DEVICE_COUNT);
+
+ for (i = 0; i < ndevices; i++) {
+ virTypedParamListAddString(list, devices[i]->driverName,
+ VIR_DOMAIN_GUEST_INFO_DEVICE_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_DEVICE_SUFFIX_DRIVER_NAME, i);
+
+ if (devices[i]->driverDate != -1) {
+ /* Guest agent reports this in nanoseconds, our API in seconds. */
+ virTypedParamListAddLLong(list, devices[i]->driverDate / 1000000000,
+ VIR_DOMAIN_GUEST_INFO_DEVICE_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_DEVICE_SUFFIX_DRIVER_DATE, i);
+ }
+
+ if (devices[i]->driverVersion) {
+ virTypedParamListAddString(list, devices[i]->driverVersion,
+ VIR_DOMAIN_GUEST_INFO_DEVICE_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_DEVICE_SUFFIX_DRIVER_VERSION, i);
+ }
+
+ if (devices[i]->pci) {
+ virTypedParamListAddString(list, "pci",
+ VIR_DOMAIN_GUEST_INFO_DEVICE_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_DEVICE_SUFFIX_ID_TYPE, i);
+ virTypedParamListAddUInt(list, devices[i]->pci->vendorID,
+ VIR_DOMAIN_GUEST_INFO_DEVICE_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_DEVICE_SUFFIX_PCI_VENDOR, i);
+ virTypedParamListAddUInt(list, devices[i]->pci->deviceID,
+ VIR_DOMAIN_GUEST_INFO_DEVICE_PREFIX "%zu" VIR_DOMAIN_GUEST_INFO_DEVICE_SUFFIX_PCI_DEVICE, i);
+ }
+ }
+}
diff --git a/src/qemu/qemu_agent.h b/src/qemu/qemu_agent.h
index a6be2ff387..d19b5b2134 100644
--- a/src/qemu/qemu_agent.h
+++ b/src/qemu/qemu_agent.h
@@ -216,3 +216,8 @@ G_DEFINE_AUTOPTR_CLEANUP_FUNC(qemuAgentGuestDeviceInfo, qemuAgentGuestDeviceInfo
int qemuAgentGetGuestDeviceInfo(qemuAgent *agent,
qemuAgentGuestDeviceInfo ***info,
bool report_unsupported);
+
+void
+qemuAgentGuestDeviceInfoFormatParams(qemuAgentGuestDeviceInfo **devices,
+ size_t ndevices,
+ virTypedParamList *list);
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index adc7054f5e..30f70d2dc2 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -19688,7 +19688,8 @@ static const unsigned int qemuDomainGetGuestInfoSupportedTypes =
VIR_DOMAIN_GUEST_INFO_FILESYSTEM |
VIR_DOMAIN_GUEST_INFO_DISKS |
VIR_DOMAIN_GUEST_INFO_INTERFACES |
- VIR_DOMAIN_GUEST_INFO_LOAD;
+ VIR_DOMAIN_GUEST_INFO_LOAD |
+ VIR_DOMAIN_GUEST_INFO_DEVICES;
static int
qemuDomainGetGuestInfoCheckSupport(unsigned int types,
@@ -19896,6 +19897,8 @@ qemuDomainGetGuestInfo(virDomainPtr dom,
double load5m = 0;
double load15m = 0;
bool format_load = false;
+ qemuAgentGuestDeviceInfo **devices = NULL;
+ size_t ndevices = 0;
size_t i;
g_autoptr(virTypedParamList) list = virTypedParamListNew();
@@ -19975,6 +19978,14 @@ qemuDomainGetGuestInfo(virDomainPtr dom,
format_load = true;
}
+ if (supportedTypes & VIR_DOMAIN_GUEST_INFO_DEVICES) {
+ rc = qemuAgentGetGuestDeviceInfo(agent, &devices, report_unsupported);
+ if (rc == -1)
+ goto exitagent;
+ if (rc >= 0)
+ ndevices = rc;
+ }
+
qemuDomainObjExitAgent(vm, agent);
virDomainObjEndAgentJob(vm);
@@ -20007,6 +20018,10 @@ qemuDomainGetGuestInfo(virDomainPtr dom,
virTypedParamListAddDouble(list, load15m, VIR_DOMAIN_GUEST_INFO_LOAD_15M);
}
+ if (ndevices > 0) {
+ qemuAgentGuestDeviceInfoFormatParams(devices, ndevices, list);
+ }
+
if (virTypedParamListSteal(list, params, nparams) < 0)
goto cleanup;
@@ -20024,6 +20039,12 @@ qemuDomainGetGuestInfo(virDomainPtr dom,
virDomainInterfaceFree(ifaces[i]);
}
g_free(ifaces);
+ if (devices && ndevices > 0) {
+ for (i = 0; i < ndevices; i++) {
+ qemuAgentGuestDeviceInfoFree(devices[i]);
+ }
+ g_free(devices);
+ }
virDomainObjEndAPI(&vm);
return ret;
--
2.55.0

313
centos-9/SOURCES/libvirt-qemu-Remove-allowReboot-field.patch

@ -0,0 +1,313 @@
From 93162be780e0992d11a7cb46d42a71c23a5398bc Mon Sep 17 00:00:00 2001
Message-ID: <93162be780e0992d11a7cb46d42a71c23a5398bc.1787144643.git.jdenemar@redhat.com>
From: Peter Krempa <pkrempa@redhat.com>
Date: Mon, 20 Jul 2026 13:35:07 +0200
Subject: [PATCH] qemu: Remove 'allowReboot' field
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
The value is no longer used. Remove it including the status XML
handling.
Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
(cherry picked from commit 94bd5174d20fafafc2fa67fae101b78b46ec6196)
https://redhat.atlassian.net/browse/RHEL-242546
---
src/qemu/qemu_domain.c | 33 -------------------
src/qemu/qemu_domain.h | 17 ----------
.../qemustatusxml2xmldata/backup-pull-in.xml | 1 -
.../blockjob-blockdev-in.xml | 1 -
.../blockjob-mirror-in.xml | 1 -
.../memory-backing-dir-in.xml | 1 -
.../migration-in-params-in.xml | 1 -
.../migration-out-nbd-bitmaps-in.xml | 1 -
.../migration-out-nbd-out.xml | 1 -
.../migration-out-nbd-tls-out.xml | 1 -
.../migration-out-params-in.xml | 1 -
tests/qemustatusxml2xmldata/modern-in.xml | 1 -
.../qcow2-data-file-in.xml | 1 -
.../throttlefilter-out.xml | 1 -
tests/qemustatusxml2xmldata/upgrade-out.xml | 1 -
.../qemustatusxml2xmldata/vcpus-multi-in.xml | 1 -
16 files changed, 64 deletions(-)
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
index 78587e2574..703bfc5867 100644
--- a/src/qemu/qemu_domain.c
+++ b/src/qemu/qemu_domain.c
@@ -1946,8 +1946,6 @@ qemuDomainObjPrivateDataClear(qemuDomainObjPrivate *priv)
priv->rememberOwner = false;
- priv->allowReboot = VIR_TRISTATE_BOOL_ABSENT;
-
g_clear_pointer(&priv->migrationCaps, virBitmapFree);
virHashRemoveAll(priv->blockjobs);
@@ -2621,17 +2619,6 @@ qemuDomainObjPrivateXMLFormatBackups(virBuffer *buf,
}
-void
-qemuDomainObjPrivateXMLFormatAllowReboot(virBuffer *buf,
- virTristateBool allowReboot)
-{
- if (allowReboot) {
- virBufferAsprintf(buf, "<allowReboot value='%s'/>\n",
- virTristateBoolTypeToString(allowReboot));
- }
-}
-
-
static void
qemuDomainObjPrivateXMLFormatPR(virBuffer *buf,
qemuDomainObjPrivate *priv)
@@ -2812,8 +2799,6 @@ qemuDomainObjPrivateXMLFormat(virBuffer *buf,
if (priv->rememberOwner)
virBufferAddLit(buf, "<rememberOwner/>\n");
- qemuDomainObjPrivateXMLFormatAllowReboot(buf, priv->allowReboot);
-
qemuDomainObjPrivateXMLFormatPR(buf, priv);
virBufferAsprintf(buf, "<nodename index='%llu'/>\n", priv->nodenameindex);
@@ -3302,21 +3287,6 @@ qemuDomainObjPrivateXMLParseBackups(qemuDomainObjPrivate *priv,
}
-int
-qemuDomainObjPrivateXMLParseAllowReboot(xmlXPathContextPtr ctxt,
- virTristateBool *allowReboot)
-{
- xmlNodePtr node = virXPathNode("./allowReboot", ctxt);
-
- /* Allow value='default' as the input here, because old versions
- * of libvirt produced that output and we need to be able to read
- * it back to correctly handle running guests on daemon upgrade */
- return virXMLPropTristateBoolAllowDefault(node, "value",
- VIR_XML_PROP_NONE,
- allowReboot);
-}
-
-
static void
qemuDomainObjPrivateXMLParsePR(xmlXPathContextPtr ctxt,
bool *prDaemonRunning)
@@ -3548,9 +3518,6 @@ qemuDomainObjPrivateXMLParse(xmlXPathContextPtr ctxt,
priv->chardevStdioLogd = virXPathBoolean("boolean(./chardevStdioLogd)",
ctxt) == 1;
- if (qemuDomainObjPrivateXMLParseAllowReboot(ctxt, &priv->allowReboot) < 0)
- return -1;
-
qemuDomainObjPrivateXMLParsePR(ctxt, &priv->prDaemonRunning);
if (qemuDomainObjPrivateXMLParseBlockjobs(vm, priv, ctxt) < 0)
diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h
index a8bf301d51..14fd1b603b 100644
--- a/src/qemu/qemu_domain.h
+++ b/src/qemu/qemu_domain.h
@@ -133,15 +133,6 @@ struct _qemuDomainObjPrivate {
bool fakeReboot;
bool fakeReset;
bool pausedShutdown;
- /* allowReboot:
- *
- * Unused with new QEMU versions which have QEMU_CAPS_SET_ACTION.
- *
- * Otherwise if it's set to VIR_TRISTATE_BOOL_YES, QEMU was started with
- * -no-shutdown, and if set to VIR_TRISTATE_BOOL_NO qemu was started with
- * -no-reboot instead.
- */
- virTristateBool allowReboot;
unsigned long migMaxBandwidth;
char *origname;
@@ -1015,14 +1006,6 @@ qemuDomainFixupCPUs(virDomainObj *vm,
char *
qemuDomainGetMachineName(virDomainObj *vm);
-void
-qemuDomainObjPrivateXMLFormatAllowReboot(virBuffer *buf,
- virTristateBool allowReboot);
-
-int
-qemuDomainObjPrivateXMLParseAllowReboot(xmlXPathContextPtr ctxt,
- virTristateBool *allowReboot);
-
void
qemuDomainPrepareDiskSourceData(virDomainDiskDef *disk,
virStorageSource *src);
diff --git a/tests/qemustatusxml2xmldata/backup-pull-in.xml b/tests/qemustatusxml2xmldata/backup-pull-in.xml
index 2cedcc3cf2..fcaff2e38a 100644
--- a/tests/qemustatusxml2xmldata/backup-pull-in.xml
+++ b/tests/qemustatusxml2xmldata/backup-pull-in.xml
@@ -233,7 +233,6 @@
<channelTargetDir path='/var/lib/libvirt/qemu/channel/target/domain-4-copy'/>
<memoryBackingDir path='/var/lib/libvirt/qemu/ram/4-copy'/>
<chardevStdioLogd/>
- <allowReboot value='yes'/>
<nodename index='0'/>
<fdset index='0'/>
<blockjobs active='yes'>
diff --git a/tests/qemustatusxml2xmldata/blockjob-blockdev-in.xml b/tests/qemustatusxml2xmldata/blockjob-blockdev-in.xml
index 1c45fad370..58afae4168 100644
--- a/tests/qemustatusxml2xmldata/blockjob-blockdev-in.xml
+++ b/tests/qemustatusxml2xmldata/blockjob-blockdev-in.xml
@@ -232,7 +232,6 @@
<channelTargetDir path='/var/lib/libvirt/qemu/channel/target/domain-4-copy'/>
<memoryBackingDir path='/var/lib/libvirt/qemu/ram/4-copy'/>
<chardevStdioLogd/>
- <allowReboot value='yes'/>
<nodename index='0'/>
<fdset index='0'/>
<blockjobs active='yes'>
diff --git a/tests/qemustatusxml2xmldata/blockjob-mirror-in.xml b/tests/qemustatusxml2xmldata/blockjob-mirror-in.xml
index df11e83ced..be85202c02 100644
--- a/tests/qemustatusxml2xmldata/blockjob-mirror-in.xml
+++ b/tests/qemustatusxml2xmldata/blockjob-mirror-in.xml
@@ -22,7 +22,6 @@
<libDir path='/tmp'/>
<channelTargetDir path='/var/lib/libvirt/qemu/channel/target'/>
<memoryBackingDir path='/var/lib/libvirt/qemu/ram/1-QEMUGuest1'/>
- <allowReboot value='yes'/>
<nodename index='0'/>
<fdset index='0'/>
<blockjobs active='yes'/>
diff --git a/tests/qemustatusxml2xmldata/memory-backing-dir-in.xml b/tests/qemustatusxml2xmldata/memory-backing-dir-in.xml
index eea671a41c..a1a1845495 100644
--- a/tests/qemustatusxml2xmldata/memory-backing-dir-in.xml
+++ b/tests/qemustatusxml2xmldata/memory-backing-dir-in.xml
@@ -22,7 +22,6 @@
<libDir path='/tmp'/>
<channelTargetDir path='/var/lib/libvirt/qemu/channel/target'/>
<memoryBackingDir path='/some/random/path/1-QEMUGuest1'/>
- <allowReboot value='yes'/>
<nodename index='0'/>
<fdset index='0'/>
<blockjobs active='no'/>
diff --git a/tests/qemustatusxml2xmldata/migration-in-params-in.xml b/tests/qemustatusxml2xmldata/migration-in-params-in.xml
index 861d8eeadb..986e5455aa 100644
--- a/tests/qemustatusxml2xmldata/migration-in-params-in.xml
+++ b/tests/qemustatusxml2xmldata/migration-in-params-in.xml
@@ -256,7 +256,6 @@
<channelTargetDir path='/var/lib/libvirt/qemu/channel/target/domain-1-nest'/>
<memoryBackingDir path='/var/lib/libvirt/qemu/ram/1-nest'/>
<chardevStdioLogd/>
- <allowReboot value='yes'/>
<nodename index='0'/>
<fdset index='0'/>
<blockjobs active='no'/>
diff --git a/tests/qemustatusxml2xmldata/migration-out-nbd-bitmaps-in.xml b/tests/qemustatusxml2xmldata/migration-out-nbd-bitmaps-in.xml
index 5d76545513..4f1fb07c1b 100644
--- a/tests/qemustatusxml2xmldata/migration-out-nbd-bitmaps-in.xml
+++ b/tests/qemustatusxml2xmldata/migration-out-nbd-bitmaps-in.xml
@@ -342,7 +342,6 @@
</cpu>
<chardevStdioLogd/>
<rememberOwner/>
- <allowReboot value='yes'/>
<nodename index='3'/>
<fdset index='0'/>
<blockjobs active='yes'>
diff --git a/tests/qemustatusxml2xmldata/migration-out-nbd-out.xml b/tests/qemustatusxml2xmldata/migration-out-nbd-out.xml
index 581cf28286..a69d1c4590 100644
--- a/tests/qemustatusxml2xmldata/migration-out-nbd-out.xml
+++ b/tests/qemustatusxml2xmldata/migration-out-nbd-out.xml
@@ -259,7 +259,6 @@
<channelTargetDir path='/var/lib/libvirt/qemu/channel/target/domain-4-upstream'/>
<memoryBackingDir path='/var/lib/libvirt/qemu/ram/4-upstream'/>
<chardevStdioLogd/>
- <allowReboot value='yes'/>
<nodename index='0'/>
<fdset index='0'/>
<blockjobs active='no'/>
diff --git a/tests/qemustatusxml2xmldata/migration-out-nbd-tls-out.xml b/tests/qemustatusxml2xmldata/migration-out-nbd-tls-out.xml
index dacaa3e42f..86a7fbc187 100644
--- a/tests/qemustatusxml2xmldata/migration-out-nbd-tls-out.xml
+++ b/tests/qemustatusxml2xmldata/migration-out-nbd-tls-out.xml
@@ -288,7 +288,6 @@
<channelTargetDir path='/var/lib/libvirt/qemu/channel/target/domain-3-upstream'/>
<memoryBackingDir path='/var/lib/libvirt/qemu/ram/3-upstream'/>
<chardevStdioLogd/>
- <allowReboot value='yes'/>
<nodename index='0'/>
<fdset index='0'/>
<blockjobs active='no'/>
diff --git a/tests/qemustatusxml2xmldata/migration-out-params-in.xml b/tests/qemustatusxml2xmldata/migration-out-params-in.xml
index b914236b62..f4e921ab38 100644
--- a/tests/qemustatusxml2xmldata/migration-out-params-in.xml
+++ b/tests/qemustatusxml2xmldata/migration-out-params-in.xml
@@ -270,7 +270,6 @@
<channelTargetDir path='/var/lib/libvirt/qemu/channel/target/domain-7-nest'/>
<memoryBackingDir path='/var/lib/libvirt/qemu/ram/7-nest'/>
<chardevStdioLogd/>
- <allowReboot value='yes'/>
<nodename index='0'/>
<fdset index='0'/>
<blockjobs active='no'/>
diff --git a/tests/qemustatusxml2xmldata/modern-in.xml b/tests/qemustatusxml2xmldata/modern-in.xml
index 3b3e831759..1193c1997e 100644
--- a/tests/qemustatusxml2xmldata/modern-in.xml
+++ b/tests/qemustatusxml2xmldata/modern-in.xml
@@ -260,7 +260,6 @@
<channelTargetDir path='/var/lib/libvirt/qemu/channel/target/domain-1-upstream'/>
<memoryBackingDir path='/var/lib/libvirt/qemu/ram/1-upstream'/>
<chardevStdioLogd/>
- <allowReboot value='yes'/>
<nodename index='123'/>
<fdset index='321'/>
<blockjobs active='no'/>
diff --git a/tests/qemustatusxml2xmldata/qcow2-data-file-in.xml b/tests/qemustatusxml2xmldata/qcow2-data-file-in.xml
index 2675214417..951b4abfbe 100644
--- a/tests/qemustatusxml2xmldata/qcow2-data-file-in.xml
+++ b/tests/qemustatusxml2xmldata/qcow2-data-file-in.xml
@@ -22,7 +22,6 @@
<libDir path='/tmp'/>
<channelTargetDir path='/var/lib/libvirt/qemu/channel/target'/>
<memoryBackingDir path='/var/lib/libvirt/qemu/ram/1-QEMUGuest1'/>
- <allowReboot value='yes'/>
<nodename index='0'/>
<fdset index='0'/>
<blockjobs active='no'/>
diff --git a/tests/qemustatusxml2xmldata/throttlefilter-out.xml b/tests/qemustatusxml2xmldata/throttlefilter-out.xml
index 8751a42cce..eee01c79b1 100644
--- a/tests/qemustatusxml2xmldata/throttlefilter-out.xml
+++ b/tests/qemustatusxml2xmldata/throttlefilter-out.xml
@@ -233,7 +233,6 @@
<channelTargetDir path='/var/lib/libvirt/qemu/channel/target/domain-4-copy'/>
<memoryBackingDir path='/var/lib/libvirt/qemu/ram/4-copy'/>
<chardevStdioLogd/>
- <allowReboot value='yes'/>
<nodename index='0'/>
<fdset index='0'/>
<blockjobs active='no'/>
diff --git a/tests/qemustatusxml2xmldata/upgrade-out.xml b/tests/qemustatusxml2xmldata/upgrade-out.xml
index c7bc7128df..fd1c174200 100644
--- a/tests/qemustatusxml2xmldata/upgrade-out.xml
+++ b/tests/qemustatusxml2xmldata/upgrade-out.xml
@@ -258,7 +258,6 @@
<channelTargetDir path='/var/lib/libvirt/qemu/channel/target/domain-1-upstream'/>
<memoryBackingDir path='/var/lib/libvirt/qemu/ram/1-upstream'/>
<chardevStdioLogd/>
- <allowReboot value='yes'/>
<nodename index='0'/>
<fdset index='0'/>
<blockjobs active='no'/>
diff --git a/tests/qemustatusxml2xmldata/vcpus-multi-in.xml b/tests/qemustatusxml2xmldata/vcpus-multi-in.xml
index 6ee688ce03..1d5b34c2b6 100644
--- a/tests/qemustatusxml2xmldata/vcpus-multi-in.xml
+++ b/tests/qemustatusxml2xmldata/vcpus-multi-in.xml
@@ -308,7 +308,6 @@
<libDir path='/tmp'/>
<channelTargetDir path='/var/lib/libvirt/qemu/channel/target'/>
<memoryBackingDir path='/var/lib/libvirt/qemu/ram/1729-QEMUGuest1'/>
- <allowReboot value='yes'/>
<nodename index='0'/>
<fdset index='0'/>
<blockjobs active='no'/>
--
2.55.0

63
centos-9/SOURCES/libvirt-qemu-Remove-unused-qemuProcessRebootAllowed.patch

@ -0,0 +1,63 @@
From efab037086cf55a718cde67573037f28dcadedf2 Mon Sep 17 00:00:00 2001
Message-ID: <efab037086cf55a718cde67573037f28dcadedf2.1787144643.git.jdenemar@redhat.com>
From: Peter Krempa <pkrempa@redhat.com>
Date: Mon, 20 Jul 2026 13:29:50 +0200
Subject: [PATCH] qemu: Remove unused 'qemuProcessRebootAllowed'
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
(cherry picked from commit 8effae01b918f91933a6bd3b5721cb243c50248a)
https://redhat.atlassian.net/browse/RHEL-242546
---
src/qemu/qemu_process.c | 18 ------------------
src/qemu/qemu_process.h | 2 --
2 files changed, 20 deletions(-)
diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
index 5dfc9e5db3..369dbab579 100644
--- a/src/qemu/qemu_process.c
+++ b/src/qemu/qemu_process.c
@@ -6793,24 +6793,6 @@ qemuProcessPrepareDomainHostdevs(virDomainObj *vm,
}
-/**
- * qemuProcessRebootAllowed:
- * @def: domain definition
- *
- * This function encapsulates the logic which dictated whether '-no-reboot' was
- * used instead of '-no-shutdown' which is used QEMU versions which don't
- * support the 'set-action' QMP command.
- */
-bool
-qemuProcessRebootAllowed(const virDomainDef *def)
-{
- return def->onReboot != VIR_DOMAIN_LIFECYCLE_ACTION_DESTROY ||
- def->onPoweroff != VIR_DOMAIN_LIFECYCLE_ACTION_DESTROY ||
- (def->onCrash != VIR_DOMAIN_LIFECYCLE_ACTION_DESTROY &&
- def->onCrash != VIR_DOMAIN_LIFECYCLE_ACTION_COREDUMP_DESTROY);
-}
-
-
static int
qemuProcessUpdateSEVInfo(virDomainObj *vm)
{
diff --git a/src/qemu/qemu_process.h b/src/qemu/qemu_process.h
index dc16622ed9..75a725c4b9 100644
--- a/src/qemu/qemu_process.h
+++ b/src/qemu/qemu_process.h
@@ -262,8 +262,6 @@ G_DEFINE_AUTOPTR_CLEANUP_FUNC(qemuProcessQMP, qemuProcessQMPFree);
int qemuProcessQMPStart(qemuProcessQMP *proc);
-bool qemuProcessRebootAllowed(const virDomainDef *def);
-
void qemuProcessCleanupMigrationJob(virQEMUDriver *driver,
virDomainObj *vm);
--
2.55.0

531
centos-9/SOURCES/libvirt-qemu-capabilities-Retire-QEMU_CAPS_SET_ACTION.patch

@ -0,0 +1,531 @@
From a0565bb198bfe6aaf7e91186cfc188e18fcf34d7 Mon Sep 17 00:00:00 2001
Message-ID: <a0565bb198bfe6aaf7e91186cfc188e18fcf34d7.1787144643.git.jdenemar@redhat.com>
From: Peter Krempa <pkrempa@redhat.com>
Date: Mon, 20 Jul 2026 13:43:26 +0200
Subject: [PATCH] qemu: capabilities: Retire QEMU_CAPS_SET_ACTION
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
The capability is no longer used because all qemu versions we support do
have the 'set-action' command.
Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
(cherry picked from commit 01cb769a183e40a3f820ed9f949cf2d8b8cc3498)
Conflicts:
tests/qemucapabilitiesdata/caps_10.1.0_s390x.xml
tests/qemucapabilitiesdata/caps_10.2.0_aarch64.xml
tests/qemucapabilitiesdata/caps_11.0.0_aarch64.xml
tests/qemucapabilitiesdata/caps_11.0.0_s390x.xml
tests/qemucapabilitiesdata/caps_11.1.0_aarch64.xml
tests/qemucapabilitiesdata/caps_11.1.0_x86_64.xml
Capability dump files are not present downstream yet.
tests/qemucapabilitiesdata/caps_6.2.0_ppc64.xml
tests/qemucapabilitiesdata/caps_7.0.0_ppc64.xml
tests/qemucapabilitiesdata/caps_7.1.0_ppc64.xml
tests/qemucapabilitiesdata/caps_7.1.0_x86_64.xml
These capability files weren't yet deleted upstream, so this patch
removes the flag from there as a downstream fix.
https://redhat.atlassian.net/browse/RHEL-242546
---
src/qemu/qemu_capabilities.c | 3 +--
src/qemu/qemu_capabilities.h | 2 +-
tests/qemucapabilitiesdata/caps_10.0.0_aarch64.xml | 1 -
tests/qemucapabilitiesdata/caps_10.0.0_ppc64.xml | 1 -
tests/qemucapabilitiesdata/caps_10.0.0_s390x.xml | 1 -
tests/qemucapabilitiesdata/caps_10.0.0_x86_64+amdsev.xml | 1 -
tests/qemucapabilitiesdata/caps_10.0.0_x86_64.xml | 1 -
tests/qemucapabilitiesdata/caps_10.1.0_x86_64+inteltdx.xml | 1 -
tests/qemucapabilitiesdata/caps_10.1.0_x86_64.xml | 1 -
tests/qemucapabilitiesdata/caps_10.2.0_x86_64+mshv.xml | 1 -
tests/qemucapabilitiesdata/caps_10.2.0_x86_64.xml | 1 -
tests/qemucapabilitiesdata/caps_6.2.0_ppc64.xml | 1 -
tests/qemucapabilitiesdata/caps_6.2.0_x86_64.xml | 1 -
tests/qemucapabilitiesdata/caps_7.0.0_ppc64.xml | 1 -
tests/qemucapabilitiesdata/caps_7.0.0_x86_64.xml | 1 -
tests/qemucapabilitiesdata/caps_7.1.0_ppc64.xml | 1 -
tests/qemucapabilitiesdata/caps_7.1.0_x86_64.xml | 1 -
tests/qemucapabilitiesdata/caps_7.2.0_ppc.xml | 1 -
tests/qemucapabilitiesdata/caps_7.2.0_x86_64+hvf.xml | 1 -
tests/qemucapabilitiesdata/caps_7.2.0_x86_64.xml | 1 -
tests/qemucapabilitiesdata/caps_8.0.0_x86_64.xml | 1 -
tests/qemucapabilitiesdata/caps_8.1.0_s390x.xml | 1 -
tests/qemucapabilitiesdata/caps_8.1.0_x86_64.xml | 1 -
tests/qemucapabilitiesdata/caps_8.2.0_aarch64.xml | 1 -
tests/qemucapabilitiesdata/caps_8.2.0_armv7l.xml | 1 -
tests/qemucapabilitiesdata/caps_8.2.0_loongarch64.xml | 1 -
tests/qemucapabilitiesdata/caps_8.2.0_s390x.xml | 1 -
tests/qemucapabilitiesdata/caps_8.2.0_x86_64.xml | 1 -
tests/qemucapabilitiesdata/caps_9.0.0_sparc.xml | 1 -
tests/qemucapabilitiesdata/caps_9.0.0_x86_64.xml | 1 -
tests/qemucapabilitiesdata/caps_9.1.0_riscv64.xml | 1 -
tests/qemucapabilitiesdata/caps_9.1.0_s390x.xml | 1 -
tests/qemucapabilitiesdata/caps_9.1.0_x86_64.xml | 1 -
tests/qemucapabilitiesdata/caps_9.2.0_aarch64+hvf.xml | 1 -
tests/qemucapabilitiesdata/caps_9.2.0_s390x.xml | 1 -
tests/qemucapabilitiesdata/caps_9.2.0_x86_64+amdsev.xml | 1 -
tests/qemucapabilitiesdata/caps_9.2.0_x86_64.xml | 1 -
37 files changed, 2 insertions(+), 38 deletions(-)
diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
index fc5a428620..e344a05bb4 100644
--- a/src/qemu/qemu_capabilities.c
+++ b/src/qemu/qemu_capabilities.c
@@ -643,7 +643,7 @@ VIR_ENUM_IMPL(virQEMUCaps,
"confidential-guest-support", /* QEMU_CAPS_MACHINE_CONFIDENTAL_GUEST_SUPPORT */
"query-display-options", /* X_QEMU_CAPS_QUERY_DISPLAY_OPTIONS */
"s390-pv-guest", /* QEMU_CAPS_S390_PV_GUEST */
- "set-action", /* QEMU_CAPS_SET_ACTION */
+ "set-action", /* X_QEMU_CAPS_SET_ACTION */
"virtio-blk.queue-size", /* QEMU_CAPS_VIRTIO_BLK_QUEUE_SIZE */
/* 410 */
@@ -1281,7 +1281,6 @@ struct virQEMUCapsStringFlags virQEMUCapsCommands[] = {
{ "query-cpu-definitions", QEMU_CAPS_QUERY_CPU_DEFINITIONS },
{ "query-cpu-model-baseline", QEMU_CAPS_QUERY_CPU_MODEL_BASELINE },
{ "query-cpu-model-comparison", QEMU_CAPS_QUERY_CPU_MODEL_COMPARISON },
- { "set-action", QEMU_CAPS_SET_ACTION },
{ "query-dirty-rate", QEMU_CAPS_QUERY_DIRTY_RATE },
{ "sev-inject-launch-secret", QEMU_CAPS_SEV_INJECT_LAUNCH_SECRET },
{ "calc-dirty-rate", QEMU_CAPS_CALC_DIRTY_RATE },
diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h
index 334e98aac4..b6ccbfe65a 100644
--- a/src/qemu/qemu_capabilities.h
+++ b/src/qemu/qemu_capabilities.h
@@ -617,7 +617,7 @@ typedef enum { /* virQEMUCapsFlags grouping marker for syntax-check */
QEMU_CAPS_MACHINE_CONFIDENTAL_GUEST_SUPPORT, /* -machine confidential-guest-support */
X_QEMU_CAPS_QUERY_DISPLAY_OPTIONS, /* 'query-display-options' qmp command present */
QEMU_CAPS_S390_PV_GUEST, /* -object s390-pv-guest,... */
- QEMU_CAPS_SET_ACTION, /* 'set-action' QMP command */
+ X_QEMU_CAPS_SET_ACTION, /* 'set-action' QMP command */
QEMU_CAPS_VIRTIO_BLK_QUEUE_SIZE, /* virtio-blk-*.queue-size */
/* 410 */
diff --git a/tests/qemucapabilitiesdata/caps_10.0.0_aarch64.xml b/tests/qemucapabilitiesdata/caps_10.0.0_aarch64.xml
index bbb8b33cde..9468462bb3 100644
--- a/tests/qemucapabilitiesdata/caps_10.0.0_aarch64.xml
+++ b/tests/qemucapabilitiesdata/caps_10.0.0_aarch64.xml
@@ -109,7 +109,6 @@
<flag name='acpi-index'/>
<flag name='input-linux'/>
<flag name='confidential-guest-support'/>
- <flag name='set-action'/>
<flag name='virtio-blk.queue-size'/>
<flag name='virtio-mem-pci'/>
<flag name='memory-backend-file.reserve'/>
diff --git a/tests/qemucapabilitiesdata/caps_10.0.0_ppc64.xml b/tests/qemucapabilitiesdata/caps_10.0.0_ppc64.xml
index 4b3cded2d1..5aee092b40 100644
--- a/tests/qemucapabilitiesdata/caps_10.0.0_ppc64.xml
+++ b/tests/qemucapabilitiesdata/caps_10.0.0_ppc64.xml
@@ -117,7 +117,6 @@
<flag name='virtio-gpu-gl-pci'/>
<flag name='virtio-vga-gl'/>
<flag name='confidential-guest-support'/>
- <flag name='set-action'/>
<flag name='virtio-blk.queue-size'/>
<flag name='memory-backend-file.reserve'/>
<flag name='netdev.json'/>
diff --git a/tests/qemucapabilitiesdata/caps_10.0.0_s390x.xml b/tests/qemucapabilitiesdata/caps_10.0.0_s390x.xml
index cf00ac4ea0..a40b19a0a1 100644
--- a/tests/qemucapabilitiesdata/caps_10.0.0_s390x.xml
+++ b/tests/qemucapabilitiesdata/caps_10.0.0_s390x.xml
@@ -81,7 +81,6 @@
<flag name='virtio-gpu-gl-pci'/>
<flag name='confidential-guest-support'/>
<flag name='s390-pv-guest'/>
- <flag name='set-action'/>
<flag name='virtio-blk.queue-size'/>
<flag name='virtio-mem-pci'/>
<flag name='memory-backend-file.reserve'/>
diff --git a/tests/qemucapabilitiesdata/caps_10.0.0_x86_64+amdsev.xml b/tests/qemucapabilitiesdata/caps_10.0.0_x86_64+amdsev.xml
index 5acd1a33fd..8e923e7d20 100644
--- a/tests/qemucapabilitiesdata/caps_10.0.0_x86_64+amdsev.xml
+++ b/tests/qemucapabilitiesdata/caps_10.0.0_x86_64+amdsev.xml
@@ -145,7 +145,6 @@
<flag name='virtio-gpu-gl-pci'/>
<flag name='virtio-vga-gl'/>
<flag name='confidential-guest-support'/>
- <flag name='set-action'/>
<flag name='virtio-blk.queue-size'/>
<flag name='virtio-mem-pci'/>
<flag name='memory-backend-file.reserve'/>
diff --git a/tests/qemucapabilitiesdata/caps_10.0.0_x86_64.xml b/tests/qemucapabilitiesdata/caps_10.0.0_x86_64.xml
index 50f58791e6..b561c22242 100644
--- a/tests/qemucapabilitiesdata/caps_10.0.0_x86_64.xml
+++ b/tests/qemucapabilitiesdata/caps_10.0.0_x86_64.xml
@@ -145,7 +145,6 @@
<flag name='virtio-gpu-gl-pci'/>
<flag name='virtio-vga-gl'/>
<flag name='confidential-guest-support'/>
- <flag name='set-action'/>
<flag name='virtio-blk.queue-size'/>
<flag name='virtio-mem-pci'/>
<flag name='memory-backend-file.reserve'/>
diff --git a/tests/qemucapabilitiesdata/caps_10.1.0_x86_64+inteltdx.xml b/tests/qemucapabilitiesdata/caps_10.1.0_x86_64+inteltdx.xml
index e321c352a3..68a9790cf0 100644
--- a/tests/qemucapabilitiesdata/caps_10.1.0_x86_64+inteltdx.xml
+++ b/tests/qemucapabilitiesdata/caps_10.1.0_x86_64+inteltdx.xml
@@ -128,7 +128,6 @@
<flag name='acpi-index'/>
<flag name='input-linux'/>
<flag name='confidential-guest-support'/>
- <flag name='set-action'/>
<flag name='virtio-blk.queue-size'/>
<flag name='virtio-mem-pci'/>
<flag name='memory-backend-file.reserve'/>
diff --git a/tests/qemucapabilitiesdata/caps_10.1.0_x86_64.xml b/tests/qemucapabilitiesdata/caps_10.1.0_x86_64.xml
index 2d52659520..d9223a021c 100644
--- a/tests/qemucapabilitiesdata/caps_10.1.0_x86_64.xml
+++ b/tests/qemucapabilitiesdata/caps_10.1.0_x86_64.xml
@@ -147,7 +147,6 @@
<flag name='virtio-gpu-gl-pci'/>
<flag name='virtio-vga-gl'/>
<flag name='confidential-guest-support'/>
- <flag name='set-action'/>
<flag name='virtio-blk.queue-size'/>
<flag name='virtio-mem-pci'/>
<flag name='memory-backend-file.reserve'/>
diff --git a/tests/qemucapabilitiesdata/caps_10.2.0_x86_64+mshv.xml b/tests/qemucapabilitiesdata/caps_10.2.0_x86_64+mshv.xml
index eb2ab001a6..b28ac95d60 100644
--- a/tests/qemucapabilitiesdata/caps_10.2.0_x86_64+mshv.xml
+++ b/tests/qemucapabilitiesdata/caps_10.2.0_x86_64+mshv.xml
@@ -135,7 +135,6 @@
<flag name='acpi-index'/>
<flag name='input-linux'/>
<flag name='confidential-guest-support'/>
- <flag name='set-action'/>
<flag name='virtio-blk.queue-size'/>
<flag name='virtio-mem-pci'/>
<flag name='memory-backend-file.reserve'/>
diff --git a/tests/qemucapabilitiesdata/caps_10.2.0_x86_64.xml b/tests/qemucapabilitiesdata/caps_10.2.0_x86_64.xml
index c4ea924c1f..ae9f4df6a5 100644
--- a/tests/qemucapabilitiesdata/caps_10.2.0_x86_64.xml
+++ b/tests/qemucapabilitiesdata/caps_10.2.0_x86_64.xml
@@ -147,7 +147,6 @@
<flag name='virtio-gpu-gl-pci'/>
<flag name='virtio-vga-gl'/>
<flag name='confidential-guest-support'/>
- <flag name='set-action'/>
<flag name='virtio-blk.queue-size'/>
<flag name='virtio-mem-pci'/>
<flag name='memory-backend-file.reserve'/>
diff --git a/tests/qemucapabilitiesdata/caps_6.2.0_ppc64.xml b/tests/qemucapabilitiesdata/caps_6.2.0_ppc64.xml
index ff3bbe3a1f..4d235ae6d1 100644
--- a/tests/qemucapabilitiesdata/caps_6.2.0_ppc64.xml
+++ b/tests/qemucapabilitiesdata/caps_6.2.0_ppc64.xml
@@ -109,7 +109,6 @@
<flag name='acpi-index'/>
<flag name='input-linux'/>
<flag name='confidential-guest-support'/>
- <flag name='set-action'/>
<flag name='virtio-blk.queue-size'/>
<flag name='memory-backend-file.reserve'/>
<flag name='piix4.acpi-root-pci-hotplug'/>
diff --git a/tests/qemucapabilitiesdata/caps_6.2.0_x86_64.xml b/tests/qemucapabilitiesdata/caps_6.2.0_x86_64.xml
index 108e75bee8..5adb91b8b2 100644
--- a/tests/qemucapabilitiesdata/caps_6.2.0_x86_64.xml
+++ b/tests/qemucapabilitiesdata/caps_6.2.0_x86_64.xml
@@ -147,7 +147,6 @@
<flag name='virtio-gpu-gl-pci'/>
<flag name='virtio-vga-gl'/>
<flag name='confidential-guest-support'/>
- <flag name='set-action'/>
<flag name='virtio-blk.queue-size'/>
<flag name='virtio-mem-pci'/>
<flag name='memory-backend-file.reserve'/>
diff --git a/tests/qemucapabilitiesdata/caps_7.0.0_ppc64.xml b/tests/qemucapabilitiesdata/caps_7.0.0_ppc64.xml
index 6d4b555cd6..bf04c5a991 100644
--- a/tests/qemucapabilitiesdata/caps_7.0.0_ppc64.xml
+++ b/tests/qemucapabilitiesdata/caps_7.0.0_ppc64.xml
@@ -122,7 +122,6 @@
<flag name='virtio-gpu-gl-pci'/>
<flag name='virtio-vga-gl'/>
<flag name='confidential-guest-support'/>
- <flag name='set-action'/>
<flag name='virtio-blk.queue-size'/>
<flag name='memory-backend-file.reserve'/>
<flag name='piix4.acpi-root-pci-hotplug'/>
diff --git a/tests/qemucapabilitiesdata/caps_7.0.0_x86_64.xml b/tests/qemucapabilitiesdata/caps_7.0.0_x86_64.xml
index 1723e65499..82ca53c5b2 100644
--- a/tests/qemucapabilitiesdata/caps_7.0.0_x86_64.xml
+++ b/tests/qemucapabilitiesdata/caps_7.0.0_x86_64.xml
@@ -147,7 +147,6 @@
<flag name='virtio-gpu-gl-pci'/>
<flag name='virtio-vga-gl'/>
<flag name='confidential-guest-support'/>
- <flag name='set-action'/>
<flag name='virtio-blk.queue-size'/>
<flag name='virtio-mem-pci'/>
<flag name='memory-backend-file.reserve'/>
diff --git a/tests/qemucapabilitiesdata/caps_7.1.0_ppc64.xml b/tests/qemucapabilitiesdata/caps_7.1.0_ppc64.xml
index efd3150659..9201a0a903 100644
--- a/tests/qemucapabilitiesdata/caps_7.1.0_ppc64.xml
+++ b/tests/qemucapabilitiesdata/caps_7.1.0_ppc64.xml
@@ -118,7 +118,6 @@
<flag name='virtio-gpu-gl-pci'/>
<flag name='virtio-vga-gl'/>
<flag name='confidential-guest-support'/>
- <flag name='set-action'/>
<flag name='virtio-blk.queue-size'/>
<flag name='memory-backend-file.reserve'/>
<flag name='piix4.acpi-root-pci-hotplug'/>
diff --git a/tests/qemucapabilitiesdata/caps_7.1.0_x86_64.xml b/tests/qemucapabilitiesdata/caps_7.1.0_x86_64.xml
index 4deaf4fd1c..0a39442be4 100644
--- a/tests/qemucapabilitiesdata/caps_7.1.0_x86_64.xml
+++ b/tests/qemucapabilitiesdata/caps_7.1.0_x86_64.xml
@@ -147,7 +147,6 @@
<flag name='virtio-gpu-gl-pci'/>
<flag name='virtio-vga-gl'/>
<flag name='confidential-guest-support'/>
- <flag name='set-action'/>
<flag name='virtio-blk.queue-size'/>
<flag name='virtio-mem-pci'/>
<flag name='memory-backend-file.reserve'/>
diff --git a/tests/qemucapabilitiesdata/caps_7.2.0_ppc.xml b/tests/qemucapabilitiesdata/caps_7.2.0_ppc.xml
index bc5953f43e..bf67b3d295 100644
--- a/tests/qemucapabilitiesdata/caps_7.2.0_ppc.xml
+++ b/tests/qemucapabilitiesdata/caps_7.2.0_ppc.xml
@@ -109,7 +109,6 @@
<flag name='input-linux'/>
<flag name='virtio-gpu-gl-pci'/>
<flag name='confidential-guest-support'/>
- <flag name='set-action'/>
<flag name='virtio-blk.queue-size'/>
<flag name='memory-backend-file.reserve'/>
<flag name='piix4.acpi-root-pci-hotplug'/>
diff --git a/tests/qemucapabilitiesdata/caps_7.2.0_x86_64+hvf.xml b/tests/qemucapabilitiesdata/caps_7.2.0_x86_64+hvf.xml
index cbfc830f2c..0851162702 100644
--- a/tests/qemucapabilitiesdata/caps_7.2.0_x86_64+hvf.xml
+++ b/tests/qemucapabilitiesdata/caps_7.2.0_x86_64+hvf.xml
@@ -146,7 +146,6 @@
<flag name='virtio-gpu-gl-pci'/>
<flag name='virtio-vga-gl'/>
<flag name='confidential-guest-support'/>
- <flag name='set-action'/>
<flag name='virtio-blk.queue-size'/>
<flag name='virtio-mem-pci'/>
<flag name='memory-backend-file.reserve'/>
diff --git a/tests/qemucapabilitiesdata/caps_7.2.0_x86_64.xml b/tests/qemucapabilitiesdata/caps_7.2.0_x86_64.xml
index 913f96e91a..dda51b35df 100644
--- a/tests/qemucapabilitiesdata/caps_7.2.0_x86_64.xml
+++ b/tests/qemucapabilitiesdata/caps_7.2.0_x86_64.xml
@@ -147,7 +147,6 @@
<flag name='virtio-gpu-gl-pci'/>
<flag name='virtio-vga-gl'/>
<flag name='confidential-guest-support'/>
- <flag name='set-action'/>
<flag name='virtio-blk.queue-size'/>
<flag name='virtio-mem-pci'/>
<flag name='memory-backend-file.reserve'/>
diff --git a/tests/qemucapabilitiesdata/caps_8.0.0_x86_64.xml b/tests/qemucapabilitiesdata/caps_8.0.0_x86_64.xml
index 592df7049b..fcbb68e415 100644
--- a/tests/qemucapabilitiesdata/caps_8.0.0_x86_64.xml
+++ b/tests/qemucapabilitiesdata/caps_8.0.0_x86_64.xml
@@ -147,7 +147,6 @@
<flag name='virtio-gpu-gl-pci'/>
<flag name='virtio-vga-gl'/>
<flag name='confidential-guest-support'/>
- <flag name='set-action'/>
<flag name='virtio-blk.queue-size'/>
<flag name='virtio-mem-pci'/>
<flag name='memory-backend-file.reserve'/>
diff --git a/tests/qemucapabilitiesdata/caps_8.1.0_s390x.xml b/tests/qemucapabilitiesdata/caps_8.1.0_s390x.xml
index 2c540f7f30..65f73d1af8 100644
--- a/tests/qemucapabilitiesdata/caps_8.1.0_s390x.xml
+++ b/tests/qemucapabilitiesdata/caps_8.1.0_s390x.xml
@@ -77,7 +77,6 @@
<flag name='input-linux'/>
<flag name='confidential-guest-support'/>
<flag name='s390-pv-guest'/>
- <flag name='set-action'/>
<flag name='virtio-blk.queue-size'/>
<flag name='memory-backend-file.reserve'/>
<flag name='netdev.json'/>
diff --git a/tests/qemucapabilitiesdata/caps_8.1.0_x86_64.xml b/tests/qemucapabilitiesdata/caps_8.1.0_x86_64.xml
index 9141faa7b9..87b330ff32 100644
--- a/tests/qemucapabilitiesdata/caps_8.1.0_x86_64.xml
+++ b/tests/qemucapabilitiesdata/caps_8.1.0_x86_64.xml
@@ -147,7 +147,6 @@
<flag name='virtio-gpu-gl-pci'/>
<flag name='virtio-vga-gl'/>
<flag name='confidential-guest-support'/>
- <flag name='set-action'/>
<flag name='virtio-blk.queue-size'/>
<flag name='virtio-mem-pci'/>
<flag name='memory-backend-file.reserve'/>
diff --git a/tests/qemucapabilitiesdata/caps_8.2.0_aarch64.xml b/tests/qemucapabilitiesdata/caps_8.2.0_aarch64.xml
index bb70bcaf1f..20eb5f5d50 100644
--- a/tests/qemucapabilitiesdata/caps_8.2.0_aarch64.xml
+++ b/tests/qemucapabilitiesdata/caps_8.2.0_aarch64.xml
@@ -115,7 +115,6 @@
<flag name='acpi-index'/>
<flag name='input-linux'/>
<flag name='confidential-guest-support'/>
- <flag name='set-action'/>
<flag name='virtio-blk.queue-size'/>
<flag name='virtio-mem-pci'/>
<flag name='memory-backend-file.reserve'/>
diff --git a/tests/qemucapabilitiesdata/caps_8.2.0_armv7l.xml b/tests/qemucapabilitiesdata/caps_8.2.0_armv7l.xml
index 9590bc464a..042458fba8 100644
--- a/tests/qemucapabilitiesdata/caps_8.2.0_armv7l.xml
+++ b/tests/qemucapabilitiesdata/caps_8.2.0_armv7l.xml
@@ -120,7 +120,6 @@
<flag name='input-linux'/>
<flag name='virtio-gpu-gl-pci'/>
<flag name='confidential-guest-support'/>
- <flag name='set-action'/>
<flag name='virtio-blk.queue-size'/>
<flag name='virtio-mem-pci'/>
<flag name='memory-backend-file.reserve'/>
diff --git a/tests/qemucapabilitiesdata/caps_8.2.0_loongarch64.xml b/tests/qemucapabilitiesdata/caps_8.2.0_loongarch64.xml
index 640438623a..95eb2dfa21 100644
--- a/tests/qemucapabilitiesdata/caps_8.2.0_loongarch64.xml
+++ b/tests/qemucapabilitiesdata/caps_8.2.0_loongarch64.xml
@@ -108,7 +108,6 @@
<flag name='acpi-index'/>
<flag name='input-linux'/>
<flag name='confidential-guest-support'/>
- <flag name='set-action'/>
<flag name='virtio-blk.queue-size'/>
<flag name='memory-backend-file.reserve'/>
<flag name='netdev.json'/>
diff --git a/tests/qemucapabilitiesdata/caps_8.2.0_s390x.xml b/tests/qemucapabilitiesdata/caps_8.2.0_s390x.xml
index a254e16741..45ab66ec29 100644
--- a/tests/qemucapabilitiesdata/caps_8.2.0_s390x.xml
+++ b/tests/qemucapabilitiesdata/caps_8.2.0_s390x.xml
@@ -77,7 +77,6 @@
<flag name='input-linux'/>
<flag name='confidential-guest-support'/>
<flag name='s390-pv-guest'/>
- <flag name='set-action'/>
<flag name='virtio-blk.queue-size'/>
<flag name='memory-backend-file.reserve'/>
<flag name='netdev.json'/>
diff --git a/tests/qemucapabilitiesdata/caps_8.2.0_x86_64.xml b/tests/qemucapabilitiesdata/caps_8.2.0_x86_64.xml
index 12aa9c23fd..4909957a9a 100644
--- a/tests/qemucapabilitiesdata/caps_8.2.0_x86_64.xml
+++ b/tests/qemucapabilitiesdata/caps_8.2.0_x86_64.xml
@@ -147,7 +147,6 @@
<flag name='virtio-gpu-gl-pci'/>
<flag name='virtio-vga-gl'/>
<flag name='confidential-guest-support'/>
- <flag name='set-action'/>
<flag name='virtio-blk.queue-size'/>
<flag name='virtio-mem-pci'/>
<flag name='memory-backend-file.reserve'/>
diff --git a/tests/qemucapabilitiesdata/caps_9.0.0_sparc.xml b/tests/qemucapabilitiesdata/caps_9.0.0_sparc.xml
index c2710ecab1..44ddfb0f76 100644
--- a/tests/qemucapabilitiesdata/caps_9.0.0_sparc.xml
+++ b/tests/qemucapabilitiesdata/caps_9.0.0_sparc.xml
@@ -37,7 +37,6 @@
<flag name='rotation-rate'/>
<flag name='input-linux'/>
<flag name='confidential-guest-support'/>
- <flag name='set-action'/>
<flag name='memory-backend-file.reserve'/>
<flag name='netdev.json'/>
<flag name='query-dirty-rate'/>
diff --git a/tests/qemucapabilitiesdata/caps_9.0.0_x86_64.xml b/tests/qemucapabilitiesdata/caps_9.0.0_x86_64.xml
index 88bd502fee..956a4c02a0 100644
--- a/tests/qemucapabilitiesdata/caps_9.0.0_x86_64.xml
+++ b/tests/qemucapabilitiesdata/caps_9.0.0_x86_64.xml
@@ -147,7 +147,6 @@
<flag name='virtio-gpu-gl-pci'/>
<flag name='virtio-vga-gl'/>
<flag name='confidential-guest-support'/>
- <flag name='set-action'/>
<flag name='virtio-blk.queue-size'/>
<flag name='virtio-mem-pci'/>
<flag name='memory-backend-file.reserve'/>
diff --git a/tests/qemucapabilitiesdata/caps_9.1.0_riscv64.xml b/tests/qemucapabilitiesdata/caps_9.1.0_riscv64.xml
index 85c013a724..f718abf406 100644
--- a/tests/qemucapabilitiesdata/caps_9.1.0_riscv64.xml
+++ b/tests/qemucapabilitiesdata/caps_9.1.0_riscv64.xml
@@ -113,7 +113,6 @@
<flag name='virtio-gpu-gl-pci'/>
<flag name='virtio-vga-gl'/>
<flag name='confidential-guest-support'/>
- <flag name='set-action'/>
<flag name='virtio-blk.queue-size'/>
<flag name='memory-backend-file.reserve'/>
<flag name='netdev.json'/>
diff --git a/tests/qemucapabilitiesdata/caps_9.1.0_s390x.xml b/tests/qemucapabilitiesdata/caps_9.1.0_s390x.xml
index 3d2692b02c..f54b70359e 100644
--- a/tests/qemucapabilitiesdata/caps_9.1.0_s390x.xml
+++ b/tests/qemucapabilitiesdata/caps_9.1.0_s390x.xml
@@ -81,7 +81,6 @@
<flag name='virtio-gpu-gl-pci'/>
<flag name='confidential-guest-support'/>
<flag name='s390-pv-guest'/>
- <flag name='set-action'/>
<flag name='virtio-blk.queue-size'/>
<flag name='memory-backend-file.reserve'/>
<flag name='netdev.json'/>
diff --git a/tests/qemucapabilitiesdata/caps_9.1.0_x86_64.xml b/tests/qemucapabilitiesdata/caps_9.1.0_x86_64.xml
index 66578099a7..fd75acc8ad 100644
--- a/tests/qemucapabilitiesdata/caps_9.1.0_x86_64.xml
+++ b/tests/qemucapabilitiesdata/caps_9.1.0_x86_64.xml
@@ -145,7 +145,6 @@
<flag name='virtio-gpu-gl-pci'/>
<flag name='virtio-vga-gl'/>
<flag name='confidential-guest-support'/>
- <flag name='set-action'/>
<flag name='virtio-blk.queue-size'/>
<flag name='virtio-mem-pci'/>
<flag name='memory-backend-file.reserve'/>
diff --git a/tests/qemucapabilitiesdata/caps_9.2.0_aarch64+hvf.xml b/tests/qemucapabilitiesdata/caps_9.2.0_aarch64+hvf.xml
index 79784d553f..2a66f36fd2 100644
--- a/tests/qemucapabilitiesdata/caps_9.2.0_aarch64+hvf.xml
+++ b/tests/qemucapabilitiesdata/caps_9.2.0_aarch64+hvf.xml
@@ -87,7 +87,6 @@
<flag name='rotation-rate'/>
<flag name='acpi-index'/>
<flag name='confidential-guest-support'/>
- <flag name='set-action'/>
<flag name='virtio-blk.queue-size'/>
<flag name='netdev.json'/>
<flag name='query-dirty-rate'/>
diff --git a/tests/qemucapabilitiesdata/caps_9.2.0_s390x.xml b/tests/qemucapabilitiesdata/caps_9.2.0_s390x.xml
index 9f95ed891e..21e7f5d957 100644
--- a/tests/qemucapabilitiesdata/caps_9.2.0_s390x.xml
+++ b/tests/qemucapabilitiesdata/caps_9.2.0_s390x.xml
@@ -81,7 +81,6 @@
<flag name='virtio-gpu-gl-pci'/>
<flag name='confidential-guest-support'/>
<flag name='s390-pv-guest'/>
- <flag name='set-action'/>
<flag name='virtio-blk.queue-size'/>
<flag name='memory-backend-file.reserve'/>
<flag name='netdev.json'/>
diff --git a/tests/qemucapabilitiesdata/caps_9.2.0_x86_64+amdsev.xml b/tests/qemucapabilitiesdata/caps_9.2.0_x86_64+amdsev.xml
index 6636346bc5..b275c7f10d 100644
--- a/tests/qemucapabilitiesdata/caps_9.2.0_x86_64+amdsev.xml
+++ b/tests/qemucapabilitiesdata/caps_9.2.0_x86_64+amdsev.xml
@@ -146,7 +146,6 @@
<flag name='virtio-gpu-gl-pci'/>
<flag name='virtio-vga-gl'/>
<flag name='confidential-guest-support'/>
- <flag name='set-action'/>
<flag name='virtio-blk.queue-size'/>
<flag name='virtio-mem-pci'/>
<flag name='memory-backend-file.reserve'/>
diff --git a/tests/qemucapabilitiesdata/caps_9.2.0_x86_64.xml b/tests/qemucapabilitiesdata/caps_9.2.0_x86_64.xml
index dee30415aa..dee685e9bd 100644
--- a/tests/qemucapabilitiesdata/caps_9.2.0_x86_64.xml
+++ b/tests/qemucapabilitiesdata/caps_9.2.0_x86_64.xml
@@ -145,7 +145,6 @@
<flag name='virtio-gpu-gl-pci'/>
<flag name='virtio-vga-gl'/>
<flag name='confidential-guest-support'/>
- <flag name='set-action'/>
<flag name='virtio-blk.queue-size'/>
<flag name='virtio-mem-pci'/>
<flag name='memory-backend-file.reserve'/>
--
2.55.0

112
centos-9/SOURCES/libvirt-qemu-monitor-Remove-support-for-watchdog-set-action.patch

@ -0,0 +1,112 @@
From b2fd697438db60889f462a4ed11f08438380b1a6 Mon Sep 17 00:00:00 2001
Message-ID: <b2fd697438db60889f462a4ed11f08438380b1a6.1787144643.git.jdenemar@redhat.com>
From: Peter Krempa <pkrempa@redhat.com>
Date: Mon, 20 Jul 2026 13:31:39 +0200
Subject: [PATCH] qemu: monitor: Remove support for 'watchdog-set-action'
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
We now use 'set-action' instead.
Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
(cherry picked from commit 8365c6679fa65b66b85da2773547515a40ae1a8f)
https://redhat.atlassian.net/browse/RHEL-242546
---
src/qemu/qemu_monitor.c | 12 ------------
src/qemu/qemu_monitor.h | 4 ----
src/qemu/qemu_monitor_json.c | 22 ----------------------
src/qemu/qemu_monitor_json.h | 5 -----
4 files changed, 43 deletions(-)
diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c
index 3d7477c01c..5ecee978f9 100644
--- a/src/qemu/qemu_monitor.c
+++ b/src/qemu/qemu_monitor.c
@@ -4006,18 +4006,6 @@ qemuMonitorMemoryDeviceSizeChangeFree(qemuMonitorMemoryDeviceSizeChangePtr info)
}
-int
-qemuMonitorSetWatchdogAction(qemuMonitor *mon,
- const char *action)
-{
- VIR_DEBUG("watchdogAction=%s", action);
-
- QEMU_CHECK_MONITOR(mon);
-
- return qemuMonitorJSONSetWatchdogAction(mon, action);
-}
-
-
/**
* qemuMonitorBlockdevCreate:
* @mon: monitor object
diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h
index bbe400003a..671930fe5f 100644
--- a/src/qemu/qemu_monitor.h
+++ b/src/qemu/qemu_monitor.h
@@ -1642,10 +1642,6 @@ qemuMonitorSetBlockThreshold(qemuMonitor *mon,
const char *nodename,
unsigned long long threshold);
-int
-qemuMonitorSetWatchdogAction(qemuMonitor *mon,
- const char *action);
-
int
qemuMonitorBlockdevCreate(qemuMonitor *mon,
const char *jobname,
diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c
index 45f690d9e2..a98cf70a41 100644
--- a/src/qemu/qemu_monitor_json.c
+++ b/src/qemu/qemu_monitor_json.c
@@ -7826,28 +7826,6 @@ qemuMonitorJSONSetBlockThreshold(qemuMonitor *mon,
}
-int
-qemuMonitorJSONSetWatchdogAction(qemuMonitor *mon,
- const char *action)
-{
- g_autoptr(virJSONValue) cmd = NULL;
- g_autoptr(virJSONValue) reply = NULL;
-
- if (!(cmd = qemuMonitorJSONMakeCommand("watchdog-set-action",
- "s:action", action,
- NULL)))
- return -1;
-
- if (qemuMonitorJSONCommand(mon, cmd, &reply) < 0)
- return -1;
-
- if (qemuMonitorJSONCheckError(cmd, reply) < 0)
- return -1;
-
- return 0;
-}
-
-
int
qemuMonitorJSONBlockdevCreate(qemuMonitor *mon,
const char *jobname,
diff --git a/src/qemu/qemu_monitor_json.h b/src/qemu/qemu_monitor_json.h
index b418f70048..b07e54c2c5 100644
--- a/src/qemu/qemu_monitor_json.h
+++ b/src/qemu/qemu_monitor_json.h
@@ -629,11 +629,6 @@ qemuMonitorJSONSetBlockThreshold(qemuMonitor *mon,
unsigned long long threshold)
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
-int
-qemuMonitorJSONSetWatchdogAction(qemuMonitor *mon,
- const char *action)
- ATTRIBUTE_NONNULL(1);
-
int
qemuMonitorJSONBlockdevCreate(qemuMonitor *mon,
const char *jobname,
--
2.55.0

127
centos-9/SOURCES/libvirt-qemu-processGuestPanicEvent-Split-individual-steps-under-separate-conditions.patch

@ -0,0 +1,127 @@
From a8af95d072a9578ab0d8234f9d814f3a27a9180b Mon Sep 17 00:00:00 2001
Message-ID: <a8af95d072a9578ab0d8234f9d814f3a27a9180b.1787144643.git.jdenemar@redhat.com>
From: Peter Krempa <pkrempa@redhat.com>
Date: Tue, 21 Jul 2026 15:08:01 +0200
Subject: [PATCH] qemu: processGuestPanicEvent: Split individual steps under
separate conditions
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Separate the individual steps (setting of VM state, dumping, unlocking,
final state transition) under individual switch statements for future
extension.
Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
(cherry picked from commit ce97710da27fa005841c5f38baa2edcdc82f5d30)
https://redhat.atlassian.net/browse/RHEL-242546
---
src/qemu/qemu_driver.c | 66 ++++++++++++++++++++++++++++++------------
1 file changed, 48 insertions(+), 18 deletions(-)
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 3fd1215006..7e5c374e4c 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -3531,26 +3531,64 @@ processGuestPanicEvent(virQEMUDriver *driver,
qemuDomainLogAppendMessage(driver, vm, "%s: panic %s\n", timestamp, msg);
}
- virDomainObjSetState(vm, VIR_DOMAIN_CRASHED, VIR_DOMAIN_CRASHED_PANICKED);
-
event = virDomainEventLifecycleNewFromObj(vm,
VIR_DOMAIN_EVENT_CRASHED,
VIR_DOMAIN_EVENT_CRASHED_PANICKED);
-
virObjectEventStateQueue(driver->domainEventState, event);
- qemuDomainSaveStatus(vm);
-
- if (virDomainLockProcessPause(driver->lockManager, vm, &priv->lockState) < 0)
- VIR_WARN("Unable to release lease on %s", vm->def->name);
- VIR_DEBUG("Preserving lock state '%s'", NULLSTR(priv->lockState));
-
+ /* Update VM state */
switch (vm->def->onCrash) {
case VIR_DOMAIN_LIFECYCLE_ACTION_COREDUMP_DESTROY:
+ case VIR_DOMAIN_LIFECYCLE_ACTION_DESTROY:
+ case VIR_DOMAIN_LIFECYCLE_ACTION_COREDUMP_RESTART:
+ case VIR_DOMAIN_LIFECYCLE_ACTION_RESTART:
+ case VIR_DOMAIN_LIFECYCLE_ACTION_PRESERVE:
+ case VIR_DOMAIN_LIFECYCLE_ACTION_RESTART_RENAME:
+ virDomainObjSetState(vm, VIR_DOMAIN_CRASHED, VIR_DOMAIN_CRASHED_PANICKED);
+ qemuDomainSaveStatus(vm);
+ break;
+
+ case VIR_DOMAIN_LIFECYCLE_ACTION_LAST:
+ break;
+ }
+
+ /* Handle state of leases/locks */
+ switch (vm->def->onCrash) {
+ case VIR_DOMAIN_LIFECYCLE_ACTION_COREDUMP_DESTROY:
+ case VIR_DOMAIN_LIFECYCLE_ACTION_DESTROY:
+ case VIR_DOMAIN_LIFECYCLE_ACTION_COREDUMP_RESTART:
+ case VIR_DOMAIN_LIFECYCLE_ACTION_RESTART:
+ case VIR_DOMAIN_LIFECYCLE_ACTION_PRESERVE:
+ case VIR_DOMAIN_LIFECYCLE_ACTION_RESTART_RENAME:
+ if (virDomainLockProcessPause(driver->lockManager, vm, &priv->lockState) < 0)
+ VIR_WARN("Unable to release lease on %s", vm->def->name);
+ VIR_DEBUG("Preserving lock state '%s'", NULLSTR(priv->lockState));
+ break;
+
+ case VIR_DOMAIN_LIFECYCLE_ACTION_LAST:
+ break;
+ }
+
+ /* create core dump */
+ switch (vm->def->onCrash) {
+ case VIR_DOMAIN_LIFECYCLE_ACTION_COREDUMP_DESTROY:
+ case VIR_DOMAIN_LIFECYCLE_ACTION_COREDUMP_RESTART:
if (doCoreDumpToAutoDumpPath(driver, vm, flags) < 0)
goto endjob;
- G_GNUC_FALLTHROUGH;
+ break;
+
+ case VIR_DOMAIN_LIFECYCLE_ACTION_DESTROY:
+ case VIR_DOMAIN_LIFECYCLE_ACTION_RESTART:
+ case VIR_DOMAIN_LIFECYCLE_ACTION_PRESERVE:
+ case VIR_DOMAIN_LIFECYCLE_ACTION_RESTART_RENAME:
+ case VIR_DOMAIN_LIFECYCLE_ACTION_LAST:
+ break;
+ }
+
+ /* final state update */
+ switch (vm->def->onCrash) {
+ case VIR_DOMAIN_LIFECYCLE_ACTION_COREDUMP_DESTROY:
case VIR_DOMAIN_LIFECYCLE_ACTION_DESTROY:
qemuProcessStop(vm, VIR_DOMAIN_SHUTOFF_CRASHED, VIR_ASYNC_JOB_DUMP, 0);
event = virDomainEventLifecycleNewFromObj(vm,
@@ -3563,22 +3601,14 @@ processGuestPanicEvent(virQEMUDriver *driver,
break;
case VIR_DOMAIN_LIFECYCLE_ACTION_COREDUMP_RESTART:
- if (doCoreDumpToAutoDumpPath(driver, vm, flags) < 0)
- goto endjob;
- G_GNUC_FALLTHROUGH;
-
case VIR_DOMAIN_LIFECYCLE_ACTION_RESTART:
qemuDomainSetFakeReboot(vm, true);
ignore_value(qemuProcessShutdownOrReboot(vm));
break;
case VIR_DOMAIN_LIFECYCLE_ACTION_PRESERVE:
- /* the VM is kept around for debugging */
- break;
-
case VIR_DOMAIN_LIFECYCLE_ACTION_RESTART_RENAME:
case VIR_DOMAIN_LIFECYCLE_ACTION_LAST:
- default:
break;
}
--
2.55.0

103
centos-9/SOURCES/libvirt-qemuDomainModifyLifecycleActionLive-Prepare-to-handle-other-actions.patch

@ -0,0 +1,103 @@
From 00e93e0ba0770169ffb3797c24ee0cc2b1199990 Mon Sep 17 00:00:00 2001
Message-ID: <00e93e0ba0770169ffb3797c24ee0cc2b1199990.1787144643.git.jdenemar@redhat.com>
From: Peter Krempa <pkrempa@redhat.com>
Date: Wed, 22 Jul 2026 17:05:00 +0200
Subject: [PATCH] qemuDomainModifyLifecycleActionLive: Prepare to handle other
actions
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Rework the code so that it'll be possible to easily extend it to set
other lifecycle actions in qemu.
Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
(cherry picked from commit 79b6d701c7719fbe5e5db8531ff6460edfbed171)
https://redhat.atlassian.net/browse/RHEL-242546
---
src/qemu/qemu_driver.c | 55 ++++++++++++++++++++++++------------------
1 file changed, 32 insertions(+), 23 deletions(-)
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index e24ac26f59..410cfad066 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -19244,42 +19244,51 @@ qemuDomainModifyLifecycleActionLive(virDomainObj *vm,
virDomainLifecycle type,
virDomainLifecycleAction action)
{
- qemuMonitorActionReboot monReboot = QEMU_MONITOR_ACTION_REBOOT_KEEP;
+ qemuMonitorActionShutdown shutdown = QEMU_MONITOR_ACTION_SHUTDOWN_KEEP;
+ qemuMonitorActionReboot reboot = QEMU_MONITOR_ACTION_REBOOT_KEEP;
+ qemuMonitorActionWatchdog watchdog = QEMU_MONITOR_ACTION_WATCHDOG_KEEP;
+ qemuMonitorActionPanic panic = QEMU_MONITOR_ACTION_PANIC_KEEP;
qemuDomainObjPrivate *priv = vm->privateData;
int rc;
- /* For now we only update 'reboot' action here as we want to keep the
- * shutdown action as is (we're emulating the outcome anyways)) */
- if (type != VIR_DOMAIN_LIFECYCLE_REBOOT ||
- vm->def->onReboot == action)
- return 0;
+ switch (type) {
+ case VIR_DOMAIN_LIFECYCLE_REBOOT:
+ if (vm->def->onReboot == action)
+ break;
+ switch (action) {
+ case VIR_DOMAIN_LIFECYCLE_ACTION_DESTROY:
+ reboot = QEMU_MONITOR_ACTION_REBOOT_SHUTDOWN;
+ break;
- switch (action) {
- case VIR_DOMAIN_LIFECYCLE_ACTION_DESTROY:
- monReboot = QEMU_MONITOR_ACTION_REBOOT_SHUTDOWN;
+ case VIR_DOMAIN_LIFECYCLE_ACTION_RESTART:
+ reboot = QEMU_MONITOR_ACTION_REBOOT_RESET;
+ break;
+
+ case VIR_DOMAIN_LIFECYCLE_ACTION_PRESERVE:
+ case VIR_DOMAIN_LIFECYCLE_ACTION_RESTART_RENAME:
+ case VIR_DOMAIN_LIFECYCLE_ACTION_COREDUMP_DESTROY:
+ case VIR_DOMAIN_LIFECYCLE_ACTION_COREDUMP_RESTART:
+ case VIR_DOMAIN_LIFECYCLE_ACTION_LAST:
+ break;
+ }
break;
- case VIR_DOMAIN_LIFECYCLE_ACTION_RESTART:
- monReboot = QEMU_MONITOR_ACTION_REBOOT_RESET;
+ case VIR_DOMAIN_LIFECYCLE_POWEROFF:
+ case VIR_DOMAIN_LIFECYCLE_CRASH:
+ case VIR_DOMAIN_LIFECYCLE_LAST:
break;
-
- case VIR_DOMAIN_LIFECYCLE_ACTION_PRESERVE:
- case VIR_DOMAIN_LIFECYCLE_ACTION_RESTART_RENAME:
- case VIR_DOMAIN_LIFECYCLE_ACTION_COREDUMP_DESTROY:
- case VIR_DOMAIN_LIFECYCLE_ACTION_COREDUMP_RESTART:
- case VIR_DOMAIN_LIFECYCLE_ACTION_LAST:
- return 0;
}
+ if (shutdown == QEMU_MONITOR_ACTION_SHUTDOWN_KEEP &&
+ reboot == QEMU_MONITOR_ACTION_REBOOT_KEEP &&
+ watchdog == QEMU_MONITOR_ACTION_WATCHDOG_KEEP &&
+ panic == QEMU_MONITOR_ACTION_PANIC_KEEP)
+ return 0;
qemuDomainObjEnterMonitor(vm);
- rc = qemuMonitorSetAction(priv->mon,
- QEMU_MONITOR_ACTION_SHUTDOWN_KEEP,
- monReboot,
- QEMU_MONITOR_ACTION_WATCHDOG_KEEP,
- QEMU_MONITOR_ACTION_PANIC_KEEP);
+ rc = qemuMonitorSetAction(priv->mon, shutdown, reboot, watchdog, panic);
qemuDomainObjExitMonitor(vm);
if (rc < 0)
--
2.55.0

88
centos-9/SOURCES/libvirt-qemuMonitorGuestPanicEventInfoFormatMsg-Directly-return-message.patch

@ -0,0 +1,88 @@
From fc375cfe35c829e6acbae56e9ad3d47726a78d23 Mon Sep 17 00:00:00 2001
Message-ID: <fc375cfe35c829e6acbae56e9ad3d47726a78d23.1787144643.git.jdenemar@redhat.com>
From: Peter Krempa <pkrempa@redhat.com>
Date: Tue, 21 Jul 2026 14:54:50 +0200
Subject: [PATCH] qemuMonitorGuestPanicEventInfoFormatMsg: Directly return
message
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Remove the 'ret' variable and format the panic string on a single line.
Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
(cherry picked from commit 3f41645e3d8bf7b589de58d2d5052123a4d6fe9c)
https://redhat.atlassian.net/browse/RHEL-242546
---
src/qemu/qemu_monitor.c | 40 +++++++++++++++++-----------------------
1 file changed, 17 insertions(+), 23 deletions(-)
diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c
index 5ecee978f9..86702f6599 100644
--- a/src/qemu/qemu_monitor.c
+++ b/src/qemu/qemu_monitor.c
@@ -3922,43 +3922,37 @@ qemuMonitorSetBlockThreshold(qemuMonitor *mon,
char *
qemuMonitorGuestPanicEventInfoFormatMsg(qemuMonitorEventPanicInfo *info)
{
- char *ret = NULL;
-
switch (info->type) {
case QEMU_MONITOR_EVENT_PANIC_INFO_TYPE_HYPERV:
- ret = g_strdup_printf("hyper-v: arg1='0x%llx', arg2='0x%llx', "
- "arg3='0x%llx', arg4='0x%llx', arg5='0x%llx'",
- info->data.hyperv.arg1, info->data.hyperv.arg2,
- info->data.hyperv.arg3, info->data.hyperv.arg4,
- info->data.hyperv.arg5);
+ return g_strdup_printf("hyper-v: arg1='0x%llx', arg2='0x%llx', arg3='0x%llx', arg4='0x%llx', arg5='0x%llx'",
+ info->data.hyperv.arg1, info->data.hyperv.arg2,
+ info->data.hyperv.arg3, info->data.hyperv.arg4,
+ info->data.hyperv.arg5);
break;
case QEMU_MONITOR_EVENT_PANIC_INFO_TYPE_S390:
- ret = g_strdup_printf("s390: core='%d' psw-mask='0x%016llx' "
- "psw-addr='0x%016llx' reason='%s'",
- info->data.s390.core,
- info->data.s390.psw_mask,
- info->data.s390.psw_addr,
- info->data.s390.reason);
+ return g_strdup_printf("s390: core='%d' psw-mask='0x%016llx' psw-addr='0x%016llx' reason='%s'",
+ info->data.s390.core,
+ info->data.s390.psw_mask,
+ info->data.s390.psw_addr,
+ info->data.s390.reason);
break;
case QEMU_MONITOR_EVENT_PANIC_INFO_TYPE_TDX:
if (info->data.tdx.has_gpa)
- ret = g_strdup_printf("tdx: error_code='0x%x' message='%s' "
- "additional error information can be found "
- "at gpa page: '0x%016llx'",
- info->data.tdx.error_code,
- info->data.tdx.message,
- info->data.tdx.gpa);
+ return g_strdup_printf("tdx: error_code='0x%x' message='%s' additional error information can be found at gpa page: '0x%016llx'",
+ info->data.tdx.error_code,
+ info->data.tdx.message,
+ info->data.tdx.gpa);
else
- ret = g_strdup_printf("tdx: error_code='0x%x' message='%s'",
- info->data.tdx.error_code,
- info->data.tdx.message);
+ return g_strdup_printf("tdx: error_code='0x%x' message='%s'",
+ info->data.tdx.error_code,
+ info->data.tdx.message);
break;
case QEMU_MONITOR_EVENT_PANIC_INFO_TYPE_NONE:
case QEMU_MONITOR_EVENT_PANIC_INFO_TYPE_LAST:
break;
}
- return ret;
+ return NULL;
}
--
2.55.0

62
centos-9/SOURCES/libvirt-qemuProcessGuestPanicEventInfo-Fold-into-only-caller.patch

@ -0,0 +1,62 @@
From 94b9bec5bb85bc828e732e7c88c209b86573c4ab Mon Sep 17 00:00:00 2001
Message-ID: <94b9bec5bb85bc828e732e7c88c209b86573c4ab.1787144643.git.jdenemar@redhat.com>
From: Peter Krempa <pkrempa@redhat.com>
Date: Tue, 21 Jul 2026 14:55:38 +0200
Subject: [PATCH] qemuProcessGuestPanicEventInfo: Fold into only caller
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Move the code directly to the only place that calls this function.
Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
(cherry picked from commit bf4ace1bca464fe8432c2eb08f5261d6f9bdaf29)
https://redhat.atlassian.net/browse/RHEL-242546
---
src/qemu/qemu_driver.c | 22 +++++++---------------
1 file changed, 7 insertions(+), 15 deletions(-)
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index ddd6e8f7ac..3fd1215006 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -3503,19 +3503,6 @@ doCoreDumpToAutoDumpPath(virQEMUDriver *driver,
}
-static void
-qemuProcessGuestPanicEventInfo(virQEMUDriver *driver,
- virDomainObj *vm,
- qemuMonitorEventPanicInfo *info)
-{
- g_autofree char *msg = qemuMonitorGuestPanicEventInfoFormatMsg(info);
- g_autofree char *timestamp = virTimeStringNow();
-
- if (msg && timestamp)
- qemuDomainLogAppendMessage(driver, vm, "%s: panic %s\n", timestamp, msg);
-}
-
-
static void
processGuestPanicEvent(virQEMUDriver *driver,
virDomainObj *vm,
@@ -3536,8 +3523,13 @@ processGuestPanicEvent(virQEMUDriver *driver,
goto endjob;
}
- if (info)
- qemuProcessGuestPanicEventInfo(driver, vm, info);
+ if (info) {
+ g_autofree char *msg = qemuMonitorGuestPanicEventInfoFormatMsg(info);
+ g_autofree char *timestamp = virTimeStringNow();
+
+ if (msg && timestamp)
+ qemuDomainLogAppendMessage(driver, vm, "%s: panic %s\n", timestamp, msg);
+ }
virDomainObjSetState(vm, VIR_DOMAIN_CRASHED, VIR_DOMAIN_CRASHED_PANICKED);
--
2.55.0

62
centos-9/SOURCES/libvirt-qemuProcessSetupLifecycleActions-Prepare-to-handle-other-actions.patch

@ -0,0 +1,62 @@
From 35539a28975b44f5321d204dc20e28c25fc6abae Mon Sep 17 00:00:00 2001
Message-ID: <35539a28975b44f5321d204dc20e28c25fc6abae.1787144643.git.jdenemar@redhat.com>
From: Peter Krempa <pkrempa@redhat.com>
Date: Mon, 20 Jul 2026 13:48:51 +0200
Subject: [PATCH] qemuProcessSetupLifecycleActions: Prepare to handle other
actions
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Rework the code so that it'll be possible to easily extend it to set
other lifecycle actions in qemu.
Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
(cherry picked from commit 30a548c894dc2f5787d7004d68b266caa404f6af)
https://redhat.atlassian.net/browse/RHEL-242546
---
src/qemu/qemu_process.c | 18 ++++++++++++------
1 file changed, 12 insertions(+), 6 deletions(-)
diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
index 369dbab579..6955e8152c 100644
--- a/src/qemu/qemu_process.c
+++ b/src/qemu/qemu_process.c
@@ -8090,21 +8090,27 @@ qemuProcessSetupLifecycleActions(virDomainObj *vm,
virDomainAsyncJob asyncJob)
{
qemuDomainObjPrivate *priv = vm->privateData;
+ qemuMonitorActionShutdown shutdown = QEMU_MONITOR_ACTION_SHUTDOWN_KEEP;
+ qemuMonitorActionReboot reboot = QEMU_MONITOR_ACTION_REBOOT_KEEP;
+ qemuMonitorActionWatchdog watchdog = QEMU_MONITOR_ACTION_WATCHDOG_KEEP;
+ qemuMonitorActionPanic panic = QEMU_MONITOR_ACTION_PANIC_KEEP;
int rc;
/* for now we handle only onReboot->destroy here as an alternative to
* '-no-reboot' on the commandline */
- if (vm->def->onReboot != VIR_DOMAIN_LIFECYCLE_ACTION_DESTROY)
+ if (vm->def->onReboot == VIR_DOMAIN_LIFECYCLE_ACTION_DESTROY)
+ reboot = QEMU_MONITOR_ACTION_REBOOT_SHUTDOWN;
+
+ if (shutdown == QEMU_MONITOR_ACTION_SHUTDOWN_KEEP &&
+ reboot == QEMU_MONITOR_ACTION_REBOOT_KEEP &&
+ watchdog == QEMU_MONITOR_ACTION_WATCHDOG_KEEP &&
+ panic == QEMU_MONITOR_ACTION_PANIC_KEEP)
return 0;
if (qemuDomainObjEnterMonitorAsync(vm, asyncJob) < 0)
return -1;
- rc = qemuMonitorSetAction(priv->mon,
- QEMU_MONITOR_ACTION_SHUTDOWN_KEEP,
- QEMU_MONITOR_ACTION_REBOOT_SHUTDOWN,
- QEMU_MONITOR_ACTION_WATCHDOG_KEEP,
- QEMU_MONITOR_ACTION_PANIC_KEEP);
+ rc = qemuMonitorSetAction(priv->mon, shutdown, reboot, watchdog, panic);
qemuDomainObjExitMonitor(vm);
if (rc < 0)
--
2.55.0

198
centos-9/SOURCES/libvirt-qemu_agent-Introduce-guest-get-devices.patch

@ -0,0 +1,198 @@
From 2eed5180fb11ed18a6cb35e77b7904e5af2eaacd Mon Sep 17 00:00:00 2001
Message-ID: <2eed5180fb11ed18a6cb35e77b7904e5af2eaacd.1787144643.git.jdenemar@redhat.com>
From: Michal Privoznik <mprivozn@redhat.com>
Date: Tue, 11 Aug 2026 17:08:05 +0200
Subject: [PATCH] qemu_agent: Introduce guest-get-devices
QEMU agent has 'guest-get-devices` command. Even though it's
currently implemented only for Windows, it shows some interesting
information from inside the guest, like device drivers, their
versions, and so on.
Looking at the command definition in qga/qapi-schema.json the
only non-optional field in returned data is 'driver-name'. The
rest is optional. Although looking at the current implementation
either all fields are set or device is ignored completely.
Nevertheless, our code should follow QMP schema.
New qemuAgentGuestDeviceInfo structure is introduced among with
qemuAgentGetGuestDeviceInfo() function which parses reply from
agent and fills the structure. Optional fields are either set to
NULL or -1, if missing.
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
Reviewed-by: Peter Krempa <pkrempa@redhat.com>
(cherry picked from commit 7dea038439aa025d18c716e3343d3f0e9ccd672a)
Conflicts:
src/libvirt_private.syms:
src/qemu/qemu_agent.c:
src/qemu/qemu_agent.h: All three conflicts are due to v12.4.0-rc1~76
not being backported (it moved parts of the
agent code under src/hypervisor for wider use).
Resolves: https://redhat.atlassian.net/browse/RHEL-243300
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
---
src/qemu/qemu_agent.c | 119 ++++++++++++++++++++++++++++++++++++++++++
src/qemu/qemu_agent.h | 21 ++++++++
2 files changed, 140 insertions(+)
diff --git a/src/qemu/qemu_agent.c b/src/qemu/qemu_agent.c
index ee0921eca6..67faa5aa97 100644
--- a/src/qemu/qemu_agent.c
+++ b/src/qemu/qemu_agent.c
@@ -2599,3 +2599,122 @@ qemuAgentGetLoadAvg(qemuAgent *agent,
return 0;
}
+
+
+void
+qemuAgentGuestDeviceInfoFree(qemuAgentGuestDeviceInfo *info)
+{
+ if (!info)
+ return;
+
+ g_free(info->driverName);
+ g_free(info->driverVersion);
+ g_free(info->pci);
+ g_free(info);
+}
+
+
+int
+qemuAgentGetGuestDeviceInfo(qemuAgent *agent,
+ qemuAgentGuestDeviceInfo ***info,
+ bool report_unsupported)
+{
+ g_autoptr(virJSONValue) cmd = NULL;
+ g_autoptr(virJSONValue) reply = NULL;
+ virJSONValue *data = NULL;
+ size_t ndata;
+ size_t i;
+ int rc;
+
+ if (!(cmd = qemuAgentMakeCommand("guest-get-devices", NULL)))
+ return -1;
+
+ if ((rc = qemuAgentCommandFull(agent, cmd, &reply, agent->timeout,
+ report_unsupported)) < 0)
+ return rc;
+
+ if (!(data = virJSONValueObjectGetArray(reply, "return"))) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("qemu agent didn't return an array of devices"));
+ return -1;
+ }
+
+ ndata = virJSONValueArraySize(data);
+
+ *info = g_new0(qemuAgentGuestDeviceInfo *, ndata);
+
+ for (i = 0; i < ndata; i++) {
+ g_autoptr(qemuAgentGuestDeviceInfo) oneInfo = NULL;
+ virJSONValue *entry = virJSONValueArrayGet(data, i);
+ virJSONValue *dDate = NULL;
+ virJSONValue *idObj = NULL;
+
+ if (!entry) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("array element missing in guest-get-devices return value"));
+ goto error;
+ }
+
+ oneInfo = g_new0(qemuAgentGuestDeviceInfo, 1);
+
+ oneInfo->driverName = g_strdup(virJSONValueObjectGetString(entry, "driver-name"));
+ if (!oneInfo->driverName) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("'driver-name' missing in reply of guest-get-devices"));
+ goto error;
+ }
+
+ if ((dDate = virJSONValueObjectGet(entry, "driver-date"))) {
+ if (virJSONValueGetNumberLong(dDate, &oneInfo->driverDate) < 0) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("malformed 'driver-date' in reply of guest-get-devices"));
+ goto error;
+ }
+ } else {
+ oneInfo->driverDate = -1;
+ }
+
+ oneInfo->driverVersion = g_strdup(virJSONValueObjectGetString(entry, "driver-version"));
+
+ if ((idObj = virJSONValueObjectGet(entry, "id"))) {
+ const char *type = NULL;
+
+ if (!(type = virJSONValueObjectGetString(idObj, "type"))) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("missing 'type' in reply of guest-get-devices"));
+ goto error;
+ }
+
+ if (STREQ("pci", type)) {
+ g_autofree qemuAgentGuestDeviceInfoPCI *pci = NULL;
+
+ pci = g_new0(qemuAgentGuestDeviceInfoPCI, 1);
+
+ if (virJSONValueObjectGetNumberUint(idObj, "vendor-id", &pci->vendorID) < 0) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("missing or malformed 'vendor-id' in reply of guest-get-devices"));
+ goto error;
+ }
+
+ if (virJSONValueObjectGetNumberUint(idObj, "device-id", &pci->deviceID) < 0) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("missing or malformed 'device-id' in reply of guest-get-devices"));
+ goto error;
+ }
+
+ oneInfo->pci = g_steal_pointer(&pci);
+ }
+ }
+
+ (*info)[i] = g_steal_pointer(&oneInfo);
+ }
+
+ return ndata;
+
+ error:
+ for (i = 0; i < ndata; i++) {
+ qemuAgentGuestDeviceInfoFree((*info)[i]);
+ }
+ g_clear_pointer(info, g_free);
+ return -1;
+}
diff --git a/src/qemu/qemu_agent.h b/src/qemu/qemu_agent.h
index 860f19b6bd..a6be2ff387 100644
--- a/src/qemu/qemu_agent.h
+++ b/src/qemu/qemu_agent.h
@@ -195,3 +195,24 @@ int qemuAgentGetLoadAvg(qemuAgent *agent,
double *load5m,
double *load15m,
bool report_unsupported);
+
+typedef struct _qemuAgentGuestDeviceInfoPCI qemuAgentGuestDeviceInfoPCI;
+struct _qemuAgentGuestDeviceInfoPCI {
+ unsigned int vendorID;
+ unsigned int deviceID;
+};
+
+typedef struct _qemuAgentGuestDeviceInfo qemuAgentGuestDeviceInfo;
+struct _qemuAgentGuestDeviceInfo {
+ char *driverName;
+ long long driverDate; /* In nanoseconds since the epoch */
+ char *driverVersion;
+ qemuAgentGuestDeviceInfoPCI *pci;
+};
+
+void qemuAgentGuestDeviceInfoFree(qemuAgentGuestDeviceInfo *info);
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(qemuAgentGuestDeviceInfo, qemuAgentGuestDeviceInfoFree);
+
+int qemuAgentGetGuestDeviceInfo(qemuAgent *agent,
+ qemuAgentGuestDeviceInfo ***info,
+ bool report_unsupported);
--
2.55.0

164
centos-9/SOURCES/libvirt-qemuagenttest-Introduce-GetGuestDeviceInfo-test-case.patch

@ -0,0 +1,164 @@
From bab073ee5a84722b4f49b5f66d5a5bef0eee4858 Mon Sep 17 00:00:00 2001
Message-ID: <bab073ee5a84722b4f49b5f66d5a5bef0eee4858.1787144643.git.jdenemar@redhat.com>
From: Michal Privoznik <mprivozn@redhat.com>
Date: Wed, 12 Aug 2026 14:08:37 +0200
Subject: [PATCH] qemuagenttest: Introduce GetGuestDeviceInfo test case
Introduce a test case for newly introduced
qemuAgentGetGuestDeviceInfo(). The expected data started as a
genuine reply from a qemu-ga running inside a Windows VM. But
then was modified to cover more cases (like an optional key
missing).
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
Reviewed-by: Peter Krempa <pkrempa@redhat.com>
(cherry picked from commit c56a2479ab59167af6cc9094981ef6e1c0a83a01)
Resolves: https://redhat.atlassian.net/browse/RHEL-243300
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
---
tests/qemuagenttest.c | 123 ++++++++++++++++++++++++++++++++++++++++++
1 file changed, 123 insertions(+)
diff --git a/tests/qemuagenttest.c b/tests/qemuagenttest.c
index 9c64ed3c5f..612ecb976b 100644
--- a/tests/qemuagenttest.c
+++ b/tests/qemuagenttest.c
@@ -1394,6 +1394,128 @@ testQemuAgentGetLoadAvg(const void *data)
}
+static const char *testQemuAgentGetGuestDeviceInfoResponse =
+"{"
+" \"return\": ["
+" {"
+" \"driver-date\": 1736726400000000000,"
+" \"driver-name\": \"Red Hat VirtIO Ethernet Adapter\","
+" \"driver-version\": \"100.100.104.27100\","
+" \"id\": {"
+" \"device-id\": 4161,"
+" \"vendor-id\": 6900,"
+" \"type\": \"pci\""
+" }"
+" },"
+" {"
+" \"driver-name\": \"VirtIO Serial Driver\","
+" \"driver-version\": \"100.100.104.27100\","
+" \"id\": {"
+" \"device-id\": 4163,"
+" \"vendor-id\": 6900,"
+" \"type\": \"pci\""
+" }"
+" },"
+" {"
+" \"driver-date\": 1736726400000000000,"
+" \"driver-name\": \"VirtIO Balloon Driver\","
+" \"id\": {"
+" \"device-id\": 4165,"
+" \"vendor-id\": 6900,"
+" \"type\": \"pci\""
+" }"
+" },"
+" {"
+" \"driver-date\": 1736726400000000000,"
+" \"driver-name\": \"Red Hat VirtIO GPU DOD controller\","
+" \"driver-version\": \"100.100.104.27100\""
+" }"
+" ]"
+"}";
+
+
+static int
+testQemuAgentGetGuestDeviceInfo(const void *data)
+{
+ virDomainXMLOption *xmlopt = (virDomainXMLOption *)data;
+ g_autoptr(qemuMonitorTest) test = qemuMonitorTestNewAgent(xmlopt);
+ qemuAgentGuestDeviceInfo **devices = NULL;
+ int ret = -1;
+ size_t i;
+ int ndevices;
+
+ if (!test)
+ return -1;
+
+ if (qemuMonitorTestAddAgentSyncResponse(test) < 0)
+ return -1;
+
+ if (qemuMonitorTestAddItem(test, "guest-get-devices",
+ testQemuAgentGetGuestDeviceInfoResponse) < 0)
+ return -1;
+
+ ndevices = qemuAgentGetGuestDeviceInfo(qemuMonitorTestGetAgent(test),
+ &devices, true);
+
+ if (ndevices < 0)
+ return -1;
+
+ if (ndevices != 4) {
+ virReportError(VIR_ERR_INTERNAL_ERROR,
+ "unexpected number of guest devices returned (%d), expected 4",
+ ndevices);
+ goto cleanup;
+ }
+
+ if (STRNEQ(devices[0]->driverName, "Red Hat VirtIO Ethernet Adapter") ||
+ STRNEQ(devices[0]->driverVersion, "100.100.104.27100") ||
+ devices[0]->driverDate != 1736726400000000000LL ||
+ devices[0]->pci->vendorID != 6900 ||
+ devices[0]->pci->deviceID != 4161) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ "unexpected device info returned for device #0");
+ goto cleanup;
+ }
+
+ if (STRNEQ(devices[1]->driverName, "VirtIO Serial Driver") ||
+ STRNEQ(devices[1]->driverVersion, "100.100.104.27100") ||
+ devices[1]->driverDate != -1LL ||
+ devices[1]->pci->vendorID != 6900 ||
+ devices[1]->pci->deviceID != 4163) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ "unexpected device info returned for device #1");
+ goto cleanup;
+ }
+
+ if (STRNEQ(devices[2]->driverName, "VirtIO Balloon Driver") ||
+ devices[2]->driverVersion ||
+ devices[2]->driverDate != 1736726400000000000LL ||
+ devices[2]->pci->vendorID != 6900 ||
+ devices[2]->pci->deviceID != 4165) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ "unexpected device info returned for device #2");
+ goto cleanup;
+ }
+
+ if (STRNEQ(devices[3]->driverName, "Red Hat VirtIO GPU DOD controller") ||
+ STRNEQ(devices[3]->driverVersion, "100.100.104.27100") ||
+ devices[3]->driverDate != 1736726400000000000LL ||
+ devices[3]->pci) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ "unexpected device info returned for device #3");
+ goto cleanup;
+ }
+
+ ret = 0;
+ cleanup:
+ for (i = 0; i < ndevices; i++) {
+ qemuAgentGuestDeviceInfoFree(devices[i]);
+ }
+ g_free(devices);
+ return ret;
+}
+
+
static int
mymain(void)
{
@@ -1431,6 +1553,7 @@ mymain(void)
DO_TEST(SSHKeys);
DO_TEST(GetDisks);
DO_TEST(GetLoadAvg);
+ DO_TEST(GetGuestDeviceInfo);
DO_TEST(Timeout); /* Timeout should always be called last */
--
2.55.0

1063
centos-9/SOURCES/libvirt-tests-capabilityschemadata-Add-a-real-test-example.patch

File diff suppressed because it is too large

71
centos-9/SOURCES/libvirt-util-virFileChownFiles-do-not-follow-symlinks.patch

@ -0,0 +1,71 @@
From b71d798b0e6fb719ae6c05ccf02fc0a3f7e57e6a Mon Sep 17 00:00:00 2001
Message-ID: <b71d798b0e6fb719ae6c05ccf02fc0a3f7e57e6a.1786713428.git.jdenemar@redhat.com>
From: =?UTF-8?q?HE=20WEI=EF=BC=88=E3=82=AE=E3=82=AB=E3=82=AF=EF=BC=89?=
<skyexpoc@gmail.com>
Date: Tue, 28 Jul 2026 17:49:02 +0100
Subject: [PATCH] util: virFileChownFiles: do not follow symlinks
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
virFileChownFiles() selected entries with virFileIsRegular() (stat(), follows
symlinks) and changed ownership with chown() (follows symlinks). A component
that owns the target directory at a lower privilege (e.g. the swtpm/tss state
directory) can plant a symlink to an arbitrary regular file and have the root
caller chown that file. Use lstat() to skip non-regular entries and
fchownat(..., AT_SYMLINK_NOFOLLOW) so a symlink final component is never
followed.
Fixes: CVE-2026-63622
Signed-off-by: HE WEI(ギカク) <skyexpoc@gmail.com>
[DB: use g_lstat instead of stat; use lchown instead of
fchownat for portability; added comment]
Reviewed-by: Ján Tomko <jtomko@redhat.com>
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
(cherry picked from commit 801160fd414ca2cc402bc01ead09b7ed4c3b8f5b)
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
---
src/util/virfile.c | 16 ++++++++++++++--
1 file changed, 14 insertions(+), 2 deletions(-)
diff --git a/src/util/virfile.c b/src/util/virfile.c
index 05b2fa8168..4fbb306a78 100644
--- a/src/util/virfile.c
+++ b/src/util/virfile.c
@@ -3179,6 +3179,12 @@ int virDirIsEmpty(const char *path,
*
* Change ownership of all regular files in a directory.
*
+ * This will NOT follow any symlinks, to avoid security risks.
+ * It is assumed the process using content under @name will
+ * be unprivileged, thus less trusted than libvirt. If it is
+ * compromised it might attempt to create symlinks in @name to
+ * escalate privileges on a subsequent call to virFileChownFiles.
+ *
* Returns -1 on error, with error already reported, 0 on success.
*/
#ifndef WIN32
@@ -3195,13 +3201,19 @@ int virFileChownFiles(const char *name,
while ((direrr = virDirRead(dir, &ent, name)) > 0) {
g_autofree char *path = NULL;
+ struct stat sb;
path = g_build_filename(name, ent->d_name, NULL);
- if (!virFileIsRegular(path))
+ if (g_lstat(path, &sb) < 0) {
+ virReportSystemError(errno, _("cannot stat '%1$s'"), path);
+ return -1;
+ }
+
+ if (!S_ISREG(sb.st_mode))
continue;
- if (chown(path, uid, gid) < 0) {
+ if (lchown(path, uid, gid) < 0) {
virReportSystemError(errno,
_("cannot chown '%1$s' to (%2$u, %3$u)"),
ent->d_name, (unsigned int) uid,
--
2.55.0

88
centos-9/SOURCES/libvirt-virsh-Add-support-for-VIR_DOMAIN_GUEST_INFO_DEVICES.patch

@ -0,0 +1,88 @@
From da0e42a5461bc4457f2c05eb4aeb1b40143e4288 Mon Sep 17 00:00:00 2001
Message-ID: <da0e42a5461bc4457f2c05eb4aeb1b40143e4288.1787144643.git.jdenemar@redhat.com>
From: Michal Privoznik <mprivozn@redhat.com>
Date: Wed, 12 Aug 2026 15:11:20 +0200
Subject: [PATCH] virsh: Add support for VIR_DOMAIN_GUEST_INFO_DEVICES
The virDomainGetGuestInfo() API is exposed as 'guestinfo'
command. Introduce new --devices option for it to reflect
introduction of VIR_DOMAIN_GUEST_INFO_DEVICES type.
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
Reviewed-by: Peter Krempa <pkrempa@redhat.com>
(cherry picked from commit a634a99a07cf510658939164b6982297789025b8)
Resolves: https://redhat.atlassian.net/browse/RHEL-243300
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
---
docs/manpages/virsh.rst | 17 +++++++++++++----
tools/virsh-domain.c | 6 ++++++
2 files changed, 19 insertions(+), 4 deletions(-)
diff --git a/docs/manpages/virsh.rst b/docs/manpages/virsh.rst
index 2936df6a73..d8c6c716df 100644
--- a/docs/manpages/virsh.rst
+++ b/docs/manpages/virsh.rst
@@ -3227,7 +3227,7 @@ guestinfo
::
guestinfo domain [--user] [--os] [--timezone] [--hostname] [--filesystem]
- [--disk] [--interface]
+ [--disk] [--interface] [--devices]
Print information about the guest from the point of view of the guest agent.
Note that this command requires a guest agent to be configured and running in
@@ -3239,9 +3239,9 @@ Success is always reported in this case.
You can limit the types of information that are returned by specifying one or
more flags. Available information types flags are *--user*, *--os*,
-*--timezone*, *--hostname*, *--filesystem*, *--disk*, *--interface* and *--load*.
-If an explicitly requested information type is not supported by the guest agent
-at that point, the processes will provide an exit code of 1.
+*--timezone*, *--hostname*, *--filesystem*, *--disk*, *--interface*, *--load*
+and *--devices*. If an explicitly requested information type is not supported
+by the guest agent at that point, the processes will provide an exit code of 1.
Note that depending on the hypervisor type and the version of the guest agent
running within the domain, not all of the following information may be
@@ -3324,6 +3324,15 @@ returned:
* ``load.5m`` - average load in guest for last 5 minutes
* ``load.15m`` - average load in guest for last 15 minutes
+*--devices* returns:
+* ``device.count`` - the number of devices that info is returned for
+* ``device.<num>.driverName`` - name of the driver associated with device
+* ``device.<num>.driverDate`` - driver release date in seconds since the epoch
+* ``device.<num>.driverVersion`` - version of the driver associated with the device
+* ``device.<num>.idType`` - device identification type (e.g. pci)
+* ``device.<num>.pciVendor`` - vendor ID for PCI device (in decimal)
+* ``device.<num>.pciDevice`` - device ID for PCI device (in decimal)
+
guestvcpus
----------
diff --git a/tools/virsh-domain.c b/tools/virsh-domain.c
index 536c0350c7..7b3e476beb 100644
--- a/tools/virsh-domain.c
+++ b/tools/virsh-domain.c
@@ -13583,6 +13583,10 @@ static const vshCmdOptDef opts_guestinfo[] = {
.type = VSH_OT_BOOL,
.help = N_("report load averages information"),
},
+ {.name = "devices",
+ .type = VSH_OT_BOOL,
+ .help = N_("report devices information"),
+ },
{.name = NULL}
};
@@ -13612,6 +13616,8 @@ cmdGuestInfo(vshControl *ctl, const vshCmd *cmd)
types |= VIR_DOMAIN_GUEST_INFO_INTERFACES;
if (vshCommandOptBool(cmd, "load"))
types |= VIR_DOMAIN_GUEST_INFO_LOAD;
+ if (vshCommandOptBool(cmd, "devices"))
+ types |= VIR_DOMAIN_GUEST_INFO_DEVICES;
if (!(dom = virshCommandOptDomain(ctl, cmd, NULL)))
return false;
--
2.55.0

50
centos-9/SPECS/libvirt.spec

@ -287,7 +287,7 @@
Summary: Library providing a simple virtualization API Summary: Library providing a simple virtualization API
Name: libvirt Name: libvirt
Version: 11.10.0 Version: 11.10.0
Release: 16%{?dist}%{?extra_release} Release: 18%{?dist}%{?extra_release}
License: GPL-2.0-or-later AND LGPL-2.1-only AND LGPL-2.1-or-later AND OFL-1.1 License: GPL-2.0-or-later AND LGPL-2.1-only AND LGPL-2.1-or-later AND OFL-1.1
URL: https://libvirt.org/ URL: https://libvirt.org/
@ -435,6 +435,28 @@ Patch137: libvirt-qemuValidateDomainDeviceDefVideo-Fix-checks-of-virtio-video-de
Patch138: libvirt-qemuDeviceVideoGetModel-Remove-logic-for-selecting-virtio-devices.patch Patch138: libvirt-qemuDeviceVideoGetModel-Remove-logic-for-selecting-virtio-devices.patch
Patch139: libvirt-qemuDeviceVideoGetModel-Simplify-by-relying-on-checks-from-qemuValidateDomainDeviceDefVideo.patch Patch139: libvirt-qemuDeviceVideoGetModel-Simplify-by-relying-on-checks-from-qemuValidateDomainDeviceDefVideo.patch
Patch140: libvirt-qemu-Remove-qemuDomainSupportsVideoVga.patch Patch140: libvirt-qemu-Remove-qemuDomainSupportsVideoVga.patch
Patch141: libvirt-conf-schemas-Allow-.-in-schema-for-CPU-flag-name.patch
Patch142: libvirt-tests-capabilityschemadata-Add-a-real-test-example.patch
Patch143: libvirt-util-virFileChownFiles-do-not-follow-symlinks.patch
Patch144: libvirt-qemu-Always-assume-support-for-QEMU_CAPS_SET_ACTION.patch
Patch145: libvirt-qemu-Remove-unused-qemuProcessRebootAllowed.patch
Patch146: libvirt-qemu-monitor-Remove-support-for-watchdog-set-action.patch
Patch147: libvirt-qemu-Remove-allowReboot-field.patch
Patch148: libvirt-qemu-capabilities-Retire-QEMU_CAPS_SET_ACTION.patch
Patch149: libvirt-qemuProcessSetupLifecycleActions-Prepare-to-handle-other-actions.patch
Patch150: libvirt-qemuDomainModifyLifecycleActionLive-Prepare-to-handle-other-actions.patch
Patch151: libvirt-processGuestPanicEvent-Don-t-pass-panic-action-via-parameter.patch
Patch152: libvirt-conf-Use-proper-enum-types-for-onReboot-onPoweroff-onCrash-and-onLockFailure.patch
Patch153: libvirt-qemuMonitorGuestPanicEventInfoFormatMsg-Directly-return-message.patch
Patch154: libvirt-qemuProcessGuestPanicEventInfo-Fold-into-only-caller.patch
Patch155: libvirt-qemu-processGuestPanicEvent-Split-individual-steps-under-separate-conditions.patch
Patch156: libvirt-Add-support-for-keeping-VM-running-when-panic-notifier-is-used.patch
Patch157: libvirt-qemu-Fix-proper-ordering-of-virtlockd-shutdown.patch
Patch158: libvirt-Add-guest-device-info-to-virDomainGetGuestInfo.patch
Patch159: libvirt-qemu_agent-Introduce-guest-get-devices.patch
Patch160: libvirt-qemuagenttest-Introduce-GetGuestDeviceInfo-test-case.patch
Patch161: libvirt-qemu-Implement-device-info-for-virDomainGetGuestInfo-API.patch
Patch162: libvirt-virsh-Add-support-for-VIR_DOMAIN_GUEST_INFO_DEVICES.patch
Requires: libvirt-daemon = %{version}-%{release} Requires: libvirt-daemon = %{version}-%{release}
@ -2826,6 +2848,32 @@ exit 0
%endif %endif
%changelog %changelog
* Wed Aug 19 2026 Jiri Denemark <jdenemar@redhat.com> - 11.10.0-18
- qemu: Always assume support for 'QEMU_CAPS_SET_ACTION' (RHEL-242546)
- qemu: Remove unused 'qemuProcessRebootAllowed' (RHEL-242546)
- qemu: monitor: Remove support for 'watchdog-set-action' (RHEL-242546)
- qemu: Remove 'allowReboot' field (RHEL-242546)
- qemu: capabilities: Retire QEMU_CAPS_SET_ACTION (RHEL-242546)
- qemuProcessSetupLifecycleActions: Prepare to handle other actions (RHEL-242546)
- qemuDomainModifyLifecycleActionLive: Prepare to handle other actions (RHEL-242546)
- processGuestPanicEvent: Don't pass panic action via parameter (RHEL-242546)
- conf: Use proper enum types for 'onReboot', 'onPoweroff', 'onCrash', and 'onLockFailure' (RHEL-242546)
- qemuMonitorGuestPanicEventInfoFormatMsg: Directly return message (RHEL-242546)
- qemuProcessGuestPanicEventInfo: Fold into only caller (RHEL-242546)
- qemu: processGuestPanicEvent: Split individual steps under separate conditions (RHEL-242546)
- Add support for keeping VM running when panic notifier is used (RHEL-242546)
- qemu: Fix proper ordering of 'virtlockd' shutdown (RHEL-180876)
- Add guest device info to virDomainGetGuestInfo (RHEL-243300)
- qemu_agent: Introduce guest-get-devices (RHEL-243300)
- qemuagenttest: Introduce GetGuestDeviceInfo test case (RHEL-243300)
- qemu: Implement device info for virDomainGetGuestInfo() API (RHEL-243300)
- virsh: Add support for VIR_DOMAIN_GUEST_INFO_DEVICES (RHEL-243300)
* Fri Aug 14 2026 Jiri Denemark <jdenemar@redhat.com> - 11.10.0-17
- conf: schemas: Allow '.' in schema for CPU flag name (RHEL-222551)
- tests: capabilityschemadata: Add a real test example (RHEL-222551)
- util: virFileChownFiles: do not follow symlinks (CVE-2026-63622)
* Fri Jul 24 2026 Jiri Denemark <jdenemar@redhat.com> - 11.10.0-16 * Fri Jul 24 2026 Jiri Denemark <jdenemar@redhat.com> - 11.10.0-16
- Live migration fails when virtio-vga becomes available, video device switches from virtio-gpu-pci to virtio-vga on target (RHEL-177646) - Live migration fails when virtio-vga becomes available, video device switches from virtio-gpu-pci to virtio-vga on target (RHEL-177646)

Loading…
Cancel
Save