]> rtime.felk.cvut.cz Git - lisovros/qemu_apohw.git/commitdiff
memory: Don't call memory_region_update_coalesced_range if nothing changed
authorFam Zheng <famz@redhat.com>
Fri, 13 Jun 2014 06:34:41 +0000 (14:34 +0800)
committerPaolo Bonzini <pbonzini@redhat.com>
Wed, 18 Jun 2014 13:32:50 +0000 (15:32 +0200)
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>
memory.c

index 85798b02992e8e58efdc419ff06b3fc735de4530..4895e253765640d104d85148727c9471d237e94e 100644 (file)
--- 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)