From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:60967) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UsdOh-0006p4-49 for qemu-devel@nongnu.org; Fri, 28 Jun 2013 14:27:53 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1UsdOd-0000XG-B1 for qemu-devel@nongnu.org; Fri, 28 Jun 2013 14:27:51 -0400 Received: from mail-ee0-x22c.google.com ([2a00:1450:4013:c00::22c]:33455) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UsdOd-0000Wz-24 for qemu-devel@nongnu.org; Fri, 28 Jun 2013 14:27:47 -0400 Received: by mail-ee0-f44.google.com with SMTP id c13so1200235eek.31 for ; Fri, 28 Jun 2013 11:27:46 -0700 (PDT) Received: from playground.lan (net-37-116-217-184.cust.dsl.vodafone.it. [37.116.217.184]) by mx.google.com with ESMTPSA id o5sm12035344eef.5.2013.06.28.11.27.44 for (version=TLSv1.2 cipher=RC4-SHA bits=128/128); Fri, 28 Jun 2013 11:27:45 -0700 (PDT) Sender: Paolo Bonzini From: Paolo Bonzini Date: Fri, 28 Jun 2013 20:26:44 +0200 Message-Id: <1372444009-11544-26-git-send-email-pbonzini@redhat.com> In-Reply-To: <1372444009-11544-1-git-send-email-pbonzini@redhat.com> References: <1372444009-11544-1-git-send-email-pbonzini@redhat.com> Subject: [Qemu-devel] [PATCH 25/30] exec: put memory map in AddressSpaceDispatch List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org This lets us get a consistent (phys_map, nodes, sections) using RCU. After this patch, cur_map is not used anymore except for freeing it at the end of the topology update. Signed-off-by: Paolo Bonzini --- exec.c | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/exec.c b/exec.c index 0d852ee..581f0c4 100644 --- a/exec.c +++ b/exec.c @@ -94,11 +94,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; }; @@ -115,8 +119,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; @@ -238,14 +240,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; } @@ -744,7 +747,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; } @@ -1701,7 +1704,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) @@ -1728,11 +1731,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