From patchwork Mon Dec 19 08:51:26 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dou Liyang X-Patchwork-Id: 707010 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3thvsS29RHz9t0q for ; Mon, 19 Dec 2016 19:56:12 +1100 (AEDT) Received: from localhost ([::1]:44078 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cItju-0006ct-9i for incoming@patchwork.ozlabs.org; Mon, 19 Dec 2016 03:56:10 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:58424) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cItgD-0004B9-R0 for qemu-devel@nongnu.org; Mon, 19 Dec 2016 03:52:25 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cItgC-000829-Io for qemu-devel@nongnu.org; Mon, 19 Dec 2016 03:52:21 -0500 Received: from [59.151.112.132] (port=14691 helo=heian.cn.fujitsu.com) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cItgC-0007zG-3w for qemu-devel@nongnu.org; Mon, 19 Dec 2016 03:52:20 -0500 X-IronPort-AV: E=Sophos;i="5.22,518,1449504000"; d="scan'208";a="14050865" Received: from unknown (HELO cn.fujitsu.com) ([10.167.33.5]) by heian.cn.fujitsu.com with ESMTP; 19 Dec 2016 16:52:03 +0800 Received: from G08CNEXCHPEKD02.g08.fujitsu.local (unknown [10.167.33.83]) by cn.fujitsu.com (Postfix) with ESMTP id 2D423477B1D0; Mon, 19 Dec 2016 16:52:03 +0800 (CST) Received: from localhost.localdomain.localdomain (10.167.226.106) by G08CNEXCHPEKD02.g08.fujitsu.local (10.167.33.89) with Microsoft SMTP Server (TLS) id 14.3.319.2; Mon, 19 Dec 2016 16:52:07 +0800 From: Dou Liyang To: , , , , , , Date: Mon, 19 Dec 2016 16:51:26 +0800 Message-ID: <1482137486-9843-5-git-send-email-douly.fnst@cn.fujitsu.com> X-Mailer: git-send-email 2.5.5 In-Reply-To: <1482137486-9843-1-git-send-email-douly.fnst@cn.fujitsu.com> References: <1482137486-9843-1-git-send-email-douly.fnst@cn.fujitsu.com> MIME-Version: 1.0 X-Originating-IP: [10.167.226.106] X-yoursite-MailScanner-ID: 2D423477B1D0.AFBF5 X-yoursite-MailScanner: Found to be clean X-yoursite-MailScanner-From: douly.fnst@cn.fujitsu.com X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 59.151.112.132 Subject: [Qemu-devel] [PATCH RFC v2 4/4] block/qapi: optimize the query function of the blockstats X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: izumi.taku@jp.fujitsu.com, caoj.fnst@cn.fujitsu.com, fanc.fnst@cn.fujitsu.com, qemu-devel@nongnu.org, douly.fnst@cn.fujitsu.com Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" this patch works to optimize the qmp_query_blockstats() by removing additional performance overhead from the next_query_bds and bdrv_query_stats. It removes that two functions, and also makes the structure of the code clearly. Signed-off-by: Dou Liyang --- block/qapi.c | 69 +++++++++++++++++++++++------------------------------------- 1 file changed, 26 insertions(+), 43 deletions(-) diff --git a/block/qapi.c b/block/qapi.c index 2262918..d561945 100644 --- a/block/qapi.c +++ b/block/qapi.c @@ -456,27 +456,6 @@ static BlockStats *bdrv_query_bds_stats(const BlockDriverState *bs, return s; } -static BlockStats *bdrv_query_stats(BlockBackend *blk, - BlockDriverState *bs, - bool query_backing) -{ - BlockStats *s; - - bdrv_ref(bs); - s = bdrv_query_bds_stats(bs, query_backing); - bdrv_unref(bs); - - if (blk) { - blk_ref(blk); - s->has_device = true; - s->device = g_strdup(blk_name(blk)); - bdrv_query_blk_stats(s->stats, blk); - blk_unref(blk); - } - - return s; -} - BlockInfoList *qmp_query_block(Error **errp) { BlockInfoList *head = NULL, **p_next = &head; @@ -500,37 +479,41 @@ 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; + if (has_query_nodes && query_nodes) { + for (bs = bdrv_next_node(NULL); bs; bs = bdrv_next_node(bs)) { + BlockStatsList *info = g_malloc0(sizeof(*info)); - while (next_query_bds(&blk, &bs, query_nodes)) { - BlockStatsList *info = g_malloc0(sizeof(*info)); + bdrv_ref(bs); + info->value = bdrv_query_bds_stats(bs, false); + bdrv_unref(bs); - info->value = bdrv_query_stats(blk, bs, !query_nodes); - *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)); + + blk_ref(blk); + BlockStats *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); + blk_unref(blk); + + info->value = s; + *p_next = info; + p_next = &info->next; + } } return head;