From nobody Mon Feb 9 11:30:49 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1505921330674792.9091747803959; Wed, 20 Sep 2017 08:28:50 -0700 (PDT) Received: from localhost ([::1]:48861 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dugvh-0006U1-Pb for importer@patchew.org; Wed, 20 Sep 2017 11:28:49 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:56693) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dufmm-00045J-0z for qemu-devel@nongnu.org; Wed, 20 Sep 2017 10:15:38 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1dufmh-0005P0-Ct for qemu-devel@nongnu.org; Wed, 20 Sep 2017 10:15:32 -0400 Received: from ozlabs.ru ([107.173.13.209]:59854) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1dufmh-0005Op-1u for qemu-devel@nongnu.org; Wed, 20 Sep 2017 10:15:27 -0400 Received: from vpl1.ozlabs.ibm.com (localhost [IPv6:::1]) by ozlabs.ru (Postfix) with ESMTP id CABB63A60051; Wed, 20 Sep 2017 07:48:01 -0400 (EDT) From: Alexey Kardashevskiy To: qemu-devel@nongnu.org Date: Wed, 20 Sep 2017 21:46:23 +1000 Message-Id: <20170920114637.42004-5-aik@ozlabs.ru> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20170920114637.42004-1-aik@ozlabs.ru> References: <20170920114637.42004-1-aik@ozlabs.ru> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x [fuzzy] X-Received-From: 107.173.13.209 Subject: [Qemu-devel] [PATCH qemu v4 04/18] memory: Move AddressSpaceDispatch from AddressSpace to FlatView X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Alexey Kardashevskiy , Paolo Bonzini Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" As we are going to share FlatView's between AddressSpace's, and AddressSpaceDispatch is a structure to perform quick lookup in FlatView, this moves ASD to FlatView. After previosly open coded ASD rendering, we can also remove as->next_dispatch as the new FlatView pointer is stored on a stack and set to an AS atomically. flatview_destroy() is executed under RCU instead of address_space_dispatch_free() now. This makes mem_begin/mem_commit to work with ASD and mem_add with FV as later on mem_add will be taking FV as an argument anyway. This should cause no behavioural change. Signed-off-by: Alexey Kardashevskiy --- Changes: v4: * since FlatView::rcu is used now to dispose FV, call_rcu() in address_space_update_topology() is replaced with direct call to flatview_unref() --- include/exec/memory-internal.h | 12 +++++++----- include/exec/memory.h | 2 -- exec.c | 41 +++++++++++---------------------------= --- memory.c | 31 ++++++++++++++++++++++++------- 4 files changed, 42 insertions(+), 44 deletions(-) diff --git a/include/exec/memory-internal.h b/include/exec/memory-internal.h index 9abde2f11c..6e08eda256 100644 --- a/include/exec/memory-internal.h +++ b/include/exec/memory-internal.h @@ -22,16 +22,18 @@ #ifndef CONFIG_USER_ONLY typedef struct AddressSpaceDispatch AddressSpaceDispatch; =20 -void address_space_destroy_dispatch(AddressSpace *as); - extern const MemoryRegionOps unassigned_mem_ops; =20 bool memory_region_access_valid(MemoryRegion *mr, hwaddr addr, unsigned size, bool is_write); =20 -void mem_add(AddressSpace *as, MemoryRegionSection *section); -void mem_begin(AddressSpace *as); -void mem_commit(AddressSpace *as); +void mem_add(AddressSpace *as, FlatView *fv, MemoryRegionSection *section); +AddressSpaceDispatch *mem_begin(AddressSpace *as); +void mem_commit(AddressSpaceDispatch *d); + +AddressSpaceDispatch *address_space_to_dispatch(AddressSpace *as); +AddressSpaceDispatch *flatview_to_dispatch(FlatView *fv); +void address_space_dispatch_free(AddressSpaceDispatch *d); =20 #endif #endif diff --git a/include/exec/memory.h b/include/exec/memory.h index 9581f7a7db..2346f8b863 100644 --- a/include/exec/memory.h +++ b/include/exec/memory.h @@ -316,8 +316,6 @@ struct AddressSpace { =20 int ioeventfd_nb; struct MemoryRegionIoeventfd *ioeventfds; - struct AddressSpaceDispatch *dispatch; - struct AddressSpaceDispatch *next_dispatch; QTAILQ_HEAD(memory_listeners_as, MemoryListener) listeners; QTAILQ_ENTRY(AddressSpace) address_spaces_link; }; diff --git a/exec.c b/exec.c index 1626d254bb..afd64127e6 100644 --- a/exec.c +++ b/exec.c @@ -187,8 +187,6 @@ typedef struct PhysPageMap { } PhysPageMap; =20 struct AddressSpaceDispatch { - struct rcu_head rcu; - MemoryRegionSection *mru_section; /* This is a multi-level map on the physical address space. * The bottom level has pointers to MemoryRegionSections. @@ -485,7 +483,7 @@ static MemoryRegionSection address_space_do_translate(A= ddressSpace *as, IOMMUMemoryRegionClass *imrc; =20 for (;;) { - AddressSpaceDispatch *d =3D atomic_rcu_read(&as->dispatch); + AddressSpaceDispatch *d =3D address_space_to_dispatch(as); section =3D address_space_translate_internal(d, addr, &addr, plen,= is_mmio); =20 iommu_mr =3D memory_region_get_iommu(section->mr); @@ -1222,7 +1220,7 @@ hwaddr memory_region_section_get_iotlb(CPUState *cpu, } else { AddressSpaceDispatch *d; =20 - d =3D atomic_rcu_read(§ion->address_space->dispatch); + d =3D address_space_to_dispatch(section->address_space); iotlb =3D section - d->map.sections; iotlb +=3D xlat; } @@ -1347,9 +1345,9 @@ static void register_multipage(AddressSpaceDispatch *= d, phys_page_set(d, start_addr >> TARGET_PAGE_BITS, num_pages, section_in= dex); } =20 -void mem_add(AddressSpace *as, MemoryRegionSection *section) +void mem_add(AddressSpace *as, FlatView *fv, MemoryRegionSection *section) { - AddressSpaceDispatch *d =3D as->next_dispatch; + AddressSpaceDispatch *d =3D flatview_to_dispatch(fv); MemoryRegionSection now =3D *section, remain =3D *section; Int128 page_size =3D int128_make64(TARGET_PAGE_SIZE); =20 @@ -2672,7 +2670,7 @@ static void io_mem_init(void) NULL, UINT64_MAX); } =20 -void mem_begin(AddressSpace *as) +AddressSpaceDispatch *mem_begin(AddressSpace *as) { AddressSpaceDispatch *d =3D g_new0(AddressSpaceDispatch, 1); uint16_t n; @@ -2688,26 +2686,19 @@ void mem_begin(AddressSpace *as) =20 d->phys_map =3D (PhysPageEntry) { .ptr =3D PHYS_MAP_NODE_NIL, .skip = =3D 1 }; d->as =3D as; - as->next_dispatch =3D d; + + return d; } =20 -static void address_space_dispatch_free(AddressSpaceDispatch *d) +void address_space_dispatch_free(AddressSpaceDispatch *d) { phys_sections_free(&d->map); g_free(d); } =20 -void mem_commit(AddressSpace *as) +void mem_commit(AddressSpaceDispatch *d) { - AddressSpaceDispatch *cur =3D as->dispatch; - AddressSpaceDispatch *next =3D as->next_dispatch; - - phys_page_compact_all(next, next->map.nodes_nb); - - atomic_rcu_set(&as->dispatch, next); - if (cur) { - call_rcu(cur, address_space_dispatch_free, rcu); - } + phys_page_compact_all(d, d->map.nodes_nb); } =20 static void tcg_commit(MemoryListener *listener) @@ -2723,21 +2714,11 @@ static void tcg_commit(MemoryListener *listener) * We reload the dispatch pointer now because cpu_reloading_memory_map= () * may have split the RCU critical section. */ - d =3D atomic_rcu_read(&cpuas->as->dispatch); + d =3D address_space_to_dispatch(cpuas->as); atomic_rcu_set(&cpuas->memory_dispatch, d); tlb_flush(cpuas->cpu); } =20 -void address_space_destroy_dispatch(AddressSpace *as) -{ - AddressSpaceDispatch *d =3D as->dispatch; - - atomic_rcu_set(&as->dispatch, NULL); - if (d) { - call_rcu(d, address_space_dispatch_free, rcu); - } -} - static void memory_map_init(void) { system_memory =3D g_malloc(sizeof(*system_memory)); diff --git a/memory.c b/memory.c index 9babd7d423..27d7aeffc2 100644 --- a/memory.c +++ b/memory.c @@ -229,6 +229,7 @@ struct FlatView { FlatRange *ranges; unsigned nr; unsigned nr_allocated; + struct AddressSpaceDispatch *dispatch; }; =20 typedef struct AddressSpaceOps AddressSpaceOps; @@ -289,6 +290,9 @@ static void flatview_destroy(FlatView *view) { int i; =20 + if (view->dispatch) { + address_space_dispatch_free(view->dispatch); + } for (i =3D 0; i < view->nr; i++) { memory_region_unref(view->ranges[i].mr); } @@ -304,10 +308,25 @@ static void flatview_ref(FlatView *view) static void flatview_unref(FlatView *view) { if (atomic_fetch_dec(&view->ref) =3D=3D 1) { - flatview_destroy(view); + call_rcu(view, flatview_destroy, rcu); } } =20 +static FlatView *address_space_to_flatview(AddressSpace *as) +{ + return atomic_rcu_read(&as->current_map); +} + +AddressSpaceDispatch *flatview_to_dispatch(FlatView *fv) +{ + return fv->dispatch; +} + +AddressSpaceDispatch *address_space_to_dispatch(AddressSpace *as) +{ + return flatview_to_dispatch(address_space_to_flatview(as)); +} + static bool can_merge(FlatRange *r1, FlatRange *r2) { return int128_eq(addrrange_end(r1->addr), r2->addr.start) @@ -886,13 +905,13 @@ static void address_space_update_topology(AddressSpac= e *as) FlatView *new_view =3D generate_memory_topology(as->root); int i; =20 - mem_begin(as); + new_view->dispatch =3D mem_begin(as); for (i =3D 0; i < new_view->nr; i++) { MemoryRegionSection mrs =3D section_from_flat_range(&new_view->ranges[i], as); - mem_add(as, &mrs); + mem_add(as, new_view, &mrs); } - mem_commit(as); + mem_commit(new_view->dispatch); =20 if (!QTAILQ_EMPTY(&as->listeners)) { address_space_update_topology_pass(as, old_view, new_view, false); @@ -901,7 +920,7 @@ static void address_space_update_topology(AddressSpace = *as) =20 /* Writes are protected by the BQL. */ atomic_rcu_set(&as->current_map, new_view); - call_rcu(old_view, flatview_unref, rcu); + flatview_unref(old_view); =20 /* Note that all the old MemoryRegions are still alive up to this * point. This relieves most MemoryListeners from the need to @@ -2631,7 +2650,6 @@ void address_space_init(AddressSpace *as, MemoryRegio= n *root, const char *name) QTAILQ_INIT(&as->listeners); QTAILQ_INSERT_TAIL(&address_spaces, as, address_spaces_link); as->name =3D g_strdup(name ? name : "anonymous"); - as->dispatch =3D NULL; memory_region_update_pending |=3D root->enabled; memory_region_transaction_commit(); } @@ -2640,7 +2658,6 @@ static void do_address_space_destroy(AddressSpace *as) { bool do_free =3D as->malloced; =20 - address_space_destroy_dispatch(as); assert(QTAILQ_EMPTY(&as->listeners)); =20 flatview_unref(as->current_map); --=20 2.11.0