From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([140.186.70.92]:39452) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RbD5Y-0008F3-1t for qemu-devel@nongnu.org; Thu, 15 Dec 2011 10:19:20 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1RbD5E-0003ma-CV for qemu-devel@nongnu.org; Thu, 15 Dec 2011 10:19:16 -0500 Received: from mx1.redhat.com ([209.132.183.28]:38903) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RbD5E-0003mA-2n for qemu-devel@nongnu.org; Thu, 15 Dec 2011 10:18:56 -0500 From: Avi Kivity Date: Thu, 15 Dec 2011 17:18:36 +0200 Message-Id: <1323962319-13762-5-git-send-email-avi@redhat.com> In-Reply-To: <1323962319-13762-1-git-send-email-avi@redhat.com> References: <1323962319-13762-1-git-send-email-avi@redhat.com> Subject: [Qemu-devel] [PATCH 4/7] memory: optimize empty transactions due to mutators List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Anthony Liguori Cc: qemu-devel@nongnu.org The mutating memory APIs can easily cause empty transactions, where the mutators don't actually change anything, or perhaps only modify disabled regions. Detect these conditions and avoid regenerating the memory topology. Signed-off-by: Avi Kivity --- memory.c | 8 +++++++- 1 files changed, 7 insertions(+), 1 deletions(-) diff --git a/memory.c b/memory.c index 7e842b3..87639ab 100644 --- a/memory.c +++ b/memory.c @@ -19,6 +19,7 @@ #include unsigned memory_region_transaction_depth = 0; +static bool memory_region_update_pending = false; typedef struct AddrRange AddrRange; @@ -757,6 +758,7 @@ static void address_space_update_topology(AddressSpace *as) static void memory_region_update_topology(MemoryRegion *mr) { if (memory_region_transaction_depth) { + memory_region_update_pending |= !mr || mr->enabled; return; } @@ -770,6 +772,8 @@ static void memory_region_update_topology(MemoryRegion *mr) if (address_space_io.root) { address_space_update_topology(&address_space_io); } + + memory_region_update_pending = false; } void memory_region_transaction_begin(void) @@ -781,7 +785,9 @@ void memory_region_transaction_commit(void) { assert(memory_region_transaction_depth); --memory_region_transaction_depth; - memory_region_update_topology(NULL); + if (!memory_region_transaction_depth && memory_region_update_pending) { + memory_region_update_topology(NULL); + } } static void memory_region_destructor_none(MemoryRegion *mr) -- 1.7.7.1