Patchwork [63/66] exec: separate current radix tree from the one being built

login
register
mail settings
Submitter Paolo Bonzini
Date July 4, 2013, 3:13 p.m.
Message ID <1372950842-32422-64-git-send-email-pbonzini@redhat.com>
Download mbox | patch
Permalink /patch/256946/
State New
Headers show

Comments

Paolo Bonzini - July 4, 2013, 3:13 p.m.
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.

Reviewed-by: Jan Kiszka <jan.kiszka@siemens.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
 exec.c                | 23 ++++++++++++++++-------
 include/exec/memory.h |  1 +
 2 files changed, 17 insertions(+), 7 deletions(-)

Patch

diff --git a/exec.c b/exec.c
index 2eb279c..bd05c40 100644
--- a/exec.c
+++ b/exec.c
@@ -841,7 +841,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);
 
@@ -1704,9 +1704,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)
@@ -1770,13 +1782,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 248c89b..ebe0d24 100644
--- a/include/exec/memory.h
+++ b/include/exec/memory.h
@@ -209,6 +209,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;