[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v3 07/23] memory: maintain a list of address spaces
From: |
Avi Kivity |
Subject: |
[Qemu-devel] [PATCH v3 07/23] memory: maintain a list of address spaces |
Date: |
Tue, 9 Oct 2012 18:32:32 +0200 |
Instead of embedding knowledge of the memory and I/O address spaces in the
memory core, maintain a list of all address spaces. This list will later
be extended dynamically for other bus masters.
Reviewed-by: Anthony Liguori <address@hidden>
Signed-off-by: Avi Kivity <address@hidden>
---
memory.c | 75 +++++++++++++++++++++++++++++++++++++++-------------------------
memory.h | 2 ++
2 files changed, 48 insertions(+), 29 deletions(-)
diff --git a/memory.c b/memory.c
index 431a867..b58b97c 100644
--- a/memory.c
+++ b/memory.c
@@ -28,6 +28,9 @@
static QTAILQ_HEAD(memory_listeners, MemoryListener) memory_listeners
= QTAILQ_HEAD_INITIALIZER(memory_listeners);
+static QTAILQ_HEAD(, AddressSpace) address_spaces
+ = QTAILQ_HEAD_INITIALIZER(address_spaces);
+
typedef struct AddrRange AddrRange;
/*
@@ -449,14 +452,15 @@ static void memory_region_iorange_destructor(IORange
*iorange)
static AddressSpace *memory_region_to_address_space(MemoryRegion *mr)
{
+ AddressSpace *as;
+
while (mr->parent) {
mr = mr->parent;
}
- if (mr == address_space_memory.root) {
- return &address_space_memory;
- }
- if (mr == address_space_io.root) {
- return &address_space_io;
+ QTAILQ_FOREACH(as, &address_spaces, address_spaces_link) {
+ if (mr == as->root) {
+ return as;
+ }
}
abort();
}
@@ -729,16 +733,15 @@ void memory_region_transaction_begin(void)
void memory_region_transaction_commit(void)
{
+ AddressSpace *as;
+
assert(memory_region_transaction_depth);
--memory_region_transaction_depth;
if (!memory_region_transaction_depth) {
MEMORY_LISTENER_CALL_GLOBAL(begin, Forward);
- if (address_space_memory.root) {
- address_space_update_topology(&address_space_memory);
- }
- if (address_space_io.root) {
- address_space_update_topology(&address_space_io);
+ QTAILQ_FOREACH(as, &address_spaces, address_spaces_link) {
+ address_space_update_topology(as);
}
MEMORY_LISTENER_CALL_GLOBAL(commit, Forward);
@@ -1072,12 +1075,14 @@ void memory_region_set_dirty(MemoryRegion *mr,
target_phys_addr_t addr,
void memory_region_sync_dirty_bitmap(MemoryRegion *mr)
{
+ AddressSpace *as;
FlatRange *fr;
- FOR_EACH_FLAT_RANGE(fr, address_space_memory.current_map) {
- if (fr->mr == mr) {
- MEMORY_LISTENER_UPDATE_REGION(fr, &address_space_memory,
- Forward, log_sync);
+ QTAILQ_FOREACH(as, &address_spaces, address_spaces_link) {
+ FOR_EACH_FLAT_RANGE(fr, as->current_map) {
+ if (fr->mr == mr) {
+ MEMORY_LISTENER_UPDATE_REGION(fr, as, Forward, log_sync);
+ }
}
}
}
@@ -1120,13 +1125,13 @@ void *memory_region_get_ram_ptr(MemoryRegion *mr)
return qemu_get_ram_ptr(mr->ram_addr & TARGET_PAGE_MASK);
}
-static void memory_region_update_coalesced_range(MemoryRegion *mr)
+static void memory_region_update_coalesced_range_as(MemoryRegion *mr,
AddressSpace *as)
{
FlatRange *fr;
CoalescedMemoryRange *cmr;
AddrRange tmp;
- FOR_EACH_FLAT_RANGE(fr, address_space_memory.current_map) {
+ FOR_EACH_FLAT_RANGE(fr, as->current_map) {
if (fr->mr == mr) {
qemu_unregister_coalesced_mmio(int128_get64(fr->addr.start),
int128_get64(fr->addr.size));
@@ -1145,6 +1150,15 @@ static void
memory_region_update_coalesced_range(MemoryRegion *mr)
}
}
+static void memory_region_update_coalesced_range(MemoryRegion *mr)
+{
+ AddressSpace *as;
+
+ QTAILQ_FOREACH(as, &address_spaces, address_spaces_link) {
+ memory_region_update_coalesced_range_as(mr, as);
+ }
+}
+
void memory_region_set_coalescing(MemoryRegion *mr)
{
memory_region_clear_coalescing(mr);
@@ -1450,10 +1464,6 @@ static void listener_add_address_space(MemoryListener
*listener,
{
FlatRange *fr;
- if (!as->root) {
- return;
- }
-
if (listener->address_space_filter
&& listener->address_space_filter != as->root) {
return;
@@ -1478,6 +1488,7 @@ static void listener_add_address_space(MemoryListener
*listener,
void memory_listener_register(MemoryListener *listener, MemoryRegion *filter)
{
MemoryListener *other = NULL;
+ AddressSpace *as;
listener->address_space_filter = filter;
if (QTAILQ_EMPTY(&memory_listeners)
@@ -1492,8 +1503,10 @@ void memory_listener_register(MemoryListener *listener,
MemoryRegion *filter)
}
QTAILQ_INSERT_BEFORE(other, listener, link);
}
- listener_add_address_space(listener, &address_space_memory);
- listener_add_address_space(listener, &address_space_io);
+
+ QTAILQ_FOREACH(as, &address_spaces, address_spaces_link) {
+ listener_add_address_space(listener, as);
+ }
}
void memory_listener_unregister(MemoryListener *listener)
@@ -1507,17 +1520,21 @@ void address_space_init(AddressSpace *as, MemoryRegion
*root)
as->root = root;
as->current_map = g_new(FlatView, 1);
flatview_init(as->current_map);
+ QTAILQ_INSERT_TAIL(&address_spaces, as, address_spaces_link);
+ as->name = NULL;
memory_region_transaction_commit();
}
void set_system_memory_map(MemoryRegion *mr)
{
address_space_init(&address_space_memory, mr);
+ address_space_memory.name = "memory";
}
void set_system_io_map(MemoryRegion *mr)
{
address_space_init(&address_space_io, mr);
+ address_space_io.name = "I/O";
}
uint64_t io_mem_read(MemoryRegion *mr, target_phys_addr_t addr, unsigned size)
@@ -1637,16 +1654,16 @@ void mtree_info(fprintf_function mon_printf, void *f)
{
MemoryRegionListHead ml_head;
MemoryRegionList *ml, *ml2;
+ AddressSpace *as;
QTAILQ_INIT(&ml_head);
- mon_printf(f, "memory\n");
- mtree_print_mr(mon_printf, f, address_space_memory.root, 0, 0, &ml_head);
-
- if (address_space_io.root &&
- !QTAILQ_EMPTY(&address_space_io.root->subregions)) {
- mon_printf(f, "I/O\n");
- mtree_print_mr(mon_printf, f, address_space_io.root, 0, 0, &ml_head);
+ QTAILQ_FOREACH(as, &address_spaces, address_spaces_link) {
+ if (!as->name) {
+ continue;
+ }
+ mon_printf(f, "%s\n", as->name);
+ mtree_print_mr(mon_printf, f, as->root, 0, 0, &ml_head);
}
mon_printf(f, "aliases\n");
diff --git a/memory.h b/memory.h
index a1d75e7..46bc5e1 100644
--- a/memory.h
+++ b/memory.h
@@ -164,10 +164,12 @@ typedef struct AddressSpace AddressSpace;
*/
struct AddressSpace {
/* All fields are private. */
+ const char *name;
MemoryRegion *root;
struct FlatView *current_map;
int ioeventfd_nb;
struct MemoryRegionIoeventfd *ioeventfds;
+ QTAILQ_ENTRY(AddressSpace) address_spaces_link;
};
typedef struct MemoryRegionSection MemoryRegionSection;
--
1.7.12
- [Qemu-devel] [PATCH v3 04/23] xen_pt: use separate MemoryListeners for memory and I/O, (continued)
- [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, 2012/10/09
- [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 <=
- [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
[Qemu-devel] [PATCH v3 11/23] xen_pt: drop no-op MemoryListener callbacks, Avi Kivity, 2012/10/09
[Qemu-devel] [PATCH v3 16/23] memory: move tcg flush into a tcg memory listener, Avi Kivity, 2012/10/09
[Qemu-devel] [PATCH v3 05/23] memory: prepare AddressSpace for exporting, Avi Kivity, 2012/10/09
Message not available