From nobody Tue Oct 28 17:34:52 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of lists.libvirt.org designates 8.43.85.245 as permitted sender) client-ip=8.43.85.245; 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 8.43.85.245 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=1760024240; cv=none; d=zohomail.com; s=zohoarc; b=NiT/sHC+u0lcufE/G8nEOJes/pUxunbW0yRUK2j2ZZlbvdualQBENyWwpRpADPhPsSEf78xWX2Dxf53gvNvK5arpCPwDejqI1ShGvPcxFz+0KLvL6XlbNRmFCkHD7CVaQKvk0w5HCuQ+EUTXhT75SFCHtVe7UjJoBPwvHESrJ9w= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1760024240; 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=vm67iEZUsSydkmRrciFdoDQyus2FAWDY+4K6uqhoBsQ=; b=UWd6SY9Db3QLA0mIfXjkTzrVX3GzXAi1Px2pzAJ7Xx5s+PTm9arjgW2aUYq34qQH98IuwBdSVmJ46cMrYODGa+WaaY+VA+lYAF9GaAenrWQ41uoMxKi7gKPjlXNSYhLRKAjj2Rgr05HT/KJALH/hpqR4Z9/gUMrOILmvqdJP6Dk= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; spf=pass (zohomail.com: domain of lists.libvirt.org designates 8.43.85.245 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 [8.43.85.245]) by mx.zohomail.com with SMTPS id 1760024240759793.6425775520244; Thu, 9 Oct 2025 08:37:20 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 993) id 23563442D8; Thu, 9 Oct 2025 11:37:20 -0400 (EDT) Received: from [172.19.199.20] (lists.libvirt.org [8.43.85.245]) by lists.libvirt.org (Postfix) with ESMTP id A4A5A4424F; Thu, 9 Oct 2025 11:17:44 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 993) id 472934476C; Thu, 9 Oct 2025 11:17:38 -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 5D09443F27 for ; Thu, 9 Oct 2025 11:16:38 -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-508-YDFDVDIBODqS7OCVIqrdJA-1; Thu, 09 Oct 2025 11:16:35 -0400 Received: from mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com (mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.17]) (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 890D81800562 for ; Thu, 9 Oct 2025 15:16:34 +0000 (UTC) Received: from speedmetal.lan (unknown [10.44.22.12]) by mx-prod-int-05.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP id C0C481955F22 for ; Thu, 9 Oct 2025 15:16:33 +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=-3.1 required=5.0 tests=DKIM_INVALID,DKIM_SIGNED, MAILING_LIST_MULTI,RCVD_IN_DNSWL_MED, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED,RCVD_IN_VALIDITY_RPBL_BLOCKED, RCVD_IN_VALIDITY_SAFE_BLOCKED,SPF_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=1760022998; 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=vm67iEZUsSydkmRrciFdoDQyus2FAWDY+4K6uqhoBsQ=; b=gu1qc/+U6hdGn3tTqEHyhlJ9Hu9Gi7O0K69fBG/ec8y+fihGvuptEx5QFB1vH/6437jitX mGGkI06esrHKKeyPS9pN5p71MQ45BfSPqcBe2MACC+NovG0GdlxdQ0SeUaIWQ19U0TVQH3 zo+n0vwvG2NoD5ZRUe8PjvD0z8/tPus= X-MC-Unique: YDFDVDIBODqS7OCVIqrdJA-1 X-Mimecast-MFC-AGG-ID: YDFDVDIBODqS7OCVIqrdJA_1760022994 To: devel@lists.libvirt.org Subject: [RFC PATCH 12/16] Expose qemu timed block statistics via bulk stats API Date: Thu, 9 Oct 2025 17:16:12 +0200 Message-ID: In-Reply-To: References: MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.0 on 10.30.177.17 X-Mimecast-Spam-Score: 0 X-Mimecast-MFC-PROC-ID: HVa6suehPNZpNOZ6wXeP9a3-8yJSxiE7vnBPQDqibjc_1760022994 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Message-ID-Hash: V5KSR3MNQXD6ZYVBCE4ZWWAVRI336H5P X-Message-ID-Hash: V5KSR3MNQXD6ZYVBCE4ZWWAVRI336H5P X-MailFrom: pkrempa@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: Peter Krempa via Devel Reply-To: Peter Krempa X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZM-MESSAGEID: 1760024242358154100 Content-Type: text/plain; charset="utf-8" From: Peter Krempa The statistics show various disk access timing parameters collected in configurable interval which can be useful for performance investigations. Note that the statistic collection needs to be enabled explicitly for the statistics to be collected and displayed. Signed-off-by: Peter Krempa --- docs/manpages/virsh.rst | 33 ++++++ include/libvirt/libvirt-domain.h | 178 +++++++++++++++++++++++++++++++ src/qemu/qemu_driver.c | 94 ++++++++++++++++ 3 files changed, 305 insertions(+) diff --git a/docs/manpages/virsh.rst b/docs/manpages/virsh.rst index 5b4eb236a4..73263ffc7f 100644 --- a/docs/manpages/virsh.rst +++ b/docs/manpages/virsh.rst @@ -2772,6 +2772,39 @@ Information listed includes: that no bounce buffer is needed * ``block..limits.memory_alignment_optimal`` - memory alignment in by= tes that is used for bounce buffers +* ``block..timed_group.count`` - number of blocks of timed group stat= istics +* ``block..timed_group..interval_length`` - The time interval in + seconds for which the statistics in this group were collected. +* ``block..timed_group..rd_latency_min`` - minimum latency of re= ad + operations in the defined interval in nanoseconds +* ``block..timed_group..rd_latency_max`` - maximum latency of re= ad + operations in the defined interval in nanoseconds +* ``block..timed_group..rd_latency_avg`` - average latency of re= ad + operations in the defined interval in nanoseconds +* ``block..timed_group..wr_latency_min`` - minimum latency of wr= ite + operations in the defined interval in nanoseconds +* ``block..timed_group..wr_latency_max`` - maximum latency of wr= ite + operations in the defined interval in nanoseconds +* ``block..timed_group..wr_latency_avg`` - average latency of wr= ite + operations in the defined interval in nanoseconds +* ``block..timed_group..zone_append_latency_min`` - minimum late= ncy + of zone append operations in the defined interval in nanoseconds +* ``block..timed_group..zone_append_latency_max`` - maximum late= ncy + of zone append operations in the defined interval in nanoseconds +* ``block..timed_group..zone_append_latency_avg`` - average late= ncy + of zone append operations in the defined interval in nanoseconds +* ``block..timed_group..flush_latency_min`` - minimum latency + of flush operations in the defined interval in nanoseconds +* ``block..timed_group..flush_latency_max`` - maximum latency of= flush + operations in the defined interval in nanoseconds +* ``block..timed_group..flush_latency_avg`` - average latency of= flush + operations in the defined interval in nanoseconds +* ``block..timed_group..rd_queue_depth_avg`` - average number of + pending read operations in the defined interval +* ``block..timed_group..wr_queue_depth_avg`` - average number of + pending write operations in the defined interval +* ``block..timed_group..zone_append_queue_depth_avg`` - average = number + of pending zone append operations in the defined interval *--iothread* returns information about IOThreads on the running guest diff --git a/include/libvirt/libvirt-domain.h b/include/libvirt/libvirt-dom= ain.h index 90c37a575c..56bd085ef5 100644 --- a/include/libvirt/libvirt-domain.h +++ b/include/libvirt/libvirt-domain.h @@ -3637,6 +3637,184 @@ struct _virDomainStatsRecord { */ # define VIR_DOMAIN_STATS_BLOCK_SUFFIX_LIMITS_MEMORY_ALIGNMENT_OPTIMAL ".l= imits.memory_alignment_optimal" +/** + * VIR_DOMAIN_STATS_BLOCK_SUFFIX_TIMED_GROUP_COUNT: + * + * Number of groups of statistics accounted in a configured time intervals= as + * unsigned long long. + * + * Since: 11.9.0 + */ +# define VIR_DOMAIN_STATS_BLOCK_SUFFIX_TIMED_GROUP_COUNT ".timed_group.cou= nt" + +/** + * VIR_DOMAIN_STATS_BLOCK_SUFFIX_TIMED_GROUP_PREFIX: + * + * The parameter name prefix to access each group of timed stats. Concaten= ate the + * prefix, the entry number formatted as an unsigned integer and one of the + * timed group suffix parameters to form a complete paramter name. + * + * Since: 11.9.0 + */ +# define VIR_DOMAIN_STATS_BLOCK_SUFFIX_TIMED_GROUP_PREFIX ".timed_group." + +/** + * VIR_DOMAIN_STATS_BLOCK_SUFFIX_TIMED_GROUP_SUFFIX_INTERVAL: + * + * The time interval in seconds as unsigned long long for which the statis= tics + * in this group were collected. + * + * Since: 11.9.0 + */ +# define VIR_DOMAIN_STATS_BLOCK_SUFFIX_TIMED_GROUP_SUFFIX_INTERVAL ".inter= val" + +/** + * VIR_DOMAIN_STATS_BLOCK_SUFFIX_TIMED_GROUP_SUFFIX_RD_LATENCY_MIN: + * + * Minimum latency of read operations in the defined interval, in nanoseco= nds as + * unsigned long long. + * + * Since: 11.9.0 + */ +# define VIR_DOMAIN_STATS_BLOCK_SUFFIX_TIMED_GROUP_SUFFIX_RD_LATENCY_MIN "= .rd_latency_min" + +/** + * VIR_DOMAIN_STATS_BLOCK_SUFFIX_TIMED_GROUP_SUFFIX_RD_LATENCY_MAX: + * + * Maximum latency of read operations in the defined interval, in nanoseco= nds as + * unsigned long long. + * + * Since: 11.9.0 + */ +# define VIR_DOMAIN_STATS_BLOCK_SUFFIX_TIMED_GROUP_SUFFIX_RD_LATENCY_MAX "= .rd_latency_max" + +/** + * VIR_DOMAIN_STATS_BLOCK_SUFFIX_TIMED_GROUP_SUFFIX_RD_LATENCY_AVG: + * + * Average latency of read operations in the defined interval, in nanoseco= nds as + * unsigned long long. + * + * Since: 11.9.0 + */ +# define VIR_DOMAIN_STATS_BLOCK_SUFFIX_TIMED_GROUP_SUFFIX_RD_LATENCY_AVG "= .rd_latency_avg" + +/** + * VIR_DOMAIN_STATS_BLOCK_SUFFIX_TIMED_GROUP_SUFFIX_WR_LATENCY_MIN: + * + * Minimum latency of write operations in the defined interval, in nanosec= onds + * as unsigned long long. + * + * Since: 11.9.0 + */ +# define VIR_DOMAIN_STATS_BLOCK_SUFFIX_TIMED_GROUP_SUFFIX_WR_LATENCY_MIN "= .wr_latency_min" + +/** + * VIR_DOMAIN_STATS_BLOCK_SUFFIX_TIMED_GROUP_SUFFIX_WR_LATENCY_MAX: + * + * Maximum latency of write operations in the defined interval, in nanosec= onds + * as unsigned long long. + * + * Since: 11.9.0 + */ +# define VIR_DOMAIN_STATS_BLOCK_SUFFIX_TIMED_GROUP_SUFFIX_WR_LATENCY_MAX "= .wr_latency_max" + +/** + * VIR_DOMAIN_STATS_BLOCK_SUFFIX_TIMED_GROUP_SUFFIX_WR_LATENCY_AVG: + * + * Average latency of write operations in the defined interval, in nanosec= onds + * as unsigned long long. + * + * Since: 11.9.0 + */ +# define VIR_DOMAIN_STATS_BLOCK_SUFFIX_TIMED_GROUP_SUFFIX_WR_LATENCY_AVG "= .wr_latency_avg" + +/** + * VIR_DOMAIN_STATS_BLOCK_SUFFIX_TIMED_GROUP_SUFFIX_ZONE_APPEND_LATENCY_MI= N: + * Minimum latency of zone append operations in the defined interval, in + * nanoseconds as unsigned long long. + * + * Since: 11.9.0 + */ +# define VIR_DOMAIN_STATS_BLOCK_SUFFIX_TIMED_GROUP_SUFFIX_ZONE_APPEND_LATE= NCY_MIN ".zone_append_latency_min" + +/** + * VIR_DOMAIN_STATS_BLOCK_SUFFIX_TIMED_GROUP_SUFFIX_ZONE_APPEND_LATENCY_MA= X: + * + * Maximum latency of zone append operations in the defined interval, in + * nanoseconds as unsigned long long. + * + * Since: 11.9.0 + */ +# define VIR_DOMAIN_STATS_BLOCK_SUFFIX_TIMED_GROUP_SUFFIX_ZONE_APPEND_LATE= NCY_MAX ".zone_append_latency_max" + +/** + * VIR_DOMAIN_STATS_BLOCK_SUFFIX_TIMED_GROUP_SUFFIX_ZONE_APPEND_LATENCY_AV= G: + * + * Average latency of zone append operations in the defined interval, in + * nanoseconds as unsigned long long. + * + * Since: 11.9.0 + */ +# define VIR_DOMAIN_STATS_BLOCK_SUFFIX_TIMED_GROUP_SUFFIX_ZONE_APPEND_LATE= NCY_AVG ".zone_append_latency_avg" + +/** + * VIR_DOMAIN_STATS_BLOCK_SUFFIX_TIMED_GROUP_SUFFIX_FLUSH_LATENCY_MIN: + * + * Minimum latency of flush operations in the defined interval, in nanosec= onds + * as unsigned long long. + * + * Since: 11.9.0 + */ +# define VIR_DOMAIN_STATS_BLOCK_SUFFIX_TIMED_GROUP_SUFFIX_FLUSH_LATENCY_MI= N ".flush_latency_min" + +/** + * VIR_DOMAIN_STATS_BLOCK_SUFFIX_TIMED_GROUP_SUFFIX_FLUSH_LATENCY_MAX: + * + * Maximum latency of flush operations in the defined interval, in nanosec= onds + * as unsigned long long. + * + * Since: 11.9.0 + */ +# define VIR_DOMAIN_STATS_BLOCK_SUFFIX_TIMED_GROUP_SUFFIX_FLUSH_LATENCY_MA= X ".flush_latency_max" + +/** + * VIR_DOMAIN_STATS_BLOCK_SUFFIX_TIMED_GROUP_SUFFIX_FLUSH_LATENCY_AVG: + * + * Average latency of flush operations in the defined interval, in nanosec= onds + * as unsigned long long. + * + * Since: 11.9.0 + */ +# define VIR_DOMAIN_STATS_BLOCK_SUFFIX_TIMED_GROUP_SUFFIX_FLUSH_LATENCY_AV= G ".flush_latency_avg" + +/** + * VIR_DOMAIN_STATS_BLOCK_SUFFIX_TIMED_GROUP_SUFFIX_RD_QUEUE_DEPTH_AVG: + * + * Average number of pending read operations in the defined interval as do= uble. + * + * Since: 11.9.0 + */ +# define VIR_DOMAIN_STATS_BLOCK_SUFFIX_TIMED_GROUP_SUFFIX_RD_QUEUE_DEPTH_A= VG ".rd_queue_depth_avg" + +/** + * VIR_DOMAIN_STATS_BLOCK_SUFFIX_TIMED_GROUP_SUFFIX_WR_QUEUE_DEPTH_AVG: + * + * Average number of pending write operations in the defined interval as d= ouble. + * + * Since: 11.9.0 + */ +# define VIR_DOMAIN_STATS_BLOCK_SUFFIX_TIMED_GROUP_SUFFIX_WR_QUEUE_DEPTH_A= VG ".wr_queue_depth_avg" + +/** + * VIR_DOMAIN_STATS_BLOCK_SUFFIX_TIMED_GROUP_SUFFIX_ZONE_APPEND_QUEUE_DEPT= H_AVG: + * + * Average number of pending zone append operations in the defined interva= l as + * double. + * + * Since: 11.9.0 + */ +# define VIR_DOMAIN_STATS_BLOCK_SUFFIX_TIMED_GROUP_SUFFIX_ZONE_APPEND_QUEU= E_DEPTH_AVG ".zone_append_queue_depth_avg" + /** * VIR_DOMAIN_STATS_PERF_CMT: * diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 4e5e2fed0f..b8157bd3fe 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -17581,6 +17581,7 @@ qemuDomainGetStatsBlockExportFrontend(const char *f= rontendname, virTypedParamList *par) { qemuBlockStats *en; + size_t i; /* In case where qemu didn't provide the stats we stop here rather than * trying to refresh the stats from the disk. Inability to provide sta= ts is @@ -17604,6 +17605,99 @@ qemuDomainGetStatsBlockExportFrontend(const char *= frontendname, VIR_DOMAIN_STATS_BLOCK_PREFIX "%zu" VIR_DOM= AIN_STATS_BLOCK_SUFFIX_FL_REQS, idx); virTypedParamListAddULLong(par, en->flush_total_times, VIR_DOMAIN_STATS_BLOCK_PREFIX "%zu" VIR_DOM= AIN_STATS_BLOCK_SUFFIX_FL_TIMES, idx); + + if (en->n_timed_stats > 0) { + virTypedParamListAddULLong(par, en->n_timed_stats, + VIR_DOMAIN_STATS_BLOCK_PREFIX "%zu" VIR= _DOMAIN_STATS_BLOCK_SUFFIX_TIMED_GROUP_COUNT, idx); + + for (i =3D 0; i < en->n_timed_stats; i++) { + virTypedParamListAddULLong(par, en->timed_stats[i].interval_le= ngth, + VIR_DOMAIN_STATS_BLOCK_PREFIX "%zu" + VIR_DOMAIN_STATS_BLOCK_SUFFIX_TIMED= _GROUP_PREFIX "%zu" + VIR_DOMAIN_STATS_BLOCK_SUFFIX_TIMED= _GROUP_SUFFIX_INTERVAL, + idx, i); + + virTypedParamListAddULLong(par, en->timed_stats[i].rd_latency_= min, + VIR_DOMAIN_STATS_BLOCK_PREFIX "%zu" + VIR_DOMAIN_STATS_BLOCK_SUFFIX_TIMED= _GROUP_PREFIX "%zu" + VIR_DOMAIN_STATS_BLOCK_SUFFIX_TIMED= _GROUP_SUFFIX_RD_LATENCY_MIN, + idx, i); + virTypedParamListAddULLong(par, en->timed_stats[i].rd_latency_= max, + VIR_DOMAIN_STATS_BLOCK_PREFIX "%zu" + VIR_DOMAIN_STATS_BLOCK_SUFFIX_TIMED= _GROUP_PREFIX "%zu" + VIR_DOMAIN_STATS_BLOCK_SUFFIX_TIMED= _GROUP_SUFFIX_RD_LATENCY_MAX, + idx, i); + virTypedParamListAddULLong(par, en->timed_stats[i].rd_latency_= avg, + VIR_DOMAIN_STATS_BLOCK_PREFIX "%zu" + VIR_DOMAIN_STATS_BLOCK_SUFFIX_TIMED= _GROUP_PREFIX "%zu" + VIR_DOMAIN_STATS_BLOCK_SUFFIX_TIMED= _GROUP_SUFFIX_RD_LATENCY_AVG, + idx, i); + + virTypedParamListAddULLong(par, en->timed_stats[i].wr_latency_= min, + VIR_DOMAIN_STATS_BLOCK_PREFIX "%zu" + VIR_DOMAIN_STATS_BLOCK_SUFFIX_TIMED= _GROUP_PREFIX "%zu" + VIR_DOMAIN_STATS_BLOCK_SUFFIX_TIMED= _GROUP_SUFFIX_WR_LATENCY_MIN, + idx, i); + virTypedParamListAddULLong(par, en->timed_stats[i].wr_latency_= max, + VIR_DOMAIN_STATS_BLOCK_PREFIX "%zu" + VIR_DOMAIN_STATS_BLOCK_SUFFIX_TIMED= _GROUP_PREFIX "%zu" + VIR_DOMAIN_STATS_BLOCK_SUFFIX_TIMED= _GROUP_SUFFIX_WR_LATENCY_MAX, + idx, i); + virTypedParamListAddULLong(par, en->timed_stats[i].wr_latency_= avg, + VIR_DOMAIN_STATS_BLOCK_PREFIX "%zu" + VIR_DOMAIN_STATS_BLOCK_SUFFIX_TIMED= _GROUP_PREFIX "%zu" + VIR_DOMAIN_STATS_BLOCK_SUFFIX_TIMED= _GROUP_SUFFIX_WR_LATENCY_AVG, + idx, i); + + virTypedParamListAddULLong(par, en->timed_stats[i].zone_append= _latency_min, + VIR_DOMAIN_STATS_BLOCK_PREFIX "%zu" + VIR_DOMAIN_STATS_BLOCK_SUFFIX_TIMED= _GROUP_PREFIX "%zu" + VIR_DOMAIN_STATS_BLOCK_SUFFIX_TIMED= _GROUP_SUFFIX_ZONE_APPEND_LATENCY_MIN, + idx, i); + virTypedParamListAddULLong(par, en->timed_stats[i].zone_append= _latency_max, + VIR_DOMAIN_STATS_BLOCK_PREFIX "%zu" + VIR_DOMAIN_STATS_BLOCK_SUFFIX_TIMED= _GROUP_PREFIX "%zu" + VIR_DOMAIN_STATS_BLOCK_SUFFIX_TIMED= _GROUP_SUFFIX_ZONE_APPEND_LATENCY_MAX, + idx, i); + virTypedParamListAddULLong(par, en->timed_stats[i].zone_append= _latency_avg, + VIR_DOMAIN_STATS_BLOCK_PREFIX "%zu" + VIR_DOMAIN_STATS_BLOCK_SUFFIX_TIMED= _GROUP_PREFIX "%zu" + VIR_DOMAIN_STATS_BLOCK_SUFFIX_TIMED= _GROUP_SUFFIX_ZONE_APPEND_LATENCY_AVG, + idx, i); + + virTypedParamListAddULLong(par, en->timed_stats[i].flush_laten= cy_min, + VIR_DOMAIN_STATS_BLOCK_PREFIX "%zu" + VIR_DOMAIN_STATS_BLOCK_SUFFIX_TIMED= _GROUP_PREFIX "%zu" + VIR_DOMAIN_STATS_BLOCK_SUFFIX_TIMED= _GROUP_SUFFIX_FLUSH_LATENCY_MIN, + idx, i); + virTypedParamListAddULLong(par, en->timed_stats[i].flush_laten= cy_max, + VIR_DOMAIN_STATS_BLOCK_PREFIX "%zu" + VIR_DOMAIN_STATS_BLOCK_SUFFIX_TIMED= _GROUP_PREFIX "%zu" + VIR_DOMAIN_STATS_BLOCK_SUFFIX_TIMED= _GROUP_SUFFIX_FLUSH_LATENCY_MAX, + idx, i); + virTypedParamListAddULLong(par, en->timed_stats[i].flush_laten= cy_avg, + VIR_DOMAIN_STATS_BLOCK_PREFIX "%zu" + VIR_DOMAIN_STATS_BLOCK_SUFFIX_TIMED= _GROUP_PREFIX "%zu" + VIR_DOMAIN_STATS_BLOCK_SUFFIX_TIMED= _GROUP_SUFFIX_FLUSH_LATENCY_AVG, + idx, i); + + virTypedParamListAddDouble(par, en->timed_stats[i].rd_queue_de= pth_avg, + VIR_DOMAIN_STATS_BLOCK_PREFIX "%zu" + VIR_DOMAIN_STATS_BLOCK_SUFFIX_TIMED= _GROUP_PREFIX "%zu" + VIR_DOMAIN_STATS_BLOCK_SUFFIX_TIMED= _GROUP_SUFFIX_RD_QUEUE_DEPTH_AVG, + idx, i); + virTypedParamListAddDouble(par, en->timed_stats[i].wr_queue_de= pth_avg, + VIR_DOMAIN_STATS_BLOCK_PREFIX "%zu" + VIR_DOMAIN_STATS_BLOCK_SUFFIX_TIMED= _GROUP_PREFIX "%zu" + VIR_DOMAIN_STATS_BLOCK_SUFFIX_TIMED= _GROUP_SUFFIX_WR_QUEUE_DEPTH_AVG, + idx, i); + virTypedParamListAddDouble(par, en->timed_stats[i].zone_append= _queue_depth_avg, + VIR_DOMAIN_STATS_BLOCK_PREFIX "%zu" + VIR_DOMAIN_STATS_BLOCK_SUFFIX_TIMED= _GROUP_PREFIX "%zu" + VIR_DOMAIN_STATS_BLOCK_SUFFIX_TIMED= _GROUP_SUFFIX_ZONE_APPEND_QUEUE_DEPTH_AVG, + idx, i); + } + } } --=20 2.51.0