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

Reply via email to