[Qemu-devel] [PATCH 17/20] block: Convert bdrv_info_stats() to QObject
Each device statistic information is stored in a QDict and the returned QObject is a QList of all devices. This commit should not change user output. Signed-off-by: Luiz Capitulino lcapitul...@redhat.com --- block.c | 82 block.h |3 +- monitor.c |3 +- 3 files changed, 75 insertions(+), 13 deletions(-) diff --git a/block.c b/block.c index d7eccb7..3f3496e 100644 --- a/block.c +++ b/block.c @@ -1261,22 +1261,82 @@ void bdrv_info(Monitor *mon, QObject **ret_data) *ret_data = QOBJECT(bs_list); } -/* The info blockstats command. */ -void bdrv_info_stats(Monitor *mon) +static void bdrv_stats_iter(QObject *data, void *opaque) { +QDict *qdict; +Monitor *mon = opaque; + +qdict = qobject_to_qdict(data); +monitor_printf(mon, %s:, qdict_get_str(qdict, device)); + +qdict = qobject_to_qdict(qdict_get(qdict, stats)); +monitor_printf(mon, rd_bytes=% PRId64 + wr_bytes=% PRId64 + rd_operations=% PRId64 + wr_operations=% PRId64 +\n, +qdict_get_int(qdict, rd_bytes), +qdict_get_int(qdict, wr_bytes), +qdict_get_int(qdict, rd_operations), +qdict_get_int(qdict, wr_operations)); +} + +void bdrv_stats_print(Monitor *mon, const QObject *data) +{ +qlist_iter(qobject_to_qlist(data), bdrv_stats_iter, mon); +} + +/** + * bdrv_info_stats(): show block device statistics + * + * Each device statistic information is stored in a QDict and + * the returned QObject is a QList of all devices. + * + * The QDict contains the following: + * + * - device: device name + * - stats: A QDict with the statistics information, it contains: + * - rd_bytes: bytes read + * - wr_bytes: bytes written + * - rd_operations: read operations + * - wr_operations: write operations + * + * Example: + * + * [ { device: ide0-hd0, + * stats: { rd_bytes: 512, + * wr_bytes: 0, + * rd_operations: 1, + * wr_operations: 0 } }, + * { device: ide1-cd0, + * stats: { rd_bytes: 0, + * wr_bytes: 0, + * rd_operations: 0, + * wr_operations: 0 } } ] + */ +void bdrv_info_stats(Monitor *mon, QObject **ret_data) +{ +QObject *obj; +QList *devices; BlockDriverState *bs; +devices = qlist_new(); + for (bs = bdrv_first; bs != NULL; bs = bs-next) { -monitor_printf(mon, %s: -rd_bytes=% PRIu64 -wr_bytes=% PRIu64 -rd_operations=% PRIu64 -wr_operations=% PRIu64 - \n, - bs-device_name, - bs-rd_bytes, bs-wr_bytes, - bs-rd_ops, bs-wr_ops); -} +obj = qobject_from_jsonf({ 'device': %s, 'stats': { + 'rd_bytes': % PRId64 , + 'wr_bytes': % PRId64 , + 'rd_operations': % PRId64 , + 'wr_operations': % PRId64 + } }, + bs-device_name, + bs-rd_bytes, bs-wr_bytes, + bs-rd_ops, bs-wr_ops); +assert(obj != NULL); +qlist_append_obj(devices, obj); +} + +*ret_data = QOBJECT(devices); } const char *bdrv_get_encrypted_filename(BlockDriverState *bs) diff --git a/block.h b/block.h index 3282dd2..fa51ddf 100644 --- a/block.h +++ b/block.h @@ -48,7 +48,8 @@ typedef struct QEMUSnapshotInfo { void bdrv_info_print(Monitor *mon, const QObject *data); void bdrv_info(Monitor *mon, QObject **ret_data); -void bdrv_info_stats(Monitor *mon); +void bdrv_stats_print(Monitor *mon, const QObject *data); +void bdrv_info_stats(Monitor *mon, QObject **ret_data); void bdrv_init(void); void bdrv_init_with_whitelist(void); diff --git a/monitor.c b/monitor.c index d3acff4..5c092d0 100644 --- a/monitor.c +++ b/monitor.c @@ -2371,7 +2371,8 @@ static const mon_cmd_t info_cmds[] = { .args_type = , .params = , .help = show block device statistics, -.mhandler.info = bdrv_info_stats, +.user_print = bdrv_stats_print, +.mhandler.info_new = bdrv_info_stats, }, { .name = registers, -- 1.6.6.rc1.39.g9a42
[Qemu-devel] [PATCH 17/20] block: Convert bdrv_info_stats() to QObject
Each device statistic information is stored in a QDict and the returned QObject is a QList of all devices. This commit should not change user output. Signed-off-by: Luiz Capitulino lcapitul...@redhat.com --- block.c | 82 block.h |3 +- monitor.c |3 +- 3 files changed, 75 insertions(+), 13 deletions(-) diff --git a/block.c b/block.c index d7eccb7..3f3496e 100644 --- a/block.c +++ b/block.c @@ -1261,22 +1261,82 @@ void bdrv_info(Monitor *mon, QObject **ret_data) *ret_data = QOBJECT(bs_list); } -/* The info blockstats command. */ -void bdrv_info_stats(Monitor *mon) +static void bdrv_stats_iter(QObject *data, void *opaque) { +QDict *qdict; +Monitor *mon = opaque; + +qdict = qobject_to_qdict(data); +monitor_printf(mon, %s:, qdict_get_str(qdict, device)); + +qdict = qobject_to_qdict(qdict_get(qdict, stats)); +monitor_printf(mon, rd_bytes=% PRId64 + wr_bytes=% PRId64 + rd_operations=% PRId64 + wr_operations=% PRId64 +\n, +qdict_get_int(qdict, rd_bytes), +qdict_get_int(qdict, wr_bytes), +qdict_get_int(qdict, rd_operations), +qdict_get_int(qdict, wr_operations)); +} + +void bdrv_stats_print(Monitor *mon, const QObject *data) +{ +qlist_iter(qobject_to_qlist(data), bdrv_stats_iter, mon); +} + +/** + * bdrv_info_stats(): show block device statistics + * + * Each device statistic information is stored in a QDict and + * the returned QObject is a QList of all devices. + * + * The QDict contains the following: + * + * - device: device name + * - stats: A QDict with the statistics information, it contains: + * - rd_bytes: bytes read + * - wr_bytes: bytes written + * - rd_operations: read operations + * - wr_operations: write operations + * + * Example: + * + * [ { device: ide0-hd0, + * stats: { rd_bytes: 512, + * wr_bytes: 0, + * rd_operations: 1, + * wr_operations: 0 } }, + * { device: ide1-cd0, + * stats: { rd_bytes: 0, + * wr_bytes: 0, + * rd_operations: 0, + * wr_operations: 0 } } ] + */ +void bdrv_info_stats(Monitor *mon, QObject **ret_data) +{ +QObject *obj; +QList *devices; BlockDriverState *bs; +devices = qlist_new(); + for (bs = bdrv_first; bs != NULL; bs = bs-next) { -monitor_printf(mon, %s: -rd_bytes=% PRIu64 -wr_bytes=% PRIu64 -rd_operations=% PRIu64 -wr_operations=% PRIu64 - \n, - bs-device_name, - bs-rd_bytes, bs-wr_bytes, - bs-rd_ops, bs-wr_ops); -} +obj = qobject_from_jsonf({ 'device': %s, 'stats': { + 'rd_bytes': % PRId64 , + 'wr_bytes': % PRId64 , + 'rd_operations': % PRId64 , + 'wr_operations': % PRId64 + } }, + bs-device_name, + bs-rd_bytes, bs-wr_bytes, + bs-rd_ops, bs-wr_ops); +assert(obj != NULL); +qlist_append_obj(devices, obj); +} + +*ret_data = QOBJECT(devices); } const char *bdrv_get_encrypted_filename(BlockDriverState *bs) diff --git a/block.h b/block.h index 3282dd2..fa51ddf 100644 --- a/block.h +++ b/block.h @@ -48,7 +48,8 @@ typedef struct QEMUSnapshotInfo { void bdrv_info_print(Monitor *mon, const QObject *data); void bdrv_info(Monitor *mon, QObject **ret_data); -void bdrv_info_stats(Monitor *mon); +void bdrv_stats_print(Monitor *mon, const QObject *data); +void bdrv_info_stats(Monitor *mon, QObject **ret_data); void bdrv_init(void); void bdrv_init_with_whitelist(void); diff --git a/monitor.c b/monitor.c index d3acff4..5c092d0 100644 --- a/monitor.c +++ b/monitor.c @@ -2371,7 +2371,8 @@ static const mon_cmd_t info_cmds[] = { .args_type = , .params = , .help = show block device statistics, -.mhandler.info = bdrv_info_stats, +.user_print = bdrv_stats_print, +.mhandler.info_new = bdrv_info_stats, }, { .name = registers, -- 1.6.6.rc1.39.g9a42