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