[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [patch v4 10/16] memory: introduce lock ops for MemoryRegio
From: |
Liu Ping Fan |
Subject: |
[Qemu-devel] [patch v4 10/16] memory: introduce lock ops for MemoryRegionOps |
Date: |
Mon, 22 Oct 2012 17:23:53 +0800 |
This can help memory core to use mr's fine lock to mmio dispatch.
Signed-off-by: Liu Ping Fan <address@hidden>
---
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