[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-changelog] [qemu-xen stable-4.10] memory: seek FlatView sharing candidates among children subregions



commit 639701e4f2f57cd54b657a8281dba72d067db8ee
Author:     Paolo Bonzini <pbonzini@xxxxxxxxxx>
AuthorDate: Thu Sep 21 12:28:16 2017 +0200
Commit:     Michael Roth <mdroth@xxxxxxxxxxxxxxxxxx>
CommitDate: Mon Dec 4 22:41:57 2017 -0600

    memory: seek FlatView sharing candidates among children subregions
    
    A container can be used instead of an alias to allow switching between
    multiple subregions.  In this case we cannot directly share the
    subregions (since they only belong to a single parent), but if the
    subregions are aliases we can in turn walk those.
    
    This is not enough to remove all source of quadratic FlatView creation,
    but it enables sharing of the PCI bus master FlatViews (and their
    AddressSpaceDispatch structures) across all PCI devices.  For 112
    virtio-net-pci devices, boot time is reduced from 25 to 10 seconds and
    memory consumption from 1.4 to 1 G.
    
    Signed-off-by: Paolo Bonzini <pbonzini@xxxxxxxxxx>
    (cherry picked from commit e673ba9af9bf8fd8e0f44025ac738b8285b3ed27)
    Signed-off-by: Michael Roth <mdroth@xxxxxxxxxxxxxxxxxx>
---
 memory.c | 40 ++++++++++++++++++++++++++++++++++------
 1 file changed, 34 insertions(+), 6 deletions(-)

diff --git a/memory.c b/memory.c
index 774a17f..231bb78 100644
--- a/memory.c
+++ b/memory.c
@@ -733,12 +733,40 @@ static void render_memory_region(FlatView *view,
 
 static MemoryRegion *memory_region_get_flatview_root(MemoryRegion *mr)
 {
-    while (mr->alias && !mr->alias_offset &&
-           int128_ge(mr->size, mr->alias->size)) {
-        /* The alias is included in its entirety.  Use it as
-         * the "real" root, so that we can share more FlatViews.
-         */
-        mr = mr->alias;
+    while (mr->enabled) {
+        if (mr->alias) {
+            if (!mr->alias_offset && int128_ge(mr->size, mr->alias->size)) {
+                /* The alias is included in its entirety.  Use it as
+                 * the "real" root, so that we can share more FlatViews.
+                 */
+                mr = mr->alias;
+                continue;
+            }
+        } else if (!mr->terminates) {
+            unsigned int found = 0;
+            MemoryRegion *child, *next = NULL;
+            QTAILQ_FOREACH(child, &mr->subregions, subregions_link) {
+                if (child->enabled) {
+                    if (++found > 1) {
+                        next = NULL;
+                        break;
+                    }
+                    if (!child->addr && int128_ge(mr->size, child->size)) {
+                        /* A child is included in its entirety.  If it's the 
only
+                         * enabled one, use it in the hope of finding an alias 
down the
+                         * way. This will also let us share FlatViews.
+                         */
+                        next = child;
+                    }
+                }
+            }
+            if (next) {
+                mr = next;
+                continue;
+            }
+        }
+
+        break;
     }
 
     return mr;
--
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

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.