[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 64/66] exec: put memory map in AddressSpaceDispatch
From: |
Paolo Bonzini |
Subject: |
[Qemu-devel] [PATCH 64/66] exec: put memory map in AddressSpaceDispatch |
Date: |
Thu, 4 Jul 2013 17:14:00 +0200 |
After this patch, AddressSpaceDispatch holds a constistent tuple of
(phys_map, nodes, sections). This will be important when updates
of the topology will run concurrently with reads.
cur_map is not used anymore except for freeing it at the end of the
topology update.
Signed-off-by: Paolo Bonzini <address@hidden>
---
exec.c | 28 +++++++++++++++++-----------
1 file changed, 17 insertions(+), 11 deletions(-)
diff --git a/exec.c b/exec.c
index bd05c40..6d3492e 100644
--- a/exec.c
+++ b/exec.c
@@ -88,11 +88,15 @@ struct PhysPageEntry {
uint16_t ptr : 15;
};
+typedef PhysPageEntry Node[L2_SIZE];
+
struct AddressSpaceDispatch {
/* This is a multi-level map on the physical address space.
* The bottom level has pointers to MemoryRegionSections.
*/
PhysPageEntry phys_map;
+ Node *nodes;
+ MemoryRegionSection *sections;
AddressSpace *as;
};
@@ -109,8 +113,6 @@ typedef struct subpage_t {
#define PHYS_SECTION_ROM 2
#define PHYS_SECTION_WATCH 3
-typedef PhysPageEntry Node[L2_SIZE];
-
typedef struct PhysPageMap {
unsigned sections_nb;
unsigned sections_nb_alloc;
@@ -232,14 +234,15 @@ static MemoryRegionSection
*address_space_lookup_region(AddressSpace *as,
hwaddr addr,
bool resolve_subpage)
{
+ AddressSpaceDispatch *d = as->dispatch;
MemoryRegionSection *section;
subpage_t *subpage;
- section = phys_page_find(as->dispatch->phys_map, addr >> TARGET_PAGE_BITS,
- cur_map.nodes, cur_map.sections);
+ section = phys_page_find(d->phys_map, addr >> TARGET_PAGE_BITS,
+ d->nodes, d->sections);
if (resolve_subpage && section->mr->subpage) {
subpage = container_of(section->mr, subpage_t, iomem);
- section = &cur_map.sections[subpage->sub_section[SUBPAGE_IDX(addr)]];
+ section = &d->sections[subpage->sub_section[SUBPAGE_IDX(addr)]];
}
return section;
}
@@ -730,7 +733,7 @@ hwaddr memory_region_section_get_iotlb(CPUArchState *env,
iotlb |= PHYS_SECTION_ROM;
}
} else {
- iotlb = section - cur_map.sections;
+ iotlb = section - address_space_memory.dispatch->sections;
iotlb += xlat;
}
@@ -1687,7 +1690,7 @@ static uint16_t dummy_section(MemoryRegion *mr)
MemoryRegion *iotlb_to_region(hwaddr index)
{
- return cur_map.sections[index & ~TARGET_PAGE_MASK].mr;
+ return address_space_memory.dispatch->sections[index &
~TARGET_PAGE_MASK].mr;
}
static void io_mem_init(void)
@@ -1714,11 +1717,14 @@ static void mem_begin(MemoryListener *listener)
static void mem_commit(MemoryListener *listener)
{
AddressSpace *as = container_of(listener, AddressSpace, dispatch_listener);
- AddressSpaceDispatch *d = as->dispatch;
+ AddressSpaceDispatch *cur = as->dispatch;
+ AddressSpaceDispatch *next = as->next_dispatch;
- /* cur_map will soon be switched to next_map, too. */
- as->dispatch = as->next_dispatch;
- g_free(d);
+ next->nodes = next_map.nodes;
+ next->sections = next_map.sections;
+
+ as->dispatch = next;
+ g_free(cur);
}
static void core_begin(MemoryListener *listener)
--
1.8.1.4
- [Qemu-devel] [PATCH 55/66] memory: access FlatView from a local variable, (continued)
- [Qemu-devel] [PATCH 55/66] memory: access FlatView from a local variable, Paolo Bonzini, 2013/07/04
- [Qemu-devel] [PATCH 56/66] memory: use a new FlatView pointer on every topology update, Paolo Bonzini, 2013/07/04
- [Qemu-devel] [PATCH 54/66] add a header file for atomic operations, Paolo Bonzini, 2013/07/04
- [Qemu-devel] [PATCH 57/66] memory: add reference counting to FlatView, Paolo Bonzini, 2013/07/04
- [Qemu-devel] [PATCH 58/66] qom: Use atomics for object refcounting, Paolo Bonzini, 2013/07/04
- [Qemu-devel] [PATCH 59/66] exec: change well-known physical sections to macros, Paolo Bonzini, 2013/07/04
- [Qemu-devel] [PATCH 60/66] exec: separate current memory map from the one being built, Paolo Bonzini, 2013/07/04
- [Qemu-devel] [PATCH 61/66] memory: move MemoryListener declaration earlier, Paolo Bonzini, 2013/07/04
- [Qemu-devel] [PATCH 63/66] exec: separate current radix tree from the one being built, Paolo Bonzini, 2013/07/04
- [Qemu-devel] [PATCH 62/66] exec: move listener from AddressSpaceDispatch to AddressSpace, Paolo Bonzini, 2013/07/04
- [Qemu-devel] [PATCH 64/66] exec: put memory map in AddressSpaceDispatch,
Paolo Bonzini <=
- [Qemu-devel] [PATCH 65/66] exec: remove cur_map, Paolo Bonzini, 2013/07/04
- [Qemu-devel] [PATCH 66/66] exec: change some APIs to take AddressSpaceDispatch, Paolo Bonzini, 2013/07/04
- [Qemu-devel] [PATCH 53/66] hw/[u-x]*: pass owner to memory_region_init* functions, Paolo Bonzini, 2013/07/04
- Re: [Qemu-devel] [PULL 00/66] Memory API changes for 1.6: ownership, I/O ports, RCU preparation, Paolo Bonzini, 2013/07/04
- [Qemu-devel] [PATCH 52/66] hw/t*: pass owner to memory_region_init* functions, Paolo Bonzini, 2013/07/04