[RFC PATCH 09/16] qemu: monitor: Extract block limit values

Peter Krempa via Devel posted 16 patches 2 weeks, 4 days ago
[RFC PATCH 09/16] qemu: monitor: Extract block limit values
Posted by Peter Krempa via Devel 2 weeks, 4 days ago
From: Peter Krempa <pkrempa@redhat.com>

The 'limits' field reports various maximum request sizes and
alignments for a qemu blockdev protocol node.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
---
 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 = 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 */
 }

-- 
2.51.0