[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v3 21/23] memory: add address_space_destroy()
From: |
Avi Kivity |
Subject: |
[Qemu-devel] [PATCH v3 21/23] memory: add address_space_destroy() |
Date: |
Tue, 9 Oct 2012 18:32:46 +0200 |
Since address spaces can be created dynamically by device hotplug, they
can also be destroyed dynamically.
Signed-off-by: Avi Kivity <address@hidden>
---
exec.c | 10 ++++++++++
memory-internal.h | 1 +
memory.c | 18 ++++++++++++++++--
memory.h | 12 ++++++++++++
4 files changed, 39 insertions(+), 2 deletions(-)
diff --git a/exec.c b/exec.c
index ffd60c4..4bc79fb 100644
--- a/exec.c
+++ b/exec.c
@@ -3242,6 +3242,16 @@ void address_space_init_dispatch(AddressSpace *as)
memory_listener_register(&d->listener, as);
}
+void address_space_destroy_dispatch(AddressSpace *as)
+{
+ AddressSpaceDispatch *d = as->dispatch;
+
+ memory_listener_unregister(&d->listener);
+ destroy_l2_mapping(&d->phys_map, P_L2_LEVELS - 1);
+ g_free(d);
+ as->dispatch = NULL;
+}
+
static void memory_map_init(void)
{
system_memory = g_malloc(sizeof(*system_memory));
diff --git a/memory-internal.h b/memory-internal.h
index a9d914e..7923ced 100644
--- a/memory-internal.h
+++ b/memory-internal.h
@@ -40,6 +40,7 @@ struct AddressSpaceDispatch {
};
void address_space_init_dispatch(AddressSpace *as);
+void address_space_destroy_dispatch(AddressSpace *as);
ram_addr_t qemu_ram_alloc_from_ptr(ram_addr_t size, void *host,
MemoryRegion *mr);
diff --git a/memory.c b/memory.c
index 13be848..2f68d67 100644
--- a/memory.c
+++ b/memory.c
@@ -564,8 +564,10 @@ static FlatView generate_memory_topology(MemoryRegion *mr)
flatview_init(&view);
- render_memory_region(&view, mr, int128_zero(),
- addrrange_make(int128_zero(), int128_2_64()), false);
+ if (mr) {
+ render_memory_region(&view, mr, int128_zero(),
+ addrrange_make(int128_zero(), int128_2_64()),
false);
+ }
flatview_simplify(&view);
return view;
@@ -1542,6 +1544,18 @@ void address_space_init(AddressSpace *as, MemoryRegion
*root)
address_space_init_dispatch(as);
}
+void address_space_destroy(AddressSpace *as)
+{
+ /* Flush out anything from MemoryListeners listening in on this */
+ memory_region_transaction_begin();
+ as->root = NULL;
+ memory_region_transaction_commit();
+ QTAILQ_REMOVE(&address_spaces, as, address_spaces_link);
+ address_space_destroy_dispatch(as);
+ flatview_destroy(as->current_map);
+ g_free(as->current_map);
+}
+
uint64_t io_mem_read(MemoryRegion *mr, target_phys_addr_t addr, unsigned size)
{
return memory_region_dispatch_read(mr, addr, size);
diff --git a/memory.h b/memory.h
index d36c2ba..79393f1 100644
--- a/memory.h
+++ b/memory.h
@@ -804,6 +804,18 @@ void mtree_info(fprintf_function mon_printf, void *f);
*/
void address_space_init(AddressSpace *as, MemoryRegion *root);
+
+/**
+ * address_space_destroy: destroy an address space
+ *
+ * Releases all resources associated with an address space. After an address
space
+ * is destroyed, its root memory region (given by address_space_init()) may be
destroyed
+ * as well.
+ *
+ * @as: address space to be destroyed
+ */
+void address_space_destroy(AddressSpace *as);
+
/**
* address_space_rw: read from or write to an address space.
*
--
1.7.12
- [Qemu-devel] [PULL v3 00/23] Integrate DMA into the memory API, Avi Kivity, 2012/10/09
- [Qemu-devel] [PATCH v3 01/23] memory: rename 'exec-obsolete.h', Avi Kivity, 2012/10/09
- [Qemu-devel] [PATCH v3 02/23] vhost: use MemoryListener filtering to only monitor RAM address space, Avi Kivity, 2012/10/09
- [Qemu-devel] [PATCH v3 03/23] kvm: use separate MemoryListeners for memory and I/O, Avi Kivity, 2012/10/09
- [Qemu-devel] [PATCH v3 04/23] xen_pt: use separate MemoryListeners for memory and I/O, Avi Kivity, 2012/10/09
- [Qemu-devel] [PATCH v3 08/23] memory: provide defaults for MemoryListener operations, Avi Kivity, 2012/10/09
- [Qemu-devel] [PATCH v3 09/23] memory: drop no-op MemoryListener callbacks, Avi Kivity, 2012/10/09
- [Qemu-devel] [PATCH v3 06/23] memory: export AddressSpace, Avi Kivity, 2012/10/09
- [Qemu-devel] [PATCH v3 17/23] memory: use AddressSpace for MemoryListener filtering, Avi Kivity, 2012/10/09
- [Qemu-devel] [PATCH v3 18/23] s390: avoid reaching into memory core internals, Avi Kivity, 2012/10/09
- [Qemu-devel] [PATCH v3 21/23] memory: add address_space_destroy(),
Avi Kivity <=
- [Qemu-devel] [PATCH v3 22/23] pci: give each device its own address space, Avi Kivity, 2012/10/09
- [Qemu-devel] [PATCH v3 14/23] memory: manage coalesced mmio via a MemoryListener, Avi Kivity, 2012/10/09
- [Qemu-devel] [PATCH v3 13/23] xen: drop no-op MemoryListener callbacks, Avi Kivity, 2012/10/09
- [Qemu-devel] [PATCH v3 07/23] memory: maintain a list of address spaces, Avi Kivity, 2012/10/09
- [Qemu-devel] [PATCH v3 15/23] memory: move address_space_memory and address_space_io out of memory core, Avi Kivity, 2012/10/09
- [Qemu-devel] [PATCH v3 23/23] pci: honor PCI_COMMAND_MASTER, Avi Kivity, 2012/10/09