]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemu: monitor: Extract block limit values
authorPeter Krempa <pkrempa@redhat.com>
Wed, 1 Oct 2025 08:42:09 +0000 (10:42 +0200)
committerPeter Krempa <pkrempa@redhat.com>
Wed, 5 Nov 2025 13:27:57 +0000 (14:27 +0100)
The 'limits' field reports various maximum request sizes and
alignments for a qemu blockdev protocol node.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
src/qemu/qemu_monitor.c
src/qemu/qemu_monitor.h
src/qemu/qemu_monitor_json.c

index 3dbaaf9c595ac3553c97da2d34d6baf60a818cb1..8fd949d351b1637bdd985f55b8ae5697b1b498be 100644 (file)
@@ -1983,6 +1983,8 @@ qemuBlockStatsFinalize(GObject *object)
     if (!stats)
         return;
 
+    g_free(stats->limits);
+
     G_OBJECT_CLASS(qemu_block_stats_parent_class)->finalize(object);
 }
 
index d950d548b45228b3b0f00994607695e8f61e1fde..0466f2f0fe2bab3004da4d4fe89e123137063027 100644 (file)
@@ -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);
 
index 9b9a005771834b83d942eb0d6e0dc95e6b671a5c..7ea9fe68f0be3324252b0880bf351c9351905ff0 100644 (file)
@@ -2524,6 +2524,33 @@ qemuMonitorJSONQueryBlockstats(qemuMonitor *mon,
 }
 
 
+static struct qemuBlockStatsLimits *
+qemuMonitorJSONBlockStatsCollectLimits(virJSONValue *limits_json)
+{
+    struct qemuBlockStatsLimits *limits = g_new0(struct qemuBlockStatsLimits, 1);
+
+    virJSONValueObjectGetNumberUlong(limits_json, "request-alignment", &limits->request_alignment);
+
+    virJSONValueObjectGetNumberUlong(limits_json, "max-discard", &limits->discard_max);
+    virJSONValueObjectGetNumberUlong(limits_json, "discard-alignment", &limits->discard_alignment);
+
+    virJSONValueObjectGetNumberUlong(limits_json, "max-write-zeroes", &limits->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", &limits->transfer_hw_max);
+
+    virJSONValueObjectGetNumberUlong(limits_json, "max-iov", &limits->iov_max);
+    virJSONValueObjectGetNumberUlong(limits_json, "max-hw-iov", &limits->iov_hw_max);
+
+    virJSONValueObjectGetNumberUlong(limits_json, "min-mem-alignment", &limits->memory_alignment_minimal);
+    virJSONValueObjectGetNumberUlong(limits_json, "opt-mem-alignment", &limits->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 = 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 = virJSONValueObjectGetObject(image, "limits")))
+        entry->limits = qemuMonitorJSONBlockStatsCollectLimits(limits);
+
     return 1; /* we don't want to steal the value from the JSON array */
 }