libvirt/libvirt-qemu-Implement-device-info-for-virDomainGetGuestInfo-API.patch
Jiri Denemark 0f2ee777b8 libvirt-11.10.0-18.el9
- 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)

Resolves: RHEL-180876, RHEL-242546, RHEL-243300
2026-08-19 15:04:03 +02:00

150 lines
5.8 KiB
Diff

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