diff mbox

[23/30] exec: move listener from AddressSpaceDispatch to AddressSpace

Message ID 1372444009-11544-24-git-send-email-pbonzini@redhat.com
State New
Headers show

Commit Message

Paolo Bonzini June 28, 2013, 6:26 p.m. UTC
This will help having two copies of AddressSpaceDispatch during the
recreation of the radix tree (one being built, and one that is complete
and accessed under RCU).  We do not want to have to unregister and
re-register the listener.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
 exec.c                | 17 +++++++++--------
 include/exec/memory.h |  2 ++
 2 files changed, 11 insertions(+), 8 deletions(-)

Comments

Jan Kiszka July 2, 2013, 2:41 p.m. UTC | #1
On 2013-06-28 20:26, Paolo Bonzini wrote:
> This will help having two copies of AddressSpaceDispatch during the
> recreation of the radix tree (one being built, and one that is complete
> and accessed under RCU).  We do not want to have to unregister and
> re-register the listener.
> 
> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
> ---
>  exec.c                | 17 +++++++++--------
>  include/exec/memory.h |  2 ++
>  2 files changed, 11 insertions(+), 8 deletions(-)
> 
> diff --git a/exec.c b/exec.c
> index f138e56..dffdf23 100644
> --- a/exec.c
> +++ b/exec.c
> @@ -99,7 +99,6 @@ struct AddressSpaceDispatch {
>       * The bottom level has pointers to MemoryRegionSections.
>       */
>      PhysPageEntry phys_map;
> -    MemoryListener listener;
>      AddressSpace *as;
>  };
>  
> @@ -855,7 +854,8 @@ static void register_multipage(AddressSpaceDispatch *d,
>  
>  static void mem_add(MemoryListener *listener, MemoryRegionSection *section)
>  {
> -    AddressSpaceDispatch *d = container_of(listener, AddressSpaceDispatch, listener);
> +    AddressSpace *as = container_of(listener, AddressSpace, dispatch_listener);
> +    AddressSpaceDispatch *d = as->dispatch;
>      MemoryRegionSection now = *section, remain = *section;
>      Int128 page_size = int128_make64(TARGET_PAGE_SIZE);
>  
> @@ -1717,7 +1717,8 @@ static void io_mem_init(void)
>  
>  static void mem_begin(MemoryListener *listener)
>  {
> -    AddressSpaceDispatch *d = container_of(listener, AddressSpaceDispatch, listener);
> +    AddressSpace *as = container_of(listener, AddressSpace, dispatch_listener);
> +    AddressSpaceDispatch *d = as->dispatch;
>  
>      d->phys_map.ptr = PHYS_MAP_NODE_NIL;
>  }
> @@ -1786,22 +1787,22 @@ 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->listener = (MemoryListener) {
> +    d->as = as;
> +    as->dispatch = d;
> +    as->dispatch_listener = (MemoryListener) {
>          .begin = mem_begin,
>          .region_add = mem_add,
>          .region_nop = mem_add,
>          .priority = 0,
>      };
> -    d->as = as;
> -    as->dispatch = d;
> -    memory_listener_register(&d->listener, as);
> +    memory_listener_register(&as->dispatch_listener, as);
>  }
>  
>  void address_space_destroy_dispatch(AddressSpace *as)
>  {
>      AddressSpaceDispatch *d = as->dispatch;

You could save this line, but only if you need to touch the patch for
some other reason.

>  
> -    memory_listener_unregister(&d->listener);
> +    memory_listener_unregister(&as->dispatch_listener);
>      g_free(d);
>      as->dispatch = NULL;
>  }
> diff --git a/include/exec/memory.h b/include/exec/memory.h
> index 913ac45..1cd1f50 100644
> --- a/include/exec/memory.h
> +++ b/include/exec/memory.h
> @@ -212,6 +212,8 @@ struct AddressSpace {
>      int ioeventfd_nb;
>      struct MemoryRegionIoeventfd *ioeventfds;
>      struct AddressSpaceDispatch *dispatch;
> +    MemoryListener dispatch_listener;
> +
>      QTAILQ_ENTRY(AddressSpace) address_spaces_link;
>  };
>  
> 

Reviewed-by: Jan Kiszka <jan.kiszka@siemens.com>

Jan
diff mbox

Patch

diff --git a/exec.c b/exec.c
index f138e56..dffdf23 100644
--- a/exec.c
+++ b/exec.c
@@ -99,7 +99,6 @@  struct AddressSpaceDispatch {
      * The bottom level has pointers to MemoryRegionSections.
      */
     PhysPageEntry phys_map;
-    MemoryListener listener;
     AddressSpace *as;
 };
 
@@ -855,7 +854,8 @@  static void register_multipage(AddressSpaceDispatch *d,
 
 static void mem_add(MemoryListener *listener, MemoryRegionSection *section)
 {
-    AddressSpaceDispatch *d = container_of(listener, AddressSpaceDispatch, listener);
+    AddressSpace *as = container_of(listener, AddressSpace, dispatch_listener);
+    AddressSpaceDispatch *d = as->dispatch;
     MemoryRegionSection now = *section, remain = *section;
     Int128 page_size = int128_make64(TARGET_PAGE_SIZE);
 
@@ -1717,7 +1717,8 @@  static void io_mem_init(void)
 
 static void mem_begin(MemoryListener *listener)
 {
-    AddressSpaceDispatch *d = container_of(listener, AddressSpaceDispatch, listener);
+    AddressSpace *as = container_of(listener, AddressSpace, dispatch_listener);
+    AddressSpaceDispatch *d = as->dispatch;
 
     d->phys_map.ptr = PHYS_MAP_NODE_NIL;
 }
@@ -1786,22 +1787,22 @@  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->listener = (MemoryListener) {
+    d->as = as;
+    as->dispatch = d;
+    as->dispatch_listener = (MemoryListener) {
         .begin = mem_begin,
         .region_add = mem_add,
         .region_nop = mem_add,
         .priority = 0,
     };
-    d->as = as;
-    as->dispatch = d;
-    memory_listener_register(&d->listener, as);
+    memory_listener_register(&as->dispatch_listener, as);
 }
 
 void address_space_destroy_dispatch(AddressSpace *as)
 {
     AddressSpaceDispatch *d = as->dispatch;
 
-    memory_listener_unregister(&d->listener);
+    memory_listener_unregister(&as->dispatch_listener);
     g_free(d);
     as->dispatch = NULL;
 }
diff --git a/include/exec/memory.h b/include/exec/memory.h
index 913ac45..1cd1f50 100644
--- a/include/exec/memory.h
+++ b/include/exec/memory.h
@@ -212,6 +212,8 @@  struct AddressSpace {
     int ioeventfd_nb;
     struct MemoryRegionIoeventfd *ioeventfds;
     struct AddressSpaceDispatch *dispatch;
+    MemoryListener dispatch_listener;
+
     QTAILQ_ENTRY(AddressSpace) address_spaces_link;
 };