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