From nobody Mon Aug 24 09:06:31 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.libvirt.org designates 38.145.34.151 as permitted sender) client-ip=38.145.34.151; envelope-from=devel-bounces@lists.libvirt.org; helo=lists.libvirt.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of lists.libvirt.org designates 38.145.34.151 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=pass(p=reject dis=none) header.from=lists.libvirt.org ARC-Seal: i=1; a=rsa-sha256; t=1786610322; cv=none; d=zohomail.com; s=zohoarc; b=a1bisJILsD+Y/oMHbDi1+x1tJ6L9LpRTdT4A3tXz87KQ34qsRiaLgZUqOUqmDa/eEBVmN+pRFuR11cK6/SAATAtbPjozcynEQH1RUJEc4tOE1ik6W9uXStabR3EWrx+jW3pxfdBM1G2UaipO3AOzlJCPoAudEBo7Wt0Au4BsVB0= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1786610322; h=Content-Type:Content-Transfer-Encoding:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Owner:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:Reply-To:References:Subject:Subject:To:To:Message-Id:Cc; bh=oAHIPc6y+sJ6L7xeCvotXn2EIoqqaDE83r5e/aLvZPA=; b=Yc1YCkcS+M5Rt0lHp3M1eqobYKoEII0/0UlnU2cJOMIwvRBux5GMBP/XPGWWHwxnmJew/dlXZzwNAqxt4PVKzCps/y7I0a1ECB+45ilcSTMWhOowsKFtgBsaQOPjwEuVY83YGNK9N13BJ8eAAxB66sYYK6HS6+Lu2eJP3r3NIS0= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of lists.libvirt.org designates 38.145.34.151 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=pass header.from= (p=reject dis=none) Return-Path: Received: from lists.libvirt.org (lists.libvirt.org [38.145.34.151]) by mx.zohomail.com with SMTPS id 1786610322745545.7069597423496; Thu, 13 Aug 2026 01:38:42 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 993) id 9A8AA4191E; Thu, 13 Aug 2026 04:38:41 -0400 (EDT) Received: from [172.19.199.10] (unknown [10.16.107.18]) by lists.libvirt.org (Postfix) with ESMTP id BF63A41C98; Thu, 13 Aug 2026 04:32:01 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 993) id 8D5E541B31; Thu, 13 Aug 2026 04:31:42 -0400 (EDT) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (3072 bits) server-digest SHA256) (No client certificate requested) by lists.libvirt.org (Postfix) with ESMTPS id 34B8441916 for ; Thu, 13 Aug 2026 04:31:30 -0400 (EDT) Received: from mx-prod-mc-05.mail-002.prod.us-west-2.aws.redhat.com (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-267-mjtgkLIqOdyNJAPVbI3ckw-1; Thu, 13 Aug 2026 04:31:22 -0400 Received: from mx-prod-int-03.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-03.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.12]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-05.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id EBF9919560BC for ; Thu, 13 Aug 2026 08:31:21 +0000 (UTC) Received: from moe (unknown [10.43.3.236]) by mx-prod-int-03.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 56DF4195DF98 for ; Thu, 13 Aug 2026 08:31:21 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-26) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=0.6 required=5.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,MAILING_LIST_MULTI,RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H2, RCVD_IN_SBL_CSS,SPF_HELO_PASS autolearn=no autolearn_force=no version=4.0.1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1786609889; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=oAHIPc6y+sJ6L7xeCvotXn2EIoqqaDE83r5e/aLvZPA=; b=YwpL7h0BmUToG9EToGEJJVQ781qMc/ESKifT2t4MZ3+KuvUGuz9PEaSk3dpgWK2V47lf2y Jwtzk7MNTUsiykSW6PMr26+ROBwvYomSOWbAoavNXbqQDr4Ls11Bm9ULjfL+zkVVcJ3GqY tZ2LnXSkoFXZsKTStBKdYm3kP1W0KvY= X-MC-Unique: mjtgkLIqOdyNJAPVbI3ckw-1 X-Mimecast-MFC-AGG-ID: mjtgkLIqOdyNJAPVbI3ckw_1786609882 To: devel@lists.libvirt.org Subject: [PATCH 1/5] Add guest device info to virDomainGetGuestInfo Date: Thu, 13 Aug 2026 10:31:13 +0200 Message-ID: In-Reply-To: References: MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.0 on 10.30.177.12 X-Mimecast-Spam-Score: 0 X-Mimecast-MFC-PROC-ID: jEmIf9C4X68TD4_80OvpkW0bap9swuo5as2TQLUvdXQ_1786609882 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Message-ID-Hash: 7N4HGR3UNYAE64JDC2EQKY2Y6EVNJAIW X-Message-ID-Hash: 7N4HGR3UNYAE64JDC2EQKY2Y6EVNJAIW X-MailFrom: mprivozn@redhat.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; loop; banned-address; header-match-devel.lists.libvirt.org-0; emergency; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header X-Mailman-Version: 3.3.10 Precedence: list List-Id: Development discussions about the libvirt library & tools Archived-At: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: From: Michal Privoznik via Devel Reply-To: Michal Privoznik X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1786610323616158500 Content-Type: text/plain; charset="utf-8"; x-default="true" From: Michal Privoznik 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 --- 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-dom= ain.h index f4dfe9fb1a..874fc4b455 100644 --- a/include/libvirt/libvirt-domain.h +++ b/include/libvirt/libvirt-domain.h @@ -8867,6 +8867,83 @@ int virDomainSetLaunchSecurityState(virDomainPtr dom= ain, */ # define VIR_DOMAIN_GUEST_INFO_LOAD_15M "load.15m" =20 +/** + * 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. 1736726400000) 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 ".driverVersio= n" + +/** + * 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 e= qual + * 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 e= qual + * 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 =3D (1 << 5), /* return disks information = (Since: 7.0.0) */ VIR_DOMAIN_GUEST_INFO_INTERFACES =3D (1 << 6), /* return interfaces in= formation (Since: 7.10.0) */ VIR_DOMAIN_GUEST_INFO_LOAD =3D (1 << 7), /* return load averages (Sinc= e: 11.2.0) */ + VIR_DOMAIN_GUEST_INFO_DEVICES =3D (1 << 8), /* return devices informat= ion (Since: 12.7.0) */ } virDomainGuestInfoTypes; =20 int virDomainGetGuestInfo(virDomainPtr domain, diff --git a/src/libvirt-domain.c b/src/libvirt-domain.c index 60d84b24a1..acd9ffc44b 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 para= meter * 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. * --=20 2.54.0 From nobody Mon Aug 24 09:06:31 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.libvirt.org designates 38.145.34.151 as permitted sender) client-ip=38.145.34.151; envelope-from=devel-bounces@lists.libvirt.org; helo=lists.libvirt.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of lists.libvirt.org designates 38.145.34.151 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=pass(p=reject dis=none) header.from=lists.libvirt.org ARC-Seal: i=1; a=rsa-sha256; t=1786610044; cv=none; d=zohomail.com; s=zohoarc; b=EyCWEAh6+4N2u6J072r7FgAvrnaLJxWH7D8hOdZ7o0DmP/BgLYB0kjVBEj/qwXox7ttHmWFCaqXdmPtlMHwr1FqNIyaQ6dQDU25ULauPY5USa78noTBQv9uJ7l0umZFPUb3q0YkD0Cwsm9mpT4dllLCZCh3SDD3VoE/rhctgU7Y= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1786610044; h=Content-Type:Content-Transfer-Encoding:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Owner:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:Reply-To:References:Subject:Subject:To:To:Message-Id:Cc; bh=8S6rxDVNvQgkNjPTN9tFlupHEbfcSxwh+bUiSw6mPLM=; b=dxonqA+xjx5Rj/T6snD7iNP9UiRWwd16aJIs33AfE8goWB9OKEWCFv6xIOo6QtzV8bpuFGO2Z3lHYBgcFAxjEGgPhxL9P5sb30raiETqmW2rE04gacKWWD/Yb8akQUk5Km46k24+a37aNkTEJPQHpn3s6rxHjCyBvIlUH6swArI= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of lists.libvirt.org designates 38.145.34.151 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=pass header.from= (p=reject dis=none) Return-Path: Received: from lists.libvirt.org (lists.libvirt.org [38.145.34.151]) by mx.zohomail.com with SMTPS id 1786610044190820.5083924105977; Thu, 13 Aug 2026 01:34:04 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 993) id EEFE9419B3; Thu, 13 Aug 2026 04:34:02 -0400 (EDT) Received: from [172.19.199.10] (unknown [10.16.107.18]) by lists.libvirt.org (Postfix) with ESMTP id 4E65441917; Thu, 13 Aug 2026 04:31:39 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 993) id 827BA3F931; Thu, 13 Aug 2026 04:31:26 -0400 (EDT) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (3072 bits) server-digest SHA256) (No client certificate requested) by lists.libvirt.org (Postfix) with ESMTPS id A909B3FD29 for ; Thu, 13 Aug 2026 04:31:25 -0400 (EDT) Received: from mx-prod-mc-05.mail-002.prod.us-west-2.aws.redhat.com (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-543-X_SKMa5JMZeB03Qw7INTAg-1; Thu, 13 Aug 2026 04:31:23 -0400 Received: from mx-prod-int-03.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-03.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.12]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-05.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 037151956094 for ; Thu, 13 Aug 2026 08:31:23 +0000 (UTC) Received: from moe (unknown [10.43.3.236]) by mx-prod-int-03.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 626A3195608A for ; Thu, 13 Aug 2026 08:31:22 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-26) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=0.6 required=5.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,MAILING_LIST_MULTI,RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H2, RCVD_IN_SBL_CSS,SPF_HELO_PASS autolearn=no autolearn_force=no version=4.0.1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1786609885; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=8S6rxDVNvQgkNjPTN9tFlupHEbfcSxwh+bUiSw6mPLM=; b=QQ8twtdJCZ+s4XTK7wIrcOPV6CJzVwCVWSiLAMwUe9G1OFfAZoxIzcXLcyImJfyWyDSVpb j6e7wCXhZhRd5+yol2LHJhvyaCpO7ZMaGTS17ci/EjolFWZ125vabKU9HVt9lzuAkWmGvI yWaYcWT1dA7U+62/vAOyji5YZo/nFok= X-MC-Unique: X_SKMa5JMZeB03Qw7INTAg-1 X-Mimecast-MFC-AGG-ID: X_SKMa5JMZeB03Qw7INTAg_1786609883 To: devel@lists.libvirt.org Subject: [PATCH 2/5] qemu_agent: Introduce guest-get-info Date: Thu, 13 Aug 2026 10:31:14 +0200 Message-ID: In-Reply-To: References: MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.0 on 10.30.177.12 X-Mimecast-Spam-Score: 0 X-Mimecast-MFC-PROC-ID: J2hQmviMuKV5woo_vNxsfpEaPPZXOqwXO4YBcdPZaxU_1786609883 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Message-ID-Hash: DJ6QHPU4WHHZSEAD7H4I35DGVNSMZ2IX X-Message-ID-Hash: DJ6QHPU4WHHZSEAD7H4I35DGVNSMZ2IX X-MailFrom: mprivozn@redhat.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; loop; banned-address; header-match-devel.lists.libvirt.org-0; emergency; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header X-Mailman-Version: 3.3.10 Precedence: list List-Id: Development discussions about the libvirt library & tools Archived-At: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: From: Michal Privoznik via Devel Reply-To: Michal Privoznik X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1786610046200158500 Content-Type: text/plain; charset="utf-8"; x-default="true" From: Michal Privoznik QEMU agent has 'guest-get-info` 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 --- 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 e549947fbf..e11507326f 100644 --- a/src/hypervisor/qemu_agent.c +++ b/src/hypervisor/qemu_agent.c @@ -2681,3 +2681,122 @@ qemuAgentFSInfoFormat(qemuAgentFSInfo **agentinfo, } return ret; } + + +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 =3D NULL; + g_autoptr(virJSONValue) reply =3D NULL; + virJSONValue *data =3D NULL; + size_t ndata; + size_t i; + int rc; + + if (!(cmd =3D qemuAgentMakeCommand("guest-get-devices", NULL))) + return -1; + + if ((rc =3D qemuAgentCommandFull(agent, cmd, &reply, agent->timeout, + report_unsupported)) < 0) + return rc; + + if (!(data =3D virJSONValueObjectGetArray(reply, "return"))) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("qemu agent didn't return an array of devices")); + return -1; + } + + ndata =3D virJSONValueArraySize(data); + + *info =3D g_new0(qemuAgentGuestDeviceInfo *, ndata); + + for (i =3D 0; i < ndata; i++) { + g_autoptr(qemuAgentGuestDeviceInfo) oneInfo =3D NULL; + virJSONValue *entry =3D virJSONValueArrayGet(data, i); + virJSONValue *dDate =3D NULL; + virJSONValue *idObj =3D NULL; + + if (!entry) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("array element missing in guest-get-devices r= eturn value")); + goto error; + } + + oneInfo =3D g_new0(qemuAgentGuestDeviceInfo, 1); + + oneInfo->driverName =3D 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 =3D virJSONValueObjectGet(entry, "driver-date"))) { + if (virJSONValueGetNumberLong(dDate, &oneInfo->driverDate) < 0= ) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("malformed 'driver-date' in reply of gues= t-get-devices")); + goto error; + } + } else { + oneInfo->driverDate =3D -1; + } + + oneInfo->driverVersion =3D g_strdup(virJSONValueObjectGetString(en= try, "driver-version")); + + if ((idObj =3D virJSONValueObjectGet(entry, "id"))) { + const char *type =3D NULL; + + if (!(type =3D virJSONValueObjectGetString(idObj, "type"))) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("missing 'type' in reply of guest-get-dev= ices")); + goto error; + } + + if (STREQ("pci", type)) { + g_autofree qemuAgentGuestDeviceInfoPCI *pci =3D NULL; + + pci =3D g_new0(qemuAgentGuestDeviceInfoPCI, 1); + + if (virJSONValueObjectGetNumberUint(idObj, "vendor-id", &p= ci->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", &p= ci->deviceID) < 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + _("missing or malformed 'device-id' in = reply of guest-get-devices")); + goto error; + } + + oneInfo->pci =3D g_steal_pointer(&pci); + } + } + + (*info)[i] =3D g_steal_pointer(&oneInfo); + } + + return ndata; + + error: + for (i =3D 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 3dbc3baec1..c55cfeb99b 100644 --- a/src/hypervisor/qemu_agent.h +++ b/src/hypervisor/qemu_agent.h @@ -201,3 +201,24 @@ int qemuAgentFSInfoFormat(qemuAgentFSInfo **agentinfo, int nagentinfo, virDomainDef *vmdef, virDomainFSInfoPtr **info); + +typedef struct _qemuAgentGuestDeviceInfoPCI qemuAgentGuestDeviceInfoPCI; +struct _qemuAgentGuestDeviceInfoPCI { + unsigned int vendorID; + unsigned int deviceID; +}; + +typedef struct _qemuAgentGuestDeviceInfo qemuAgentGuestDeviceInfo; +struct _qemuAgentGuestDeviceInfo { + char *driverName; + long long driverDate; + char *driverVersion; + qemuAgentGuestDeviceInfoPCI *pci; +}; + +void qemuAgentGuestDeviceInfoFree(qemuAgentGuestDeviceInfo *info); +G_DEFINE_AUTOPTR_CLEANUP_FUNC(qemuAgentGuestDeviceInfo, qemuAgentGuestDevi= ceInfoFree); + +int qemuAgentGetGuestDeviceInfo(qemuAgent *agent, + qemuAgentGuestDeviceInfo ***info, + bool report_unsupported); diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index c76e5cb08a..9d1bac27f5 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -1724,6 +1724,7 @@ qemuAgentFSThaw; qemuAgentFSTrim; qemuAgentGetDisks; qemuAgentGetFSInfo; +qemuAgentGetGuestDeviceInfo; qemuAgentGetHostname; qemuAgentGetInterfaces; qemuAgentGetLoadAvg; @@ -1732,6 +1733,7 @@ qemuAgentGetTime; qemuAgentGetTimezone; qemuAgentGetUsers; qemuAgentGetVCPUs; +qemuAgentGuestDeviceInfoFree; qemuAgentNotifyClose; qemuAgentNotifyEvent; qemuAgentOpen; --=20 2.54.0 From nobody Mon Aug 24 09:06:31 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.libvirt.org designates 38.145.34.151 as permitted sender) client-ip=38.145.34.151; envelope-from=devel-bounces@lists.libvirt.org; helo=lists.libvirt.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of lists.libvirt.org designates 38.145.34.151 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=pass(p=reject dis=none) header.from=lists.libvirt.org ARC-Seal: i=1; a=rsa-sha256; t=1786610125; cv=none; d=zohomail.com; s=zohoarc; b=Vceefam49QHwXcxAZFPoBluRBV59SkQ+na5d9zxk6H9AIVUqs8lQ5iBP6hISP3NTTQeWwbsRVyDkn1JJ+Y6L4dFQW1gDsqRbmW1O/WfcV2exdqtygTPzFEGLlIFkUtQYL/f7ezVbIuWx7hrU9WPDhHi3t408ZShReoSt02V091Q= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1786610125; h=Content-Type:Content-Transfer-Encoding:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Owner:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:Reply-To:References:Subject:Subject:To:To:Message-Id:Cc; bh=C+iyxSvSZEKtI7Rl8ZcWi7NKdwBdnFz6x5m0Ha+Lad0=; b=QYG0fIDfkhRWweHIYIQitw7Mwe5embqwhmkSUG9N3wpF0D4vG8FWl7Sdv+w5G0UN6Q36c3YoKXp5qOMunhuYaD4LUahmFgZWqCHJ+KPePIXI4kU/1dmYfc2s48yuDF3lSc4QMAHa7POPNX58PguYSFh48JD32mfvaAMUBCr/JMc= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of lists.libvirt.org designates 38.145.34.151 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=pass header.from= (p=reject dis=none) Return-Path: Received: from lists.libvirt.org (lists.libvirt.org [38.145.34.151]) by mx.zohomail.com with SMTPS id 1786610125881160.49065891249688; Thu, 13 Aug 2026 01:35:25 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 993) id A6B7D418FA; Thu, 13 Aug 2026 04:35:24 -0400 (EDT) Received: from [172.19.199.10] (unknown [10.16.107.18]) by lists.libvirt.org (Postfix) with ESMTP id C89F341B5D; Thu, 13 Aug 2026 04:31:43 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 993) id 7C7A13FD29; Thu, 13 Aug 2026 04:31:27 -0400 (EDT) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (3072 bits) server-digest SHA256) (No client certificate requested) by lists.libvirt.org (Postfix) with ESMTPS id A15733F931 for ; Thu, 13 Aug 2026 04:31:26 -0400 (EDT) Received: from mx-prod-mc-08.mail-002.prod.us-west-2.aws.redhat.com (ec2-35-165-154-97.us-west-2.compute.amazonaws.com [35.165.154.97]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-551-2kmFjkNRP5OaxBEi5U0JbQ-1; Thu, 13 Aug 2026 04:31:24 -0400 Received: from mx-prod-int-03.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-03.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.12]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-08.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 18A901800650 for ; Thu, 13 Aug 2026 08:31:24 +0000 (UTC) Received: from moe (unknown [10.43.3.236]) by mx-prod-int-03.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 785AB195608A for ; Thu, 13 Aug 2026 08:31:23 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-26) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=-2.7 required=5.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,MAILING_LIST_MULTI,RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H2, SPF_HELO_PASS autolearn=unavailable autolearn_force=no version=4.0.1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1786609886; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=C+iyxSvSZEKtI7Rl8ZcWi7NKdwBdnFz6x5m0Ha+Lad0=; b=KzTSAk8tMeXby3HkzgyIJFGEenFvtUq9lVvVW7JV4q8r2aTC+PXtHU2yD6wRUNMKHqCc0k 0z2iwkljFn+l0bqwiDEqqjtGUpO4d5n27Dj46udVlVsWhyb1lw93LoOGyEaNvR7zxhIJFr qyIOLKOrKNwk8vj+JTafMUtyDWHTwjw= X-MC-Unique: 2kmFjkNRP5OaxBEi5U0JbQ-1 X-Mimecast-MFC-AGG-ID: 2kmFjkNRP5OaxBEi5U0JbQ_1786609884 To: devel@lists.libvirt.org Subject: [PATCH 3/5] qemuagenttest: Introduce GetGuestDeviceInfo test case Date: Thu, 13 Aug 2026 10:31:15 +0200 Message-ID: <9b95ebe16b4f81c8a51a663d386ee0ea213005a3.1786609860.git.mprivozn@redhat.com> In-Reply-To: References: MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.0 on 10.30.177.12 X-Mimecast-Spam-Score: 0 X-Mimecast-MFC-PROC-ID: AgM65Vne6OFA-nuff1XUNCMA3xMCkLhfNkntQF74S1k_1786609884 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Message-ID-Hash: HQXZGP2J57XC7ZH3YVE7VVYZHIBV7OLL X-Message-ID-Hash: HQXZGP2J57XC7ZH3YVE7VVYZHIBV7OLL X-MailFrom: mprivozn@redhat.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; loop; banned-address; header-match-devel.lists.libvirt.org-0; emergency; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header X-Mailman-Version: 3.3.10 Precedence: list List-Id: Development discussions about the libvirt library & tools Archived-At: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: From: Michal Privoznik via Devel Reply-To: Michal Privoznik X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1786610126622158500 Content-Type: text/plain; charset="utf-8"; x-default="true" From: Michal Privoznik 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 --- 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) } =20 =20 +static const char *testQemuAgentGetGuestDeviceInfoResponse =3D +"{" +" \"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 =3D (virDomainXMLOption *)data; + g_autoptr(qemuMonitorTest) test =3D qemuMonitorTestNewAgent(xmlopt); + qemuAgentGuestDeviceInfo **devices =3D NULL; + int ret =3D -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 =3D qemuAgentGetGuestDeviceInfo(qemuMonitorTestGetAgent(test), + &devices, true); + + if (ndevices < 0) + return -1; + + if (ndevices !=3D 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 !=3D 1736726400000000000LL || + devices[0]->pci->vendorID !=3D 6900 || + devices[0]->pci->deviceID !=3D 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 !=3D -1LL || + devices[1]->pci->vendorID !=3D 6900 || + devices[1]->pci->deviceID !=3D 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 !=3D 1736726400000000000LL || + devices[2]->pci->vendorID !=3D 6900 || + devices[2]->pci->deviceID !=3D 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 !=3D 1736726400000000000LL || + devices[3]->pci) { + virReportError(VIR_ERR_INTERNAL_ERROR, "%s", + "unexpected device info returned for device #3"); + goto cleanup; + } + + ret =3D 0; + cleanup: + for (i =3D 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); =20 DO_TEST(Timeout); /* Timeout should always be called last */ =20 --=20 2.54.0 From nobody Mon Aug 24 09:06:31 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.libvirt.org designates 38.145.34.151 as permitted sender) client-ip=38.145.34.151; envelope-from=devel-bounces@lists.libvirt.org; helo=lists.libvirt.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of lists.libvirt.org designates 38.145.34.151 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=pass(p=reject dis=none) header.from=lists.libvirt.org ARC-Seal: i=1; a=rsa-sha256; t=1786610201; cv=none; d=zohomail.com; s=zohoarc; b=k8XVqAt4ccOL54vk/TKm3GPHCL3fbskkCHKzdl9v8JbKCJqKj1MWSDT6a0ibMCXE4cXCbmzTct3zj1NNJXuxOwcnkJBDK5AV/fqDAus6MmuAH5Ak6YwaHCRYApFw5BBSO6Jy4cuYDZris7p/yf8+oQS2zHXYmfarDMo4vYK9P8w= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1786610201; h=Content-Type:Content-Transfer-Encoding:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Owner:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:Reply-To:References:Subject:Subject:To:To:Message-Id:Cc; bh=3G840I1yUxgDIQwVPO2CAC8VDQGP7TAGKQs/lJEMgt8=; b=eo0daMJhYMmNJRs45a0i+1zgUNxoRB1z9vHIBUN/Je+YqgLlPWfD3zgNhuLxQNpKon2OTeAII3MxOrCmyVEnXwt50cxzYqMtuqsXNDeaPmO0BANV/cEhigMjswnQnzfM4JpAtKA77GsPAeM4l/ZCNEqKTO/swDVJhOOSSv/dOdw= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of lists.libvirt.org designates 38.145.34.151 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=pass header.from= (p=reject dis=none) Return-Path: Received: from lists.libvirt.org (lists.libvirt.org [38.145.34.151]) by mx.zohomail.com with SMTPS id 1786610201695511.4455600405421; Thu, 13 Aug 2026 01:36:41 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 993) id 8D65A41958; Thu, 13 Aug 2026 04:36:40 -0400 (EDT) Received: from [172.19.199.10] (unknown [10.16.107.18]) by lists.libvirt.org (Postfix) with ESMTP id 5C57241BCE; Thu, 13 Aug 2026 04:31:51 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 993) id 0921C3FD29; Thu, 13 Aug 2026 04:31:28 -0400 (EDT) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (3072 bits) server-digest SHA256) (No client certificate requested) by lists.libvirt.org (Postfix) with ESMTPS id EC5353FD29 for ; Thu, 13 Aug 2026 04:31:27 -0400 (EDT) Received: from mx-prod-mc-06.mail-002.prod.us-west-2.aws.redhat.com (ec2-35-165-154-97.us-west-2.compute.amazonaws.com [35.165.154.97]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-642-corKiTllNOilpzBEXqXZSA-1; Thu, 13 Aug 2026 04:31:26 -0400 Received: from mx-prod-int-03.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-03.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.12]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-06.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 374AD1800107 for ; Thu, 13 Aug 2026 08:31:25 +0000 (UTC) Received: from moe (unknown [10.43.3.236]) by mx-prod-int-03.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 7B16E195608A for ; Thu, 13 Aug 2026 08:31:24 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-26) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=-2.7 required=5.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,MAILING_LIST_MULTI,RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H3, RCVD_IN_MSPIKE_WL,SPF_HELO_PASS autolearn=unavailable autolearn_force=no version=4.0.1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1786609887; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=3G840I1yUxgDIQwVPO2CAC8VDQGP7TAGKQs/lJEMgt8=; b=Bgsh9tBAABI+3op8Z9innlOPPdrHTzsZl+P21wPkOLEP090bMAHMMASuzlZljVqMsFeG8Y qvR9n+HvUrsxJoUtEOhLvwrcjzoCIhnn2BUxYU2mz49IRdGN5iwMC5zS84uzEwJLYm13Ui NDw8UOKqHJvMgey7SJqLQfheOI1h8BY= X-MC-Unique: corKiTllNOilpzBEXqXZSA-1 X-Mimecast-MFC-AGG-ID: corKiTllNOilpzBEXqXZSA_1786609885 To: devel@lists.libvirt.org Subject: [PATCH 4/5] qemu: Implement device info for virDomainGetGuestInfo() API Date: Thu, 13 Aug 2026 10:31:16 +0200 Message-ID: <04ee89f51f16c8208c1586f4275b78594ef7570d.1786609860.git.mprivozn@redhat.com> In-Reply-To: References: MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.0 on 10.30.177.12 X-Mimecast-Spam-Score: 0 X-Mimecast-MFC-PROC-ID: g__Z3D96ADGLtQl2hSeHSHI8GNGDqtH2spAbx8n3uuE_1786609885 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Message-ID-Hash: ZOOCMVLSLXFWOYUWSOW56KWQZK5JX2W5 X-Message-ID-Hash: ZOOCMVLSLXFWOYUWSOW56KWQZK5JX2W5 X-MailFrom: mprivozn@redhat.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; loop; banned-address; header-match-devel.lists.libvirt.org-0; emergency; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header X-Mailman-Version: 3.3.10 Precedence: list List-Id: Development discussions about the libvirt library & tools Archived-At: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: From: Michal Privoznik via Devel Reply-To: Michal Privoznik X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1786610203050158500 Content-Type: text/plain; charset="utf-8"; x-default="true" From: Michal Privoznik 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 --- 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 qemuDomainGetGuestInfoSup= portedTypes =3D 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; =20 static int qemuDomainGetGuestInfoCheckSupport(unsigned int types, @@ -20171,6 +20172,43 @@ virDomainInterfaceFormatParams(virDomainInterfaceP= tr *ifaces, } } =20 + +static void +qemuAgentGuestDeviceInfoFormatParams(qemuAgentGuestDeviceInfo **devices, + size_t ndevices, + virTypedParamList *list) +{ + size_t i; + + virTypedParamListAddUInt(list, ndevices, VIR_DOMAIN_GUEST_INFO_DEVICE_= COUNT); + + for (i =3D 0; i < ndevices; i++) { + virTypedParamListAddString(list, devices[i]->driverName, + VIR_DOMAIN_GUEST_INFO_DEVICE_PREFIX "%z= u" VIR_DOMAIN_GUEST_INFO_DEVICE_SUFFIX_DRIVER_NAME, i); + + if (devices[i]->driverDate !=3D -1) { + /* Guest agent reports this in nanoseconds, our API in seconds= . */ + virTypedParamListAddLLong(list, devices[i]->driverDate / 10000= 00, + 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 =3D 0; double load15m =3D 0; bool format_load =3D false; + qemuAgentGuestDeviceInfo **devices =3D NULL; + size_t ndevices =3D 0; size_t i; g_autoptr(virTypedParamList) list =3D virTypedParamListNew(); =20 @@ -20274,6 +20314,14 @@ qemuDomainGetGuestInfo(virDomainPtr dom, format_load =3D true; } =20 + if (supportedTypes & VIR_DOMAIN_GUEST_INFO_DEVICES) { + rc =3D qemuAgentGetGuestDeviceInfo(agent, &devices, report_unsuppo= rted); + if (rc =3D=3D -1) + goto exitagent; + if (rc >=3D 0) + ndevices =3D rc; + } + qemuDomainObjExitAgent(vm, agent); virDomainObjEndAgentJob(vm); =20 @@ -20306,6 +20354,8 @@ qemuDomainGetGuestInfo(virDomainPtr dom, virTypedParamListAddDouble(list, load15m, VIR_DOMAIN_GUEST_INFO_LO= AD_15M); } =20 + qemuAgentGuestDeviceInfoFormatParams(devices, ndevices, list); + if (virTypedParamListSteal(list, params, nparams) < 0) goto cleanup; =20 @@ -20323,6 +20373,12 @@ qemuDomainGetGuestInfo(virDomainPtr dom, virDomainInterfaceFree(ifaces[i]); } g_free(ifaces); + if (devices && ndevices > 0) { + for (i =3D 0; i < ndevices; i++) { + qemuAgentGuestDeviceInfoFree(devices[i]); + } + g_free(devices); + } =20 virDomainObjEndAPI(&vm); return ret; --=20 2.54.0 From nobody Mon Aug 24 09:06:31 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.libvirt.org designates 38.145.34.151 as permitted sender) client-ip=38.145.34.151; envelope-from=devel-bounces@lists.libvirt.org; helo=lists.libvirt.org; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of lists.libvirt.org designates 38.145.34.151 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=pass(p=reject dis=none) header.from=lists.libvirt.org ARC-Seal: i=1; a=rsa-sha256; t=1786610260; cv=none; d=zohomail.com; s=zohoarc; b=SrcbC24L+2DikIJsSLw5+sBxQIdvLeUBH3IG0id1L9lCElPNXZGLaMOKHPV7Ki80g4RmK69oNkTN4428vkm61x3U7b+gpnaupNvq6QK6aPvSB+FCQIQFdsDEEwSzh9K04tXsosSHIUFKbZbn+1EAQMG0DsfFrEWXrtfzkxSoa4c= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1786610260; h=Content-Type:Content-Transfer-Encoding:Date:Date:From:From:In-Reply-To:List-Subscribe:List-Post:List-Owner:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:Reply-To:References:Subject:Subject:To:To:Message-Id:Cc; bh=bAn9XFGahV1DVo/+EEkCtbp8BGf32bJ7mRVAlBTTe4k=; b=fE2fIn1Wy39L/PJFoKafvIiQGnxenFeIqRwlDKAfwYHqn813Co2sDT9b2sugqUZ7Omb/p69mGjIUT4O1efL2THmnNiQdUg0wbQ+50psPopfj71e2Ud4NRRchVdXEd7Wfxc4FqrVoqHPX0CTu5YHkhDt57VWF6LUzIHMIUuEYuhQ= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of lists.libvirt.org designates 38.145.34.151 as permitted sender) smtp.mailfrom=devel-bounces@lists.libvirt.org; dmarc=pass header.from= (p=reject dis=none) Return-Path: Received: from lists.libvirt.org (lists.libvirt.org [38.145.34.151]) by mx.zohomail.com with SMTPS id 1786610260053532.8566838587552; Thu, 13 Aug 2026 01:37:40 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 993) id BD9F74184B; Thu, 13 Aug 2026 04:37:38 -0400 (EDT) Received: from [172.19.199.10] (unknown [10.16.107.18]) by lists.libvirt.org (Postfix) with ESMTP id 2FD5741C09; Thu, 13 Aug 2026 04:31:56 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 993) id D85BF41AE2; Thu, 13 Aug 2026 04:31:40 -0400 (EDT) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (3072 bits) server-digest SHA256) (No client certificate requested) by lists.libvirt.org (Postfix) with ESMTPS id EC15241904 for ; Thu, 13 Aug 2026 04:31:29 -0400 (EDT) Received: from mx-prod-mc-08.mail-002.prod.us-west-2.aws.redhat.com (ec2-35-165-154-97.us-west-2.compute.amazonaws.com [35.165.154.97]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-151-9XMpaa5jNLS4DN6JRLrDTQ-1; Thu, 13 Aug 2026 04:31:26 -0400 Received: from mx-prod-int-03.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-03.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.12]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by mx-prod-mc-08.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id 168911800344 for ; Thu, 13 Aug 2026 08:31:26 +0000 (UTC) Received: from moe (unknown [10.43.3.236]) by mx-prod-int-03.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id 75E09195608A for ; Thu, 13 Aug 2026 08:31:25 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 4.0.1 (2024-03-26) on lists.libvirt.org X-Spam-Level: X-Spam-Status: No, score=-2.7 required=5.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,MAILING_LIST_MULTI,RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H2, SPF_HELO_PASS autolearn=unavailable autolearn_force=no version=4.0.1 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1786609889; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=bAn9XFGahV1DVo/+EEkCtbp8BGf32bJ7mRVAlBTTe4k=; b=Yy0SpEiWTWux1KQJd0IJM4kKU59DyT8xMDcuc0r+Qk8Y9Os45oBqSMf4FeUp00vv4RqxuH SrWUuK88ohrplcLq0iaNrZWfXH/9qRckKd7Yq6rTA3V8VKaMJYbbhF6DyOfSH5GB8lmKEO wOxnWGAzCaXvbJVwJ3n2YiRpGkzpqTM= X-MC-Unique: 9XMpaa5jNLS4DN6JRLrDTQ-1 X-Mimecast-MFC-AGG-ID: 9XMpaa5jNLS4DN6JRLrDTQ_1786609886 To: devel@lists.libvirt.org Subject: [PATCH 5/5] virsh: Add support for VIR_DOMAIN_GUEST_INFO_DEVICES Date: Thu, 13 Aug 2026 10:31:17 +0200 Message-ID: <048447b7936e810b6895a78fd0177bd9c705edfb.1786609860.git.mprivozn@redhat.com> In-Reply-To: References: MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.0 on 10.30.177.12 X-Mimecast-Spam-Score: 0 X-Mimecast-MFC-PROC-ID: yFB-qHpCJ79l1hOziYqio6sMEeAUbCJxIiaeNYHrhjk_1786609886 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Message-ID-Hash: BHIKHAGGXZNMGOX7UPLZRYBPKWDGKFKU X-Message-ID-Hash: BHIKHAGGXZNMGOX7UPLZRYBPKWDGKFKU X-MailFrom: mprivozn@redhat.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; loop; banned-address; header-match-devel.lists.libvirt.org-0; emergency; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header X-Mailman-Version: 3.3.10 Precedence: list List-Id: Development discussions about the libvirt library & tools Archived-At: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: From: Michal Privoznik via Devel Reply-To: Michal Privoznik X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1786610261652158500 Content-Type: text/plain; charset="utf-8"; x-default="true" From: Michal Privoznik 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 --- 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..6803bbb57a 100644 --- a/docs/manpages/virsh.rst +++ b/docs/manpages/virsh.rst @@ -3277,7 +3277,7 @@ guestinfo :: =20 guestinfo domain [--user] [--os] [--timezone] [--hostname] [--filesyste= m] - [--disk] [--interface] + [--disk] [--interface] [--devices] =20 Print information about the guest from the point of view of the guest agen= t. 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. =20 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*, *--lo= ad* +and *--devices*. If an explicitly requested information type is not suppo= rted +by the guest agent at that point, the processes will provide an exit code = of 1. =20 Note that depending on the hypervisor type and the version of the guest ag= ent 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 =20 +*--devices* returns: +* ``device.count`` - the number of devices that info is returned for +* ``device..driverName`` - name of the driver associated with device +* ``device..driverDate`` - driver release date in seconds since the e= poch +* ``device..driverVersion`` - version of the driver associated with t= he device +* ``device..idType`` - device identification type (e.g. pci) +* ``device..pciVendor`` - vendor ID for PCI device +* ``device..pciDevice`` - device ID for PCI device + =20 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[] =3D { .type =3D VSH_OT_BOOL, .help =3D N_("report load averages information"), }, + {.name =3D "devices", + .type =3D VSH_OT_BOOL, + .help =3D N_("report devices information"), + }, {.name =3D NULL} }; =20 @@ -13778,6 +13782,8 @@ cmdGuestInfo(vshControl *ctl, const vshCmd *cmd) types |=3D VIR_DOMAIN_GUEST_INFO_INTERFACES; if (vshCommandOptBool(cmd, "load")) types |=3D VIR_DOMAIN_GUEST_INFO_LOAD; + if (vshCommandOptBool(cmd, "devices")) + types |=3D VIR_DOMAIN_GUEST_INFO_DEVICES; =20 if (!(dom =3D virshCommandOptDomain(ctl, cmd, NULL))) return false; --=20 2.54.0