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 <avi@xxxxxxxxxx> > --- > 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 <assert.h> > > +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 -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html