Skip to content

Commit

Permalink
exec: move listener from AddressSpaceDispatch to AddressSpace
Browse files Browse the repository at this point in the history
This will help having two copies of AddressSpaceDispatch during the
recreation of the radix tree (one being built, and one that is complete
and will be protected by RCU).  We do not want to have to unregister and
re-register the listener.

Reviewed-by: Jan Kiszka <jan.kiszka@siemens.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
  • Loading branch information
bonzini committed Jul 4, 2013
1 parent c2fc83e commit 89ae337
Show file tree
Hide file tree
Showing 2 changed files with 11 additions and 8 deletions.
17 changes: 9 additions & 8 deletions exec.c
Expand Up @@ -93,7 +93,6 @@ struct AddressSpaceDispatch {
* The bottom level has pointers to MemoryRegionSections.
*/
PhysPageEntry phys_map;
MemoryListener listener;
AddressSpace *as;
};

Expand Down Expand Up @@ -841,7 +840,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);

Expand Down Expand Up @@ -1703,7 +1703,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;
}
Expand Down Expand Up @@ -1772,22 +1773,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;
}
Expand Down
2 changes: 2 additions & 0 deletions include/exec/memory.h
Expand Up @@ -209,6 +209,8 @@ struct AddressSpace {
int ioeventfd_nb;
struct MemoryRegionIoeventfd *ioeventfds;
struct AddressSpaceDispatch *dispatch;
MemoryListener dispatch_listener;

QTAILQ_ENTRY(AddressSpace) address_spaces_link;
};

Expand Down

0 comments on commit 89ae337

Please sign in to comment.