aboutsummaryrefslogtreecommitdiff
path: root/memory.c
diff options
context:
space:
mode:
authorFam Zheng <famz@redhat.com>2014-06-13 14:34:41 +0800
committerPaolo Bonzini <pbonzini@redhat.com>2014-06-18 15:32:50 +0200
commitab5b3db5d711b290d63e954dc64647dd51cef962 (patch)
treeb250b0591542b2dbdadbad252287e402b6956dd7 /memory.c
parentfeca4ac18b7e0df7cdc6e791a7e98cc303feb890 (diff)
downloadqemu-ab5b3db5d711b290d63e954dc64647dd51cef962.zip
qemu-ab5b3db5d711b290d63e954dc64647dd51cef962.tar.gz
qemu-ab5b3db5d711b290d63e954dc64647dd51cef962.tar.bz2
memory: Don't call memory_region_update_coalesced_range if nothing changed
With huge number of PCI devices in the system (for example, 200 virtio-blk-pci), this unconditional call can slow down emulation of irrelevant PCI operations drastically, such as a BAR update on a device that has no coalescing region. So avoid it. Signed-off-by: Fam Zheng <famz@redhat.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Diffstat (limited to 'memory.c')
-rw-r--r--memory.c7
1 files changed, 6 insertions, 1 deletions
diff --git a/memory.c b/memory.c
index 85798b0..4895e25 100644
--- a/memory.c
+++ b/memory.c
@@ -1332,6 +1332,7 @@ void memory_region_add_coalescing(MemoryRegion *mr,
void memory_region_clear_coalescing(MemoryRegion *mr)
{
CoalescedMemoryRange *cmr;
+ bool updated = false;
qemu_flush_coalesced_mmio_buffer();
mr->flush_coalesced_mmio = false;
@@ -1340,8 +1341,12 @@ void memory_region_clear_coalescing(MemoryRegion *mr)
cmr = QTAILQ_FIRST(&mr->coalesced);
QTAILQ_REMOVE(&mr->coalesced, cmr, link);
g_free(cmr);
+ updated = true;
+ }
+
+ if (updated) {
+ memory_region_update_coalesced_range(mr);
}
- memory_region_update_coalesced_range(mr);
}
void memory_region_set_flush_coalesced(MemoryRegion *mr)