No need to flush the coalesced MMIO buffer multiple times when combining multiple accesses into one.
Signed-off-by: Paolo Bonzini <pbonz...@redhat.com> --- memory.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/memory.c b/memory.c index 1ade19c..495e693 100644 --- a/memory.c +++ b/memory.c @@ -401,9 +401,6 @@ static void memory_region_read_accessor(MemoryRegion *mr, { uint64_t tmp; - if (mr->flush_coalesced_mmio) { - qemu_flush_coalesced_mmio_buffer(); - } tmp = mr->ops->read(mr->opaque, addr, size); trace_memory_region_ops_read(mr, addr, tmp, size); *value |= (tmp & mask) << shift; @@ -432,9 +429,6 @@ static void memory_region_write_accessor(MemoryRegion *mr, { uint64_t tmp; - if (mr->flush_coalesced_mmio) { - qemu_flush_coalesced_mmio_buffer(); - } tmp = (*value >> shift) & mask; trace_memory_region_ops_write(mr, addr, tmp, size); mr->ops->write(mr->opaque, addr, tmp, size); @@ -965,6 +959,10 @@ static bool memory_region_dispatch_read(MemoryRegion *mr, uint64_t *pval, unsigned size) { + if (mr->flush_coalesced_mmio) { + qemu_flush_coalesced_mmio_buffer(); + } + if (!memory_region_access_valid(mr, addr, size, false)) { *pval = unassigned_mem_read(mr, addr, size); return true; @@ -1013,6 +1011,10 @@ static bool memory_region_dispatch_write(MemoryRegion *mr, uint64_t data, unsigned size) { + if (mr->flush_coalesced_mmio) { + qemu_flush_coalesced_mmio_buffer(); + } + if (!memory_region_access_valid(mr, addr, size, true)) { unassigned_mem_write(mr, addr, data, size); return true; -- 1.8.4.2