From patchwork Mon Jul 25 14:02:55 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Avi Kivity X-Patchwork-Id: 1004522 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by demeter1.kernel.org (8.14.4/8.14.4) with ESMTP id p6PE3hod008697 for ; Mon, 25 Jul 2011 14:03:43 GMT Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752326Ab1GYODh (ORCPT ); Mon, 25 Jul 2011 10:03:37 -0400 Received: from mx1.redhat.com ([209.132.183.28]:19688 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752130Ab1GYODK (ORCPT ); Mon, 25 Jul 2011 10:03:10 -0400 Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id p6PE39ol008849 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Mon, 25 Jul 2011 10:03:09 -0400 Received: from cleopatra.tlv.redhat.com (cleopatra.tlv.redhat.com [10.35.255.11]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id p6PE387Q019015; Mon, 25 Jul 2011 10:03:09 -0400 Received: from s01.tlv.redhat.com (s01.tlv.redhat.com [10.35.255.8]) by cleopatra.tlv.redhat.com (Postfix) with ESMTP id F0C4D250B44; Mon, 25 Jul 2011 17:03:06 +0300 (IDT) From: Avi Kivity To: qemu-devel@nongnu.org Cc: kvm@vger.kernel.org Subject: [PATCH 14/23] memory: transaction API Date: Mon, 25 Jul 2011 17:02:55 +0300 Message-Id: <1311602584-23409-15-git-send-email-avi@redhat.com> In-Reply-To: <1311602584-23409-1-git-send-email-avi@redhat.com> References: <1311602584-23409-1-git-send-email-avi@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 Sender: kvm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: kvm@vger.kernel.org X-Greylist: IP, sender and recipient auto-whitelisted, not delayed by milter-greylist-4.2.6 (demeter1.kernel.org [140.211.167.41]); Mon, 25 Jul 2011 14:03:43 +0000 (UTC) Allow changes to the memory hierarchy to be accumulated and made visible all at once. This reduces computational effort, especially when an accelerator (e.g. kvm) is involved. Useful when a single register update causes multiple changes to an address space. Signed-off-by: Avi Kivity --- memory.c | 20 ++++++++++++++++++++ memory.h | 8 ++++++++ 2 files changed, 28 insertions(+), 0 deletions(-) diff --git a/memory.c b/memory.c index 009ad33..370e189 100644 --- a/memory.c +++ b/memory.c @@ -18,6 +18,8 @@ #include "kvm.h" #include +unsigned memory_region_transaction_depth = 0; + typedef struct AddrRange AddrRange; struct AddrRange { @@ -623,6 +625,10 @@ static void address_space_update_topology(AddressSpace *as) static void memory_region_update_topology(void) { + if (memory_region_transaction_depth) { + return; + } + if (address_space_memory.root) { address_space_update_topology(&address_space_memory); } @@ -631,6 +637,20 @@ static void memory_region_update_topology(void) } } +void memory_region_transaction_begin(void) +{ + ++memory_region_transaction_depth; +} + +void memory_region_transaction_commit(void) +{ + if (!memory_region_transaction_depth) { + abort(); + } + --memory_region_transaction_depth; + memory_region_update_topology(); +} + void memory_region_init(MemoryRegion *mr, const char *name, uint64_t size) diff --git a/memory.h b/memory.h index e4c0ad1..cb3a9b6 100644 --- a/memory.h +++ b/memory.h @@ -246,6 +246,14 @@ void memory_region_add_subregion_overlap(MemoryRegion *mr, void memory_region_del_subregion(MemoryRegion *mr, MemoryRegion *subregion); +/* Start a transaction; changes will be accumulated and made visible only + * when the transaction ends. + */ +void memory_region_transaction_begin(void); +/* Commit a transaction and make changes visible to the guest. + */ +void memory_region_transaction_commit(void); + #endif #endif