libvirt/libvirt-qemu-Implement-device-info-for-virDomainGetGuestInfo-API.patch
Jiri Denemark c6a4088d90 libvirt-12.5.0-3.el10
- 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)

Resolves: RHEL-185108, RHEL-235731, RHEL-242545
2026-08-19 14:56:37 +02:00

156 lines
6.0 KiB
Diff

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