From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([208.118.235.92]:54791) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TQEFW-0002re-7y for qemu-devel@nongnu.org; Mon, 22 Oct 2012 05:24:43 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1TQEFJ-0006gm-2l for qemu-devel@nongnu.org; Mon, 22 Oct 2012 05:24:42 -0400 Received: from e28smtp01.in.ibm.com ([122.248.162.1]:57691) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TQEFI-0006fp-DD for qemu-devel@nongnu.org; Mon, 22 Oct 2012 05:24:28 -0400 Received: from /spool/local by e28smtp01.in.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Mon, 22 Oct 2012 14:54:24 +0530 Received: from d28av01.in.ibm.com (d28av01.in.ibm.com [9.184.220.63]) by d28relay02.in.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id q9M9OMIt38273266 for ; Mon, 22 Oct 2012 14:54:23 +0530 Received: from d28av01.in.ibm.com (loopback [127.0.0.1]) by d28av01.in.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id q9MEsE1T028598 for ; Mon, 22 Oct 2012 14:54:15 GMT From: Liu Ping Fan Date: Mon, 22 Oct 2012 17:23:53 +0800 Message-Id: <1350897839-29593-11-git-send-email-pingfank@linux.vnet.ibm.com> In-Reply-To: <1350897839-29593-1-git-send-email-pingfank@linux.vnet.ibm.com> References: <1350897839-29593-1-git-send-email-pingfank@linux.vnet.ibm.com> Subject: [Qemu-devel] [patch v4 10/16] memory: introduce lock ops for MemoryRegionOps List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Stefan Hajnoczi , Marcelo Tosatti , Avi Kivity , Anthony Liguori , Jan Kiszka , Paolo Bonzini This can help memory core to use mr's fine lock to mmio dispatch. Signed-off-by: Liu Ping Fan --- 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