[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [qemu-xen stable-4.10] memory: Share special empty FlatView
commit 496f97293e29361f48054f63adcbf1187c99fca2 Author: Alexey Kardashevskiy <aik@xxxxxxxxx> AuthorDate: Thu Sep 21 18:51:07 2017 +1000 Commit: Michael Roth <mdroth@xxxxxxxxxxxxxxxxxx> CommitDate: Mon Dec 4 22:42:02 2017 -0600 memory: Share special empty FlatView This shares an cached empty FlatView among address spaces. The empty FV is used every time when a root MR renders into a FV without memory sections which happens when MR or its children are not enabled or zero-sized. The empty_view is not NULL to keep the rest of memory API intact; it also has a dispatch tree for the same reason. On POWER8 with 255 CPUs, 255 virtio-net, 40 PCI bridges guest this halves the amount of FlatView's in use (557 -> 260) and dispatch tables (~800000 -> ~370000). In an unrelated experiment with 112 non-virtio devices on x86 ("-M pc"), only 4 FlatViews are alive, and about ~2000 are created at startup. Signed-off-by: Alexey Kardashevskiy <aik@xxxxxxxxx> Message-Id: <20170921085110.25598-16-aik@xxxxxxxxx> Signed-off-by: Paolo Bonzini <pbonzini@xxxxxxxxxx> (cherry picked from commit 092aa2fc65b7a35121616aad8f39d47b8f921618) Signed-off-by: Michael Roth <mdroth@xxxxxxxxxxxxxxxxxx> --- memory.c | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/memory.c b/memory.c index 231bb78..d908538 100644 --- a/memory.c +++ b/memory.c @@ -317,6 +317,7 @@ static void flatview_unref(FlatView *view) { if (atomic_fetch_dec(&view->ref) == 1) { trace_flatview_destroy_rcu(view, view->root); + assert(view->root); call_rcu(view, flatview_destroy, rcu); } } @@ -760,16 +761,19 @@ static MemoryRegion *memory_region_get_flatview_root(MemoryRegion *mr) } } } + if (found == 0) { + return NULL; + } if (next) { mr = next; continue; } } - break; + return mr; } - return mr; + return NULL; } /* Render a memory topology into a list of disjoint absolute ranges. */ @@ -965,12 +969,22 @@ static void address_space_update_topology_pass(AddressSpace *as, static void flatviews_init(void) { + static FlatView *empty_view; + if (flat_views) { return; } flat_views = g_hash_table_new_full(g_direct_hash, g_direct_equal, NULL, (GDestroyNotify) flatview_unref); + if (!empty_view) { + empty_view = generate_memory_topology(NULL); + /* We keep it alive forever in the global variable. */ + flatview_ref(empty_view); + } else { + g_hash_table_replace(flat_views, NULL, empty_view); + flatview_ref(empty_view); + } } static void flatviews_reset(void) -- generated by git-patchbot for /home/xen/git/qemu-xen.git#stable-4.10 _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |