From mboxrd@z Thu Jan 1 00:00:00 1970 From: Ferry Huberts Subject: Re: [PATCH] memory: transaction API Date: Thu, 21 Jul 2011 13:04:01 +0200 Message-ID: <4E2807A1.6000001@hupie.com> References: <1311243679-18403-1-git-send-email-avi@redhat.com> Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Cc: Jan Kiszka , qemu-devel@nongnu.org, kvm@vger.kernel.org To: Avi Kivity Return-path: Received: from 82-197-206-98.dsl.cambrium.nl ([82.197.206.98]:62801 "EHLO mail.hupie.dyndns.org" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1752228Ab1GULXw (ORCPT ); Thu, 21 Jul 2011 07:23:52 -0400 In-Reply-To: <1311243679-18403-1-git-send-email-avi@redhat.com> Sender: kvm-owner@vger.kernel.org List-ID: On 07/21/2011 12:21 PM, Avi Kivity wrote: > 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 0ffc905..8780533 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 { > @@ -648,6 +650,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); > } > @@ -656,6 +662,20 @@ static void memory_region_update_topology(void) > } > } > > +void memory_region_transaction_begin(void) > +{ > + ++memory_region_transaction_depth; > +} > + wouldn't you rather keep it safe by doing either here if (!memory_region_transaction_depth) memory_region_transaction_depth++; > +void memory_region_transaction_commit(void) > +{ > + if (!memory_region_transaction_depth) { > + abort(); > + } > + --memory_region_transaction_depth; > + memory_region_update_topology(); > +} > + or by doing here while (!memory_region_transaction_depth) memory_region_transaction_depth--; with your setup nesting transactions will not work correctly I think. You seem to have designed it to not do nesting, so it's safer to make that explicit in your code imho therefore I'd go for the change in _begin also, wouldn't you rather rename memory_region_transaction_depth to memory_region_transaction_pending? > 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 -- Ferry Huberts