From nobody Tue Oct 28 17:33:27 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=1760023905; cv=none; d=zohomail.com; s=zohoarc; b=bDnp5akPPj6K296ES+z+YT4Bk2ikat1+FgztVOmGPT15iT9j31msKxR4hD1LoJcXt8Y1kWq37fdSL4N8HWayMRIA14Jvzn0PGMD3m2pCDO3VcOP1o8mieiDI3/WwMnW6wvi1HH4ODK6QLA4OFX850zrRa/jp/ogov2b0fq2qGLc= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1760023905; 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=w0RalV8Yd+1yg8nGAD+SCRS2sbnuEZY6qVRzEd+LZbc=; b=kKaOSrsHh8vKD0G6/9alDZErwuVP/b2kyjbPcIX/0bWcOxjLNhpV3mHVHTdg5IW5IQ/1SuFOp2O4HxxK6lHSJ/OR9CgpGzR0FCXtSyDGv96Q2BFH6rDugTrsRP62rXJKaFe/6kXdi2aVeOTDb6KhuEHD8FSKbEgVDY9TfnlWyaQ= 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 1760023905616937.9183676243226; Thu, 9 Oct 2025 08:31:45 -0700 (PDT) Received: by lists.libvirt.org (Postfix, from userid 993) id 8BD2F418CE; Thu, 9 Oct 2025 11:31:42 -0400 (EDT) Received: from [172.19.199.20] (lists.libvirt.org [8.43.85.245]) by lists.libvirt.org (Postfix) with ESMTP id DEC6C44824; Thu, 9 Oct 2025 11:17:26 -0400 (EDT) Received: by lists.libvirt.org (Postfix, from userid 993) id 5974843F79; Thu, 9 Oct 2025 11:16:45 -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 125A643F61 for ; Thu, 9 Oct 2025 11:16:32 -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-222-8rW9GmptMQqtMUZtoWVISQ-1; Thu, 09 Oct 2025 11:16:31 -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-05.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS id C65EF1954B0B for ; Thu, 9 Oct 2025 15:16:30 +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 0A9D21955F22 for ; Thu, 9 Oct 2025 15:16:29 +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=1760022992; 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=w0RalV8Yd+1yg8nGAD+SCRS2sbnuEZY6qVRzEd+LZbc=; b=UPXccRPXgK4ZL8LdS5uKVQtC8rJlhEKBNADJAJTRADTkjXui0jJf8enHEpIR9HLH8/ZsXB iMs5h/qlNXfh4LfmDgVMjXiuDTYGihrWe5FP8sb1wzGzhVIV5BCG1fftC10CEN+QDLNf62 k+xYj0WrKBxMRb4eJMc7zy8r48WaNe0= X-MC-Unique: 8rW9GmptMQqtMUZtoWVISQ-1 X-Mimecast-MFC-AGG-ID: 8rW9GmptMQqtMUZtoWVISQ_1760022990 To: devel@lists.libvirt.org Subject: [RFC PATCH 09/16] qemu: monitor: Extract block limit values Date: Thu, 9 Oct 2025 17:16:09 +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: fd0_qNCzC9qwhGiT2a1p0qmjtYvRHU4NCX38tAw81_U_1760022990 X-Mimecast-Originator: redhat.com Content-Transfer-Encoding: quoted-printable Message-ID-Hash: GRBY25SM22V7JKIDDZSISCWB4XMVR7ZT X-Message-ID-Hash: GRBY25SM22V7JKIDDZSISCWB4XMVR7ZT 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: 1760023908692116600 Content-Type: text/plain; charset="utf-8" From: Peter Krempa The 'limits' field reports various maximum request sizes and alignments for a qemu blockdev protocol node. Signed-off-by: Peter Krempa --- src/qemu/qemu_monitor.c | 2 ++ src/qemu/qemu_monitor.h | 19 +++++++++++++++++++ src/qemu/qemu_monitor_json.c | 31 +++++++++++++++++++++++++++++++ 3 files changed, 52 insertions(+) diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c index f9b320f765..554898b93f 100644 --- a/src/qemu/qemu_monitor.c +++ b/src/qemu/qemu_monitor.c @@ -1983,6 +1983,8 @@ qemuBlockStatsFinalize(GObject *object) if (!stats) return; + g_free(stats->limits); + G_OBJECT_CLASS(qemu_block_stats_parent_class)->finalize(object); } diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h index 0555bcbf8e..9b9292e48d 100644 --- a/src/qemu/qemu_monitor.h +++ b/src/qemu/qemu_monitor.h @@ -789,6 +789,23 @@ qemuMonitorBlockIOStatusToError(const char *status); GHashTable * qemuMonitorGetBlockInfo(qemuMonitor *mon); + +struct qemuBlockStatsLimits { + unsigned long long request_alignment; + unsigned long long discard_max; + unsigned long long discard_alignment; + unsigned long long write_zeroes_max; + unsigned long long write_zeroes_alignment; + unsigned long long transfer_optimal; + unsigned long long transfer_max; + unsigned long long transfer_hw_max; + unsigned long long iov_max; + unsigned long long iov_hw_max; + unsigned long long memory_alignment_minimal; + unsigned long long memory_alignment_optimal; +}; + + struct _qemuBlockStats { GObject parent; @@ -810,6 +827,8 @@ struct _qemuBlockStats { /* write_threshold is valid only if it's non-zero, conforming to qemu = semantics */ unsigned long long write_threshold; + + struct qemuBlockStatsLimits *limits; }; G_DECLARE_FINAL_TYPE(qemuBlockStats, qemu_block_stats, QEMU, BLOCK_STATS, = GObject); diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c index e00bc0cf1b..cf63f43318 100644 --- a/src/qemu/qemu_monitor_json.c +++ b/src/qemu/qemu_monitor_json.c @@ -2524,6 +2524,33 @@ qemuMonitorJSONQueryBlockstats(qemuMonitor *mon, } +static struct qemuBlockStatsLimits * +qemuMonitorJSONBlockStatsCollectLimits(virJSONValue *limits_json) +{ + struct qemuBlockStatsLimits *limits =3D g_new0(struct qemuBlockStatsLi= mits, 1); + + virJSONValueObjectGetNumberUlong(limits_json, "request-alignment", &li= mits->request_alignment); + + virJSONValueObjectGetNumberUlong(limits_json, "max-discard", &limits->= discard_max); + virJSONValueObjectGetNumberUlong(limits_json, "discard-alignment", &li= mits->discard_alignment); + + virJSONValueObjectGetNumberUlong(limits_json, "max-write-zeroes", &lim= its->write_zeroes_max); + virJSONValueObjectGetNumberUlong(limits_json, "write-zeroes-alignment"= , &limits->write_zeroes_alignment); + + virJSONValueObjectGetNumberUlong(limits_json, "opt-transfer", &limits-= >transfer_optimal); + virJSONValueObjectGetNumberUlong(limits_json, "max-transfer", &limits-= >transfer_max); + virJSONValueObjectGetNumberUlong(limits_json, "max-hw-transfer", &limi= ts->transfer_hw_max); + + virJSONValueObjectGetNumberUlong(limits_json, "max-iov", &limits->iov_= max); + virJSONValueObjectGetNumberUlong(limits_json, "max-hw-iov", &limits->i= ov_hw_max); + + virJSONValueObjectGetNumberUlong(limits_json, "min-mem-alignment", &li= mits->memory_alignment_minimal); + virJSONValueObjectGetNumberUlong(limits_json, "opt-mem-alignment", &li= mits->memory_alignment_optimal); + + return limits; +} + + static int qemuMonitorJSONGetOneBlockStatsNamedNodes(size_t pos G_GNUC_UNUSED, virJSONValue *val, @@ -2531,6 +2558,7 @@ qemuMonitorJSONGetOneBlockStatsNamedNodes(size_t pos = G_GNUC_UNUSED, { GHashTable *stats =3D opaque; virJSONValue *image; + virJSONValue *limits; const char *nodename; qemuBlockStats *entry; @@ -2556,6 +2584,9 @@ qemuMonitorJSONGetOneBlockStatsNamedNodes(size_t pos = G_GNUC_UNUSED, ignore_value(virJSONValueObjectGetNumberUlong(val, "write_threshold", &entry->write_threshold)= ); + if ((limits =3D virJSONValueObjectGetObject(image, "limits"))) + entry->limits =3D qemuMonitorJSONBlockStatsCollectLimits(limits); + return 1; /* we don't want to steal the value from the JSON array */ } --=20 2.51.0