On 2013-06-28 20:26, Paolo Bonzini wrote: > This same treatment previously done to phys_node_map and phys_sections > is now applied to the dispatch field of AddressSpace. Topology updates > use as->next_dispatch while accesses use as->dispatch. > > Signed-off-by: Paolo Bonzini <pbonz...@redhat.com> > --- > exec.c | 23 ++++++++++++++++------- > include/exec/memory.h | 1 + > 2 files changed, 17 insertions(+), 7 deletions(-) > > diff --git a/exec.c b/exec.c > index dffdf23..0d852ee 100644 > --- a/exec.c > +++ b/exec.c > @@ -855,7 +855,7 @@ static void register_multipage(AddressSpaceDispatch *d, > static void mem_add(MemoryListener *listener, MemoryRegionSection *section) > { > AddressSpace *as = container_of(listener, AddressSpace, > dispatch_listener); > - AddressSpaceDispatch *d = as->dispatch; > + AddressSpaceDispatch *d = as->next_dispatch; > MemoryRegionSection now = *section, remain = *section; > Int128 page_size = int128_make64(TARGET_PAGE_SIZE); > > @@ -1718,9 +1718,21 @@ static void io_mem_init(void) > static void mem_begin(MemoryListener *listener) > { > AddressSpace *as = container_of(listener, AddressSpace, > dispatch_listener); > + AddressSpaceDispatch *d = g_new(AddressSpaceDispatch, 1); > + > + d->phys_map = (PhysPageEntry) { .ptr = PHYS_MAP_NODE_NIL, .is_leaf = 0 > }; > + d->as = as; > + as->next_dispatch = d; > +} > + > +static void mem_commit(MemoryListener *listener) > +{ > + AddressSpace *as = container_of(listener, AddressSpace, > dispatch_listener); > AddressSpaceDispatch *d = as->dispatch; > > - d->phys_map.ptr = PHYS_MAP_NODE_NIL; > + /* cur_map will soon be switched to next_map, too. */ > + as->dispatch = as->next_dispatch; > + g_free(d); > } > > static void core_begin(MemoryListener *listener) > @@ -1784,13 +1796,10 @@ static MemoryListener tcg_memory_listener = { > > void address_space_init_dispatch(AddressSpace *as) > { > - AddressSpaceDispatch *d = g_new(AddressSpaceDispatch, 1); > - > - d->phys_map = (PhysPageEntry) { .ptr = PHYS_MAP_NODE_NIL, .is_leaf = 0 > }; > - d->as = as; > - as->dispatch = d; > + as->dispatch = NULL; > as->dispatch_listener = (MemoryListener) { > .begin = mem_begin, > + .commit = mem_commit, > .region_add = mem_add, > .region_nop = mem_add, > .priority = 0, > diff --git a/include/exec/memory.h b/include/exec/memory.h > index 1cd1f50..b21a460 100644 > --- a/include/exec/memory.h > +++ b/include/exec/memory.h > @@ -212,6 +212,7 @@ struct AddressSpace { > int ioeventfd_nb; > struct MemoryRegionIoeventfd *ioeventfds; > struct AddressSpaceDispatch *dispatch; > + struct AddressSpaceDispatch *next_dispatch; > MemoryListener dispatch_listener; > > QTAILQ_ENTRY(AddressSpace) address_spaces_link; >
Reviewed-by: Jan Kiszka <jan.kis...@siemens.com> Jan -- Siemens AG, Corporate Technology, CT RTC ITP SES-DE Corporate Competence Center Embedded Linux