From nobody Wed Oct 22 13:04:28 2025 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1520737486802687.884686989696; Sat, 10 Mar 2018 19:04:46 -0800 (PST) Received: from localhost ([::1]:52758 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eurHx-0005Wc-RF for importer@patchew.org; Sat, 10 Mar 2018 22:04:45 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:58602) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1eurFm-0004DF-5j for qemu-devel@nongnu.org; Sat, 10 Mar 2018 22:02:31 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1eurFl-00025h-1Q for qemu-devel@nongnu.org; Sat, 10 Mar 2018 22:02:30 -0500 Received: from mga04.intel.com ([192.55.52.120]:52978) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1eurFk-00023F-N1 for qemu-devel@nongnu.org; Sat, 10 Mar 2018 22:02:28 -0500 Received: from orsmga006.jf.intel.com ([10.7.209.51]) by fmsmga104.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 10 Mar 2018 19:02:28 -0800 Received: from hz-desktop.sh.intel.com (HELO localhost) ([10.239.13.35]) by orsmga006.jf.intel.com with ESMTP; 10 Mar 2018 19:02:25 -0800 X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.47,453,1515484800"; d="scan'208";a="24605797" From: Haozhong Zhang To: qemu-devel@nongnu.org Date: Sun, 11 Mar 2018 11:02:12 +0800 Message-Id: <20180311030215.11488-3-haozhong.zhang@intel.com> X-Mailer: git-send-email 2.14.1 In-Reply-To: <20180311030215.11488-1-haozhong.zhang@intel.com> References: <20180311030215.11488-1-haozhong.zhang@intel.com> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 192.55.52.120 Subject: [Qemu-devel] [PATCH v6 2/5] qmp: distinguish PC-DIMM and NVDIMM in MemoryDeviceInfoList X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Haozhong Zhang , Xiao Guangrong , mst@redhat.com, Markus Armbruster , Eduardo Habkost , dgilbert@redhat.com, Stefan Hajnoczi , Paolo Bonzini , Marcel Apfelbaum , Igor Mammedov , Dan Williams , Richard Henderson Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" It may need to treat PC-DIMM and NVDIMM differently, e.g., when deciding the necessity of non-volatile flag bit in SRAT memory affinity structures. A new field 'nvdimm' is added to the union type MemoryDeviceInfo for such purpose. Its type is currently PCDIMMDeviceInfo and will be updated when necessary in the future. It also fixes "info memory-devices"/query-memory-devices which currently show nvdimm devices as dimm devices since object_dynamic_cast(obj, TYPE_PC_DIMM) happily cast nvdimm to TYPE_PC_DIMM which it's been inherited from. Signed-off-by: Haozhong Zhang Reviewed-by: Eric Blake Reviewed-by: Igor Mammedov --- hmp.c | 14 +++++++++++--- hw/mem/pc-dimm.c | 10 +++++++++- numa.c | 19 +++++++++++++------ qapi/misc.json | 6 +++++- 4 files changed, 38 insertions(+), 11 deletions(-) diff --git a/hmp.c b/hmp.c index 016cb5c4f1..011a7c6f35 100644 --- a/hmp.c +++ b/hmp.c @@ -2421,7 +2421,18 @@ void hmp_info_memory_devices(Monitor *mon, const QDi= ct *qdict) switch (value->type) { case MEMORY_DEVICE_INFO_KIND_DIMM: di =3D value->u.dimm.data; + break; + + case MEMORY_DEVICE_INFO_KIND_NVDIMM: + di =3D value->u.nvdimm.data; + break; + + default: + di =3D NULL; + break; + } =20 + if (di) { monitor_printf(mon, "Memory device [%s]: \"%s\"\n", MemoryDeviceInfoKind_str(value->type), di->id ? di->id : ""); @@ -2434,9 +2445,6 @@ void hmp_info_memory_devices(Monitor *mon, const QDic= t *qdict) di->hotplugged ? "true" : "false"); monitor_printf(mon, " hotpluggable: %s\n", di->hotpluggable ? "true" : "false"); - break; - default: - break; } } } diff --git a/hw/mem/pc-dimm.c b/hw/mem/pc-dimm.c index 4d050fe2cd..51350d9c2d 100644 --- a/hw/mem/pc-dimm.c +++ b/hw/mem/pc-dimm.c @@ -20,6 +20,7 @@ =20 #include "qemu/osdep.h" #include "hw/mem/pc-dimm.h" +#include "hw/mem/nvdimm.h" #include "qapi/error.h" #include "qemu/config-file.h" #include "qapi/visitor.h" @@ -250,6 +251,7 @@ MemoryDeviceInfoList *qmp_pc_dimm_device_list(void) MemoryDeviceInfoList *elem =3D g_new0(MemoryDeviceInfoList, 1); MemoryDeviceInfo *info =3D g_new0(MemoryDeviceInfo, 1); PCDIMMDeviceInfo *di =3D g_new0(PCDIMMDeviceInfo, 1); + bool is_nvdimm =3D object_dynamic_cast(obj, TYPE_NVDIMM); DeviceClass *dc =3D DEVICE_GET_CLASS(obj); DeviceState *dev =3D DEVICE(obj); =20 @@ -265,7 +267,13 @@ MemoryDeviceInfoList *qmp_pc_dimm_device_list(void) di->size =3D object_property_get_uint(obj, PC_DIMM_SIZE_PROP, NULL= ); di->memdev =3D object_get_canonical_path(OBJECT(dimm->hostmem)); =20 - info->u.dimm.data =3D di; + if (!is_nvdimm) { + info->u.dimm.data =3D di; + info->type =3D MEMORY_DEVICE_INFO_KIND_DIMM; + } else { + info->u.nvdimm.data =3D di; + info->type =3D MEMORY_DEVICE_INFO_KIND_NVDIMM; + } elem->value =3D info; elem->next =3D NULL; if (prev) { diff --git a/numa.c b/numa.c index 94427046ec..1116c90af9 100644 --- a/numa.c +++ b/numa.c @@ -529,18 +529,25 @@ static void numa_stat_memory_devices(NumaNodeMem node= _mem[]) =20 if (value) { switch (value->type) { - case MEMORY_DEVICE_INFO_KIND_DIMM: { + case MEMORY_DEVICE_INFO_KIND_DIMM: pcdimm_info =3D value->u.dimm.data; + break; + + case MEMORY_DEVICE_INFO_KIND_NVDIMM: + pcdimm_info =3D value->u.nvdimm.data; + break; + + default: + pcdimm_info =3D NULL; + break; + } + + if (pcdimm_info) { node_mem[pcdimm_info->node].node_mem +=3D pcdimm_info->siz= e; if (pcdimm_info->hotpluggable && pcdimm_info->hotplugged) { node_mem[pcdimm_info->node].node_plugged_mem +=3D pcdimm_info->size; } - break; - } - - default: - break; } } } diff --git a/qapi/misc.json b/qapi/misc.json index bcd5d10778..6bf082f612 100644 --- a/qapi/misc.json +++ b/qapi/misc.json @@ -2852,7 +2852,11 @@ # # Since: 2.1 ## -{ 'union': 'MemoryDeviceInfo', 'data': {'dimm': 'PCDIMMDeviceInfo'} } +{ 'union': 'MemoryDeviceInfo', + 'data': { 'dimm': 'PCDIMMDeviceInfo', + 'nvdimm': 'PCDIMMDeviceInfo' + } +} =20 ## # @query-memory-devices: --=20 2.14.1