From: Michal Privoznik <mprivozn@redhat.com> 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> --- src/qemu/qemu_driver.c | 58 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 44b41726fb..c568a418d5 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -19987,7 +19987,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, @@ -20171,6 +20172,43 @@ virDomainInterfaceFormatParams(virDomainInterfacePtr *ifaces, } } + +static 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 / 1000000, + 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); + } + } +} + + static int qemuDomainGetGuestInfo(virDomainPtr dom, unsigned int types, @@ -20195,6 +20233,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(); @@ -20274,6 +20314,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); @@ -20306,6 +20354,8 @@ qemuDomainGetGuestInfo(virDomainPtr dom, virTypedParamListAddDouble(list, load15m, VIR_DOMAIN_GUEST_INFO_LOAD_15M); } + qemuAgentGuestDeviceInfoFormatParams(devices, ndevices, list); + if (virTypedParamListSteal(list, params, nparams) < 0) goto cleanup; @@ -20323,6 +20373,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.54.0