[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-block] [PULL 11/21] block/qapi: reduce the execution time of qmp_q
From: |
Max Reitz |
Subject: |
[Qemu-block] [PULL 11/21] block/qapi: reduce the execution time of qmp_query_blockstats |
Date: |
Sun, 12 Feb 2017 02:38:34 +0100 |
From: Dou Liyang <address@hidden>
In order to reduce the execution time, this patch optimize
the qmp_query_blockstats():
Remove the next_query_bds function.
Remove the bdrv_query_stats function.
Remove some judgement sentence.
The original qmp_query_blockstats calls next_query_bds to get
the next objects in each loops. In the next_query_bds, it checks
the query_nodes and blk. It also call bdrv_query_stats to get
the stats, In the bdrv_query_stats, it checks blk and bs each
times. This waste more times, which may stall the main loop a
bit. And if the disk is too many and donot use the dataplane
feature, this may affect the performance in main loop thread.
This patch removes that two functions, and makes the structure
clearly.
Signed-off-by: Dou Liyang <address@hidden>
Message-id: address@hidden
Reviewed-by: Markus Armbruster <address@hidden>
[mreitz: Removed duplicate info->value assignment]
Signed-off-by: Max Reitz <address@hidden>
---
block/qapi.c | 73 ++++++++++++++++++++++++------------------------------------
1 file changed, 29 insertions(+), 44 deletions(-)
diff --git a/block/qapi.c b/block/qapi.c
index 48105ed277..ac480aa93c 100644
--- a/block/qapi.c
+++ b/block/qapi.c
@@ -456,23 +456,6 @@ static BlockStats *bdrv_query_bds_stats(const
BlockDriverState *bs,
return s;
}
-static BlockStats *bdrv_query_stats(BlockBackend *blk,
- const BlockDriverState *bs,
- bool query_backing)
-{
- BlockStats *s;
-
- s = bdrv_query_bds_stats(bs, query_backing);
-
- if (blk) {
- s->has_device = true;
- s->device = g_strdup(blk_name(blk));
- bdrv_query_blk_stats(s->stats, blk);
- }
-
- return s;
-}
-
BlockInfoList *qmp_query_block(Error **errp)
{
BlockInfoList *head = NULL, **p_next = &head;
@@ -496,42 +479,44 @@ BlockInfoList *qmp_query_block(Error **errp)
return head;
}
-static bool next_query_bds(BlockBackend **blk, BlockDriverState **bs,
- bool query_nodes)
-{
- if (query_nodes) {
- *bs = bdrv_next_node(*bs);
- return !!*bs;
- }
-
- *blk = blk_next(*blk);
- *bs = *blk ? blk_bs(*blk) : NULL;
-
- return !!*blk;
-}
-
BlockStatsList *qmp_query_blockstats(bool has_query_nodes,
bool query_nodes,
Error **errp)
{
BlockStatsList *head = NULL, **p_next = &head;
- BlockBackend *blk = NULL;
- BlockDriverState *bs = NULL;
+ BlockBackend *blk;
+ BlockDriverState *bs;
/* Just to be safe if query_nodes is not always initialized */
- query_nodes = has_query_nodes && query_nodes;
-
- while (next_query_bds(&blk, &bs, query_nodes)) {
- BlockStatsList *info = g_malloc0(sizeof(*info));
- AioContext *ctx = blk ? blk_get_aio_context(blk)
- : bdrv_get_aio_context(bs);
+ if (has_query_nodes && query_nodes) {
+ for (bs = bdrv_next_node(NULL); bs; bs = bdrv_next_node(bs)) {
+ BlockStatsList *info = g_malloc0(sizeof(*info));
+ AioContext *ctx = bdrv_get_aio_context(bs);
- aio_context_acquire(ctx);
- info->value = bdrv_query_stats(blk, bs, !query_nodes);
- aio_context_release(ctx);
+ aio_context_acquire(ctx);
+ info->value = bdrv_query_bds_stats(bs, false);
+ aio_context_release(ctx);
- *p_next = info;
- p_next = &info->next;
+ *p_next = info;
+ p_next = &info->next;
+ }
+ } else {
+ for (blk = blk_next(NULL); blk; blk = blk_next(blk)) {
+ BlockStatsList *info = g_malloc0(sizeof(*info));
+ AioContext *ctx = blk_get_aio_context(blk);
+ BlockStats *s;
+
+ aio_context_acquire(ctx);
+ s = bdrv_query_bds_stats(blk_bs(blk), true);
+ s->has_device = true;
+ s->device = g_strdup(blk_name(blk));
+ bdrv_query_blk_stats(s->stats, blk);
+ aio_context_release(ctx);
+
+ info->value = s;
+ *p_next = info;
+ p_next = &info->next;
+ }
}
return head;
--
2.11.0
- [Qemu-block] [PULL 00/21] Block patches, Max Reitz, 2017/02/11
- [Qemu-block] [PULL 01/21] iotests: Fix a problem in common.filter, Max Reitz, 2017/02/11
- [Qemu-block] [PULL 02/21] qemu-img: Improve commit invalid base message, Max Reitz, 2017/02/11
- [Qemu-block] [PULL 03/21] qapi: Tweak error message of bdrv_query_image_info, Max Reitz, 2017/02/11
- [Qemu-block] [PULL 04/21] iotests: Fix reference output for 059, Max Reitz, 2017/02/11
- [Qemu-block] [PULL 05/21] iotests: record separate timings per format, protocol pair, Max Reitz, 2017/02/11
- [Qemu-block] [PULL 06/21] block/vmdk: Fix the endian problem of buf_len and lba, Max Reitz, 2017/02/11
- [Qemu-block] [PULL 07/21] block: check full backing filename when searching protocol filenames, Max Reitz, 2017/02/11
- [Qemu-block] [PULL 08/21] qemu-iotests: Don't create fifos / pidfiles with protocol paths, Max Reitz, 2017/02/11
- [Qemu-block] [PULL 09/21] qemu-iotest: test to lookup protocol-based image with relative backing, Max Reitz, 2017/02/11
- [Qemu-block] [PULL 11/21] block/qapi: reduce the execution time of qmp_query_blockstats,
Max Reitz <=
- [Qemu-block] [PULL 10/21] block/qapi: reduce the coupling between the bdrv_query_stats and bdrv_query_bds_stats, Max Reitz, 2017/02/11
- [Qemu-block] [PULL 12/21] block: bdrv_invalidate_cache: invalidate children first, Max Reitz, 2017/02/11
- [Qemu-block] [PULL 13/21] block/nfs: fix NULL pointer dereference in URI parsing, Max Reitz, 2017/02/11
- [Qemu-block] [PULL 14/21] block/nfs: fix naming of runtime opts, Max Reitz, 2017/02/11
- [Qemu-block] [PULL 16/21] qemu-iotests: Add _unsupported_fmt helper, Max Reitz, 2017/02/11
- [Qemu-block] [PULL 15/21] qemu-io: Return non-zero exit code on failure, Max Reitz, 2017/02/11
- [Qemu-block] [PULL 17/21] qemu-io: Add failure regression tests, Max Reitz, 2017/02/11
- [Qemu-block] [PULL 18/21] qcow2: Optimize the refcount-block overlap check, Max Reitz, 2017/02/11
- [Qemu-block] [PULL 19/21] qemu-io: don't allow I/O operations larger than BDRV_REQUEST_MAX_BYTES, Max Reitz, 2017/02/11
- [Qemu-block] [PULL 20/21] qemu-img: Use qemu_strtoul() rather than raw strtoul(), Max Reitz, 2017/02/11