This can help memory core to use mr's fine lock to mmio dispatch. Signed-off-by: Liu Ping Fan <pingf...@linux.vnet.ibm.com> --- memory.c | 16 +++++++++++++++- memory.h | 2 ++ 2 files changed, 17 insertions(+), 1 deletions(-)
diff --git a/memory.c b/memory.c index d528d1f..86d5623 100644 --- a/memory.c +++ b/memory.c @@ -1505,13 +1505,27 @@ void set_system_io_map(MemoryRegion *mr) uint64_t io_mem_read(MemoryRegion *mr, target_phys_addr_t addr, unsigned size) { - return memory_region_dispatch_read(mr, addr, size); + uint64_t ret; + if (mr->ops->lock) { + mr->ops->lock(mr); + } + ret = memory_region_dispatch_read(mr, addr, size); + if (mr->ops->lock) { + mr->ops->unlock(mr); + } + return ret; } void io_mem_write(MemoryRegion *mr, target_phys_addr_t addr, uint64_t val, unsigned size) { + if (mr->ops->lock) { + mr->ops->lock(mr); + } memory_region_dispatch_write(mr, addr, val, size); + if (mr->ops->lock) { + mr->ops->unlock(mr); + } } typedef struct MemoryRegionList MemoryRegionList; diff --git a/memory.h b/memory.h index 9039411..5d00066 100644 --- a/memory.h +++ b/memory.h @@ -69,6 +69,8 @@ struct MemoryRegionOps { unsigned size); int (*ref)(MemoryRegion *mr); void (*unref)(MemoryRegion *mr); + void (*lock)(MemoryRegion *mr); + void (*unlock)(MemoryRegion *mr); enum device_endian endianness; /* Guest-visible constraints: */ -- 1.7.4.4