mirror of
https://github.com/yuzu-emu/unicorn.git
synced 2024-12-23 00:35:34 +00:00
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. Backports commit e673ba9af9bf8fd8e0f44025ac738b8285b3ed27 from qemu
This commit is contained in:
parent
7eab335b2e
commit
20b1bd767f
|
@ -688,12 +688,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;
|
||||
|
|
Loading…
Reference in a new issue