From patchwork Mon Nov 2 09:13:22 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Xiao Guangrong X-Patchwork-Id: 538928 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 57B20140311 for ; Mon, 2 Nov 2015 20:36:47 +1100 (AEDT) Received: from localhost ([::1]:40996 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZtBXg-0002HJ-Ss for incoming@patchwork.ozlabs.org; Mon, 02 Nov 2015 04:36:44 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:57349) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZtBHm-0007yQ-7D for qemu-devel@nongnu.org; Mon, 02 Nov 2015 04:20:19 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ZtBHi-0003xy-KH for qemu-devel@nongnu.org; Mon, 02 Nov 2015 04:20:18 -0500 Received: from mga02.intel.com ([134.134.136.20]:9345) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZtBHi-0003xj-EC for qemu-devel@nongnu.org; Mon, 02 Nov 2015 04:20:14 -0500 Received: from fmsmga002.fm.intel.com ([10.253.24.26]) by orsmga101.jf.intel.com with ESMTP; 02 Nov 2015 01:19:57 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.20,234,1444719600"; d="scan'208";a="840963213" Received: from xiaoreal1.sh.intel.com (HELO xiaoreal1.sh.intel.com.sh.intel.com) ([10.239.48.79]) by fmsmga002.fm.intel.com with ESMTP; 02 Nov 2015 01:19:53 -0800 From: Xiao Guangrong To: pbonzini@redhat.com, imammedo@redhat.com Date: Mon, 2 Nov 2015 17:13:22 +0800 Message-Id: <1446455617-129562-21-git-send-email-guangrong.xiao@linux.intel.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1446455617-129562-1-git-send-email-guangrong.xiao@linux.intel.com> References: <1446455617-129562-1-git-send-email-guangrong.xiao@linux.intel.com> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 134.134.136.20 Cc: vsementsov@virtuozzo.com, Xiao Guangrong , ehabkost@redhat.com, kvm@vger.kernel.org, mst@redhat.com, gleb@kernel.org, mtosatti@redhat.com, qemu-devel@nongnu.org, stefanha@redhat.com, dan.j.williams@intel.com, rth@twiddle.net Subject: [Qemu-devel] [PATCH v7 20/35] dimm: get mapped memory region from DIMMDeviceClass->get_memory_region X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Curretly, the memory region of backed memory is directly mapped to guest's address space, however, it is not true for nvdimm device This patch let dimm device realize this fact and use DIMMDeviceClass->get_memory_region method to get the mapped memory region Current code did not check the return value of get_memory_region as it assumed the backend memory of pc-dimm is always properly initialized, we make get_memory_region internally catch the case if something is wrong Signed-off-by: Xiao Guangrong --- hw/mem/dimm.c | 3 ++- hw/mem/pc-dimm.c | 12 +++++++++++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/hw/mem/dimm.c b/hw/mem/dimm.c index 4a63409..498d380 100644 --- a/hw/mem/dimm.c +++ b/hw/mem/dimm.c @@ -377,8 +377,9 @@ static void dimm_get_size(Object *obj, Visitor *v, void *opaque, int64_t value; MemoryRegion *mr; DIMMDevice *dimm = DIMM(obj); + DIMMDeviceClass *ddc = DIMM_GET_CLASS(obj); - mr = host_memory_backend_get_memory(dimm->hostmem, errp); + mr = ddc->get_memory_region(dimm); value = memory_region_size(mr); visit_type_int(v, &value, name, errp); diff --git a/hw/mem/pc-dimm.c b/hw/mem/pc-dimm.c index 38323e9..e6b6a9f 100644 --- a/hw/mem/pc-dimm.c +++ b/hw/mem/pc-dimm.c @@ -22,7 +22,17 @@ static MemoryRegion *pc_dimm_get_memory_region(DIMMDevice *dimm) { - return host_memory_backend_get_memory(dimm->hostmem, &error_abort); + Error *local_err = NULL; + MemoryRegion *mr; + + mr = host_memory_backend_get_memory(dimm->hostmem, &local_err); + + /* + * plug a pc-dimm device whose backend memory was not properly + * initialized? + */ + assert(!local_err && mr); + return mr; } static void pc_dimm_class_init(ObjectClass *oc, void *data)