diff options
author | Fam Zheng <famz@redhat.com> | 2014-06-13 14:34:41 +0800 |
---|---|---|
committer | Paolo Bonzini <pbonzini@redhat.com> | 2014-06-18 15:32:50 +0200 |
commit | ab5b3db5d711b290d63e954dc64647dd51cef962 (patch) | |
tree | b250b0591542b2dbdadbad252287e402b6956dd7 /memory.c | |
parent | feca4ac18b7e0df7cdc6e791a7e98cc303feb890 (diff) | |
download | qemu-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.c | 7 |
1 files changed, 6 insertions, 1 deletions
@@ -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) |