All of lore.kernel.org
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH v3 0/5] hw/acpi-build: build SRAT memory affinity structures for DIMM devices
@ 2018-03-05  6:57 Haozhong Zhang
  2018-03-05  6:57 ` [Qemu-devel] [PATCH v3 1/5] pc-dimm: refactor qmp_pc_dimm_device_list Haozhong Zhang
                   ` (4 more replies)
  0 siblings, 5 replies; 14+ messages in thread
From: Haozhong Zhang @ 2018-03-05  6:57 UTC (permalink / raw)
  To: qemu-devel
  Cc: mst, Igor Mammedov, Xiao Guangrong, Paolo Bonzini,
	Richard Henderson, Eduardo Habkost, Marcel Apfelbaum,
	Stefan Hajnoczi, Dan Williams, Haozhong Zhang, dgilbert,
	David Gibson, Alexander Graf, Eric Blake, Markus Armbruster,
	qemu-ppc

ACPI 6.2A Table 5-129 "SPA Range Structure" requires the proximity
domain of a NVDIMM SPA range must match with corresponding entry in
SRAT table.

The address ranges of vNVDIMM in QEMU are allocated from the
hot-pluggable address space, which is entirely covered by one SRAT
memory affinity structure. However, users can set the vNVDIMM
proximity domain in NFIT SPA range structure by the 'node' property of
'-device nvdimm' to a value different than the one in the above SRAT
memory affinity structure.

In order to solve such proximity domain mismatch, this patch builds
one SRAT memory affinity structure for each DIMM device present at
boot time, including both PC-DIMM and NVDIMM, with the proximity
domain specified in '-device pc-dimm' or '-device nvdimm'.

The remaining hot-pluggable address space is covered by one or multiple
SRAT memory affinity structures with the proximity domain of the last
node as before.


Changes in v3:
 * (Patch 1&2) Use qmp_pc_dimm_device_list to get information of DIMM
   devices and move it to separate patches.
 * (Patch 3) Replace while loop by a more readable for loop.
 * (Patch 3) Refactor the flag setting code.
 * (Patch 3) s/'static-plugged'/'present at boot time' in commit message.

Changes in v2:
 * Build SRAT memory affinity structures of PC-DIMM devices as well.
 * Add test cases.


Haozhong Zhang (5):
  pc-dimm: refactor qmp_pc_dimm_device_list
  qmp: distinguish PC-DIMM and NVDIMM in MemoryDeviceInfoList
  hw/acpi-build: build SRAT memory affinity structures for DIMM devices
  tests/bios-tables-test: allow setting extra machine options
  tests/bios-tables-test: add test cases for DIMM proximity

 hmp.c                                 |  14 +++--
 hw/i386/acpi-build.c                  |  60 +++++++++++++++++++--
 hw/mem/pc-dimm.c                      |  99 ++++++++++++++++++++--------------
 hw/ppc/spapr.c                        |   3 +-
 include/hw/mem/pc-dimm.h              |   2 +-
 numa.c                                |  23 ++++----
 qapi-schema.json                      |  18 ++++++-
 qmp.c                                 |   7 +--
 stubs/qmp_pc_dimm.c                   |   4 +-
 tests/acpi-test-data/pc/APIC.dimmpxm  | Bin 0 -> 136 bytes
 tests/acpi-test-data/pc/DSDT.dimmpxm  | Bin 0 -> 6710 bytes
 tests/acpi-test-data/pc/NFIT.dimmpxm  | Bin 0 -> 224 bytes
 tests/acpi-test-data/pc/SRAT.dimmpxm  | Bin 0 -> 416 bytes
 tests/acpi-test-data/pc/SSDT.dimmpxm  | Bin 0 -> 685 bytes
 tests/acpi-test-data/q35/APIC.dimmpxm | Bin 0 -> 136 bytes
 tests/acpi-test-data/q35/DSDT.dimmpxm | Bin 0 -> 9394 bytes
 tests/acpi-test-data/q35/NFIT.dimmpxm | Bin 0 -> 224 bytes
 tests/acpi-test-data/q35/SRAT.dimmpxm | Bin 0 -> 416 bytes
 tests/acpi-test-data/q35/SSDT.dimmpxm | Bin 0 -> 685 bytes
 tests/bios-tables-test.c              |  78 +++++++++++++++++++++------
 20 files changed, 225 insertions(+), 83 deletions(-)
 create mode 100644 tests/acpi-test-data/pc/APIC.dimmpxm
 create mode 100644 tests/acpi-test-data/pc/DSDT.dimmpxm
 create mode 100644 tests/acpi-test-data/pc/NFIT.dimmpxm
 create mode 100644 tests/acpi-test-data/pc/SRAT.dimmpxm
 create mode 100644 tests/acpi-test-data/pc/SSDT.dimmpxm
 create mode 100644 tests/acpi-test-data/q35/APIC.dimmpxm
 create mode 100644 tests/acpi-test-data/q35/DSDT.dimmpxm
 create mode 100644 tests/acpi-test-data/q35/NFIT.dimmpxm
 create mode 100644 tests/acpi-test-data/q35/SRAT.dimmpxm
 create mode 100644 tests/acpi-test-data/q35/SSDT.dimmpxm

-- 
2.14.1

^ permalink raw reply	[flat|nested] 14+ messages in thread

* [Qemu-devel] [PATCH v3 1/5] pc-dimm: refactor qmp_pc_dimm_device_list
  2018-03-05  6:57 [Qemu-devel] [PATCH v3 0/5] hw/acpi-build: build SRAT memory affinity structures for DIMM devices Haozhong Zhang
@ 2018-03-05  6:57 ` Haozhong Zhang
  2018-03-07 10:10   ` Igor Mammedov
  2018-03-05  6:57 ` [Qemu-devel] [PATCH v3 2/5] qmp: distinguish PC-DIMM and NVDIMM in MemoryDeviceInfoList Haozhong Zhang
                   ` (3 subsequent siblings)
  4 siblings, 1 reply; 14+ messages in thread
From: Haozhong Zhang @ 2018-03-05  6:57 UTC (permalink / raw)
  To: qemu-devel
  Cc: mst, Igor Mammedov, Xiao Guangrong, Paolo Bonzini,
	Richard Henderson, Eduardo Habkost, Marcel Apfelbaum,
	Stefan Hajnoczi, Dan Williams, Haozhong Zhang, David Gibson,
	Alexander Graf, Markus Armbruster, Bharata B Rao, qemu-ppc

Use pc_dimm_built_list to hide recursive callbacks from callers.

Signed-off-by: Haozhong Zhang <haozhong.zhang@intel.com>
---
 hw/mem/pc-dimm.c         | 83 +++++++++++++++++++++++++-----------------------
 hw/ppc/spapr.c           |  3 +-
 include/hw/mem/pc-dimm.h |  2 +-
 numa.c                   |  4 +--
 qmp.c                    |  7 +---
 stubs/qmp_pc_dimm.c      |  4 +--
 6 files changed, 50 insertions(+), 53 deletions(-)

diff --git a/hw/mem/pc-dimm.c b/hw/mem/pc-dimm.c
index 6e74b61cb6..4d050fe2cd 100644
--- a/hw/mem/pc-dimm.c
+++ b/hw/mem/pc-dimm.c
@@ -162,45 +162,6 @@ uint64_t get_plugged_memory_size(void)
     return pc_existing_dimms_capacity(&error_abort);
 }
 
-int qmp_pc_dimm_device_list(Object *obj, void *opaque)
-{
-    MemoryDeviceInfoList ***prev = opaque;
-
-    if (object_dynamic_cast(obj, TYPE_PC_DIMM)) {
-        DeviceState *dev = DEVICE(obj);
-
-        if (dev->realized) {
-            MemoryDeviceInfoList *elem = g_new0(MemoryDeviceInfoList, 1);
-            MemoryDeviceInfo *info = g_new0(MemoryDeviceInfo, 1);
-            PCDIMMDeviceInfo *di = g_new0(PCDIMMDeviceInfo, 1);
-            DeviceClass *dc = DEVICE_GET_CLASS(obj);
-            PCDIMMDevice *dimm = PC_DIMM(obj);
-
-            if (dev->id) {
-                di->has_id = true;
-                di->id = g_strdup(dev->id);
-            }
-            di->hotplugged = dev->hotplugged;
-            di->hotpluggable = dc->hotpluggable;
-            di->addr = dimm->addr;
-            di->slot = dimm->slot;
-            di->node = dimm->node;
-            di->size = object_property_get_uint(OBJECT(dimm), PC_DIMM_SIZE_PROP,
-                                                NULL);
-            di->memdev = object_get_canonical_path(OBJECT(dimm->hostmem));
-
-            info->u.dimm.data = di;
-            elem->value = info;
-            elem->next = NULL;
-            **prev = elem;
-            *prev = &elem->next;
-        }
-    }
-
-    object_child_foreach(obj, qmp_pc_dimm_device_list, opaque);
-    return 0;
-}
-
 static int pc_dimm_slot2bitmap(Object *obj, void *opaque)
 {
     unsigned long *bitmap = opaque;
@@ -276,6 +237,50 @@ static int pc_dimm_built_list(Object *obj, void *opaque)
     return 0;
 }
 
+MemoryDeviceInfoList *qmp_pc_dimm_device_list(void)
+{
+    GSList *dimms = NULL, *item;
+    MemoryDeviceInfoList *list = NULL, *prev = NULL;
+
+    object_child_foreach(qdev_get_machine(), pc_dimm_built_list, &dimms);
+
+    for (item = dimms; item; item = g_slist_next(item)) {
+        PCDIMMDevice *dimm = PC_DIMM(item->data);
+        Object *obj = OBJECT(dimm);
+        MemoryDeviceInfoList *elem = g_new0(MemoryDeviceInfoList, 1);
+        MemoryDeviceInfo *info = g_new0(MemoryDeviceInfo, 1);
+        PCDIMMDeviceInfo *di = g_new0(PCDIMMDeviceInfo, 1);
+        DeviceClass *dc = DEVICE_GET_CLASS(obj);
+        DeviceState *dev = DEVICE(obj);
+
+        if (dev->id) {
+            di->has_id = true;
+            di->id = g_strdup(dev->id);
+        }
+        di->hotplugged = dev->hotplugged;
+        di->hotpluggable = dc->hotpluggable;
+        di->addr = dimm->addr;
+        di->slot = dimm->slot;
+        di->node = dimm->node;
+        di->size = object_property_get_uint(obj, PC_DIMM_SIZE_PROP, NULL);
+        di->memdev = object_get_canonical_path(OBJECT(dimm->hostmem));
+
+        info->u.dimm.data = di;
+        elem->value = info;
+        elem->next = NULL;
+        if (prev) {
+            prev->next = elem;
+        } else {
+            list = elem;
+        }
+        prev = elem;
+    }
+
+    g_slist_free(dimms);
+
+    return list;
+}
+
 uint64_t pc_dimm_get_free_addr(uint64_t address_space_start,
                                uint64_t address_space_size,
                                uint64_t *hint, uint64_t align, uint64_t size,
diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
index 83c9d66dd5..68a81e47d2 100644
--- a/hw/ppc/spapr.c
+++ b/hw/ppc/spapr.c
@@ -731,8 +731,7 @@ static int spapr_populate_drconf_memory(sPAPRMachineState *spapr, void *fdt)
     }
 
     if (hotplug_lmb_start) {
-        MemoryDeviceInfoList **prev = &dimms;
-        qmp_pc_dimm_device_list(qdev_get_machine(), &prev);
+        dimms = qmp_pc_dimm_device_list();
     }
 
     /* ibm,dynamic-memory */
diff --git a/include/hw/mem/pc-dimm.h b/include/hw/mem/pc-dimm.h
index d83b957829..1fc479281c 100644
--- a/include/hw/mem/pc-dimm.h
+++ b/include/hw/mem/pc-dimm.h
@@ -93,7 +93,7 @@ uint64_t pc_dimm_get_free_addr(uint64_t address_space_start,
 
 int pc_dimm_get_free_slot(const int *hint, int max_slots, Error **errp);
 
-int qmp_pc_dimm_device_list(Object *obj, void *opaque);
+MemoryDeviceInfoList *qmp_pc_dimm_device_list(void);
 uint64_t pc_existing_dimms_capacity(Error **errp);
 uint64_t get_plugged_memory_size(void);
 void pc_dimm_memory_plug(DeviceState *dev, MemoryHotplugState *hpms,
diff --git a/numa.c b/numa.c
index 7e0e789b02..c6734ceb8c 100644
--- a/numa.c
+++ b/numa.c
@@ -520,12 +520,10 @@ void memory_region_allocate_system_memory(MemoryRegion *mr, Object *owner,
 
 static void numa_stat_memory_devices(NumaNodeMem node_mem[])
 {
-    MemoryDeviceInfoList *info_list = NULL;
-    MemoryDeviceInfoList **prev = &info_list;
+    MemoryDeviceInfoList *info_list = qmp_pc_dimm_device_list();
     MemoryDeviceInfoList *info;
     PCDIMMDeviceInfo     *pcdimm_info;
 
-    qmp_pc_dimm_device_list(qdev_get_machine(), &prev);
     for (info = info_list; info; info = info->next) {
         MemoryDeviceInfo *value = info->value;
 
diff --git a/qmp.c b/qmp.c
index 793f6f3323..c6ac7b05b4 100644
--- a/qmp.c
+++ b/qmp.c
@@ -680,12 +680,7 @@ void qmp_object_del(const char *id, Error **errp)
 
 MemoryDeviceInfoList *qmp_query_memory_devices(Error **errp)
 {
-    MemoryDeviceInfoList *head = NULL;
-    MemoryDeviceInfoList **prev = &head;
-
-    qmp_pc_dimm_device_list(qdev_get_machine(), &prev);
-
-    return head;
+    return qmp_pc_dimm_device_list();
 }
 
 ACPIOSTInfoList *qmp_query_acpi_ospm_status(Error **errp)
diff --git a/stubs/qmp_pc_dimm.c b/stubs/qmp_pc_dimm.c
index 9ddc4f619a..b6b2cca89e 100644
--- a/stubs/qmp_pc_dimm.c
+++ b/stubs/qmp_pc_dimm.c
@@ -2,9 +2,9 @@
 #include "qom/object.h"
 #include "hw/mem/pc-dimm.h"
 
-int qmp_pc_dimm_device_list(Object *obj, void *opaque)
+MemoryDeviceInfoList *qmp_pc_dimm_device_list(void)
 {
-   return 0;
+   return NULL;
 }
 
 uint64_t get_plugged_memory_size(void)
-- 
2.14.1

^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [Qemu-devel] [PATCH v3 2/5] qmp: distinguish PC-DIMM and NVDIMM in MemoryDeviceInfoList
  2018-03-05  6:57 [Qemu-devel] [PATCH v3 0/5] hw/acpi-build: build SRAT memory affinity structures for DIMM devices Haozhong Zhang
  2018-03-05  6:57 ` [Qemu-devel] [PATCH v3 1/5] pc-dimm: refactor qmp_pc_dimm_device_list Haozhong Zhang
@ 2018-03-05  6:57 ` Haozhong Zhang
  2018-03-05 19:14   ` Eric Blake
  2018-03-07 10:21   ` Igor Mammedov
  2018-03-05  6:57 ` [Qemu-devel] [PATCH v3 3/5] hw/acpi-build: build SRAT memory affinity structures for DIMM devices Haozhong Zhang
                   ` (2 subsequent siblings)
  4 siblings, 2 replies; 14+ messages in thread
From: Haozhong Zhang @ 2018-03-05  6:57 UTC (permalink / raw)
  To: qemu-devel
  Cc: mst, Igor Mammedov, Xiao Guangrong, Paolo Bonzini,
	Richard Henderson, Eduardo Habkost, Marcel Apfelbaum,
	Stefan Hajnoczi, Dan Williams, Haozhong Zhang, Eric Blake,
	Markus Armbruster, dgilbert

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.

NVDIMMDeviceInfo, which inherits from PCDIMMDeviceInfo, is added to
union type MemoryDeviceInfo to record information of NVDIMM devices.
The NVDIMM-specific data is currently left empty and will be filled
when necessary in the future.

Signed-off-by: Haozhong Zhang <haozhong.zhang@intel.com>
---
 hmp.c            | 14 +++++++++++---
 hw/mem/pc-dimm.c | 20 ++++++++++++++++++--
 numa.c           | 19 +++++++++++++------
 qapi-schema.json | 18 +++++++++++++++++-
 4 files changed, 59 insertions(+), 12 deletions(-)

diff --git a/hmp.c b/hmp.c
index ae86bfbade..3f06407c5e 100644
--- a/hmp.c
+++ b/hmp.c
@@ -2413,7 +2413,18 @@ void hmp_info_memory_devices(Monitor *mon, const QDict *qdict)
             switch (value->type) {
             case MEMORY_DEVICE_INFO_KIND_DIMM:
                 di = value->u.dimm.data;
+                break;
+
+            case MEMORY_DEVICE_INFO_KIND_NVDIMM:
+                di = qapi_NVDIMMDeviceInfo_base(value->u.nvdimm.data);
+                break;
+
+            default:
+                di = NULL;
+                break;
+            }
 
+            if (di) {
                 monitor_printf(mon, "Memory device [%s]: \"%s\"\n",
                                MemoryDeviceInfoKind_str(value->type),
                                di->id ? di->id : "");
@@ -2426,9 +2437,6 @@ void hmp_info_memory_devices(Monitor *mon, const QDict *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..866ecc699a 100644
--- a/hw/mem/pc-dimm.c
+++ b/hw/mem/pc-dimm.c
@@ -20,6 +20,7 @@
 
 #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"
@@ -249,10 +250,19 @@ MemoryDeviceInfoList *qmp_pc_dimm_device_list(void)
         Object *obj = OBJECT(dimm);
         MemoryDeviceInfoList *elem = g_new0(MemoryDeviceInfoList, 1);
         MemoryDeviceInfo *info = g_new0(MemoryDeviceInfo, 1);
-        PCDIMMDeviceInfo *di = g_new0(PCDIMMDeviceInfo, 1);
+        PCDIMMDeviceInfo *di;
+        NVDIMMDeviceInfo *ndi;
+        bool is_nvdimm = object_dynamic_cast(obj, TYPE_NVDIMM);
         DeviceClass *dc = DEVICE_GET_CLASS(obj);
         DeviceState *dev = DEVICE(obj);
 
+        if (!is_nvdimm) {
+            di = g_new0(PCDIMMDeviceInfo, 1);
+        } else {
+            ndi = g_new0(NVDIMMDeviceInfo, 1);
+            di = qapi_NVDIMMDeviceInfo_base(ndi);
+        }
+
         if (dev->id) {
             di->has_id = true;
             di->id = g_strdup(dev->id);
@@ -265,7 +275,13 @@ MemoryDeviceInfoList *qmp_pc_dimm_device_list(void)
         di->size = object_property_get_uint(obj, PC_DIMM_SIZE_PROP, NULL);
         di->memdev = object_get_canonical_path(OBJECT(dimm->hostmem));
 
-        info->u.dimm.data = di;
+        if (!is_nvdimm) {
+            info->u.dimm.data = di;
+            info->type = MEMORY_DEVICE_INFO_KIND_DIMM;
+        } else {
+            info->u.nvdimm.data = ndi;
+            info->type = MEMORY_DEVICE_INFO_KIND_NVDIMM;
+        }
         elem->value = info;
         elem->next = NULL;
         if (prev) {
diff --git a/numa.c b/numa.c
index c6734ceb8c..23c4371e51 100644
--- a/numa.c
+++ b/numa.c
@@ -529,18 +529,25 @@ static void numa_stat_memory_devices(NumaNodeMem node_mem[])
 
         if (value) {
             switch (value->type) {
-            case MEMORY_DEVICE_INFO_KIND_DIMM: {
+            case MEMORY_DEVICE_INFO_KIND_DIMM:
                 pcdimm_info = value->u.dimm.data;
+                break;
+
+            case MEMORY_DEVICE_INFO_KIND_NVDIMM:
+                pcdimm_info = qapi_NVDIMMDeviceInfo_base(value->u.nvdimm.data);
+                break;
+
+            default:
+                pcdimm_info = NULL;
+                break;
+            }
+
+            if (pcdimm_info) {
                 node_mem[pcdimm_info->node].node_mem += pcdimm_info->size;
                 if (pcdimm_info->hotpluggable && pcdimm_info->hotplugged) {
                     node_mem[pcdimm_info->node].node_plugged_mem +=
                         pcdimm_info->size;
                 }
-                break;
-            }
-
-            default:
-                break;
             }
         }
     }
diff --git a/qapi-schema.json b/qapi-schema.json
index cd98a94388..1c2d281749 100644
--- a/qapi-schema.json
+++ b/qapi-schema.json
@@ -2920,6 +2920,18 @@
           }
 }
 
+##
+# @NVDIMMDeviceInfo:
+#
+# NVDIMMDevice state information
+#
+# Since: 2.12
+##
+{ 'struct': 'NVDIMMDeviceInfo',
+  'base': 'PCDIMMDeviceInfo',
+  'data': {}
+}
+
 ##
 # @MemoryDeviceInfo:
 #
@@ -2927,7 +2939,11 @@
 #
 # Since: 2.1
 ##
-{ 'union': 'MemoryDeviceInfo', 'data': {'dimm': 'PCDIMMDeviceInfo'} }
+{ 'union': 'MemoryDeviceInfo',
+  'data': { 'dimm': 'PCDIMMDeviceInfo',
+            'nvdimm': 'NVDIMMDeviceInfo'
+          }
+}
 
 ##
 # @query-memory-devices:
-- 
2.14.1

^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [Qemu-devel] [PATCH v3 3/5] hw/acpi-build: build SRAT memory affinity structures for DIMM devices
  2018-03-05  6:57 [Qemu-devel] [PATCH v3 0/5] hw/acpi-build: build SRAT memory affinity structures for DIMM devices Haozhong Zhang
  2018-03-05  6:57 ` [Qemu-devel] [PATCH v3 1/5] pc-dimm: refactor qmp_pc_dimm_device_list Haozhong Zhang
  2018-03-05  6:57 ` [Qemu-devel] [PATCH v3 2/5] qmp: distinguish PC-DIMM and NVDIMM in MemoryDeviceInfoList Haozhong Zhang
@ 2018-03-05  6:57 ` Haozhong Zhang
  2018-03-07 10:30   ` Igor Mammedov
  2018-03-05  6:57 ` [Qemu-devel] [PATCH v3 4/5] tests/bios-tables-test: allow setting extra machine options Haozhong Zhang
  2018-03-05  6:57 ` [Qemu-devel] [PATCH v3 5/5] tests/bios-tables-test: add test cases for DIMM proximity Haozhong Zhang
  4 siblings, 1 reply; 14+ messages in thread
From: Haozhong Zhang @ 2018-03-05  6:57 UTC (permalink / raw)
  To: qemu-devel
  Cc: mst, Igor Mammedov, Xiao Guangrong, Paolo Bonzini,
	Richard Henderson, Eduardo Habkost, Marcel Apfelbaum,
	Stefan Hajnoczi, Dan Williams, Haozhong Zhang

ACPI 6.2A Table 5-129 "SPA Range Structure" requires the proximity
domain of a NVDIMM SPA range must match with corresponding entry in
SRAT table.

The address ranges of vNVDIMM in QEMU are allocated from the
hot-pluggable address space, which is entirely covered by one SRAT
memory affinity structure. However, users can set the vNVDIMM
proximity domain in NFIT SPA range structure by the 'node' property of
'-device nvdimm' to a value different than the one in the above SRAT
memory affinity structure.

In order to solve such proximity domain mismatch, this patch builds
one SRAT memory affinity structure for each DIMM device present at
boot time, including both PC-DIMM and NVDIMM, with the proximity
domain specified in '-device pc-dimm' or '-device nvdimm'.

The remaining hot-pluggable address space is covered by one or multiple
SRAT memory affinity structures with the proximity domain of the last
node as before.

Signed-off-by: Haozhong Zhang <haozhong.zhang@intel.com>
---
 hw/i386/acpi-build.c | 60 ++++++++++++++++++++++++++++++++++++++++++++++++----
 1 file changed, 56 insertions(+), 4 deletions(-)

diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c
index deb440f286..2ca0317386 100644
--- a/hw/i386/acpi-build.c
+++ b/hw/i386/acpi-build.c
@@ -2323,6 +2323,59 @@ build_tpm2(GArray *table_data, BIOSLinker *linker, GArray *tcpalog)
 #define HOLE_640K_START  (640 * 1024)
 #define HOLE_640K_END   (1024 * 1024)
 
+static void build_srat_hotpluggable_memory(GArray *table_data, uint64_t base,
+                                           uint64_t len, int default_node)
+{
+    MemoryDeviceInfoList *info_list = qmp_pc_dimm_device_list();
+    MemoryDeviceInfoList *info;
+    MemoryDeviceInfo *mi;
+    PCDIMMDeviceInfo *di;
+    uint64_t end = base + len, cur, addr, size;
+    int node;
+    bool is_nvdimm;
+    AcpiSratMemoryAffinity *numamem;
+    MemoryAffinityFlags flags;
+
+    for (cur = base, info = info_list;
+         cur < end;
+         cur += size, info = info->next) {
+        numamem = acpi_data_push(table_data, sizeof *numamem);
+
+        if (!info) {
+            build_srat_memory(numamem, cur, end - cur, default_node,
+                              MEM_AFFINITY_HOTPLUGGABLE | MEM_AFFINITY_ENABLED);
+            break;
+        }
+
+        mi = info->value;
+        is_nvdimm = (mi->type == MEMORY_DEVICE_INFO_KIND_NVDIMM);
+        di = !is_nvdimm ? mi->u.dimm.data :
+                          qapi_NVDIMMDeviceInfo_base(mi->u.nvdimm.data);
+
+        addr = di->addr;
+        if (cur < addr) {
+            build_srat_memory(numamem, cur, addr - cur, default_node,
+                              MEM_AFFINITY_HOTPLUGGABLE | MEM_AFFINITY_ENABLED);
+            numamem = acpi_data_push(table_data, sizeof *numamem);
+        }
+
+        size = di->size;
+        node = di->node;
+
+        flags = MEM_AFFINITY_ENABLED;
+        if (di->hotpluggable) {
+            flags |= MEM_AFFINITY_HOTPLUGGABLE;
+        }
+        if (is_nvdimm) {
+            flags |= MEM_AFFINITY_NON_VOLATILE;
+        }
+
+        build_srat_memory(numamem, addr, size, node, flags);
+    }
+
+    qapi_free_MemoryDeviceInfoList(info_list);
+}
+
 static void
 build_srat(GArray *table_data, BIOSLinker *linker, MachineState *machine)
 {
@@ -2434,10 +2487,9 @@ build_srat(GArray *table_data, BIOSLinker *linker, MachineState *machine)
      * providing _PXM method if necessary.
      */
     if (hotplugabble_address_space_size) {
-        numamem = acpi_data_push(table_data, sizeof *numamem);
-        build_srat_memory(numamem, pcms->hotplug_memory.base,
-                          hotplugabble_address_space_size, pcms->numa_nodes - 1,
-                          MEM_AFFINITY_HOTPLUGGABLE | MEM_AFFINITY_ENABLED);
+        build_srat_hotpluggable_memory(table_data, pcms->hotplug_memory.base,
+                                       hotplugabble_address_space_size,
+                                       pcms->numa_nodes - 1);
     }
 
     build_header(linker, table_data,
-- 
2.14.1

^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [Qemu-devel] [PATCH v3 4/5] tests/bios-tables-test: allow setting extra machine options
  2018-03-05  6:57 [Qemu-devel] [PATCH v3 0/5] hw/acpi-build: build SRAT memory affinity structures for DIMM devices Haozhong Zhang
                   ` (2 preceding siblings ...)
  2018-03-05  6:57 ` [Qemu-devel] [PATCH v3 3/5] hw/acpi-build: build SRAT memory affinity structures for DIMM devices Haozhong Zhang
@ 2018-03-05  6:57 ` Haozhong Zhang
  2018-03-07 10:40   ` Igor Mammedov
  2018-03-05  6:57 ` [Qemu-devel] [PATCH v3 5/5] tests/bios-tables-test: add test cases for DIMM proximity Haozhong Zhang
  4 siblings, 1 reply; 14+ messages in thread
From: Haozhong Zhang @ 2018-03-05  6:57 UTC (permalink / raw)
  To: qemu-devel
  Cc: mst, Igor Mammedov, Xiao Guangrong, Paolo Bonzini,
	Richard Henderson, Eduardo Habkost, Marcel Apfelbaum,
	Stefan Hajnoczi, Dan Williams, Haozhong Zhang

Some test cases may require extra machine options than those used in
the current test_acpi_ones(), e.g., nvdimm test cases require the
machine option 'nvdimm=on'.

Signed-off-by: Haozhong Zhang <haozhong.zhang@intel.com>
---
 tests/bios-tables-test.c | 45 +++++++++++++++++++++++++++++----------------
 1 file changed, 29 insertions(+), 16 deletions(-)

diff --git a/tests/bios-tables-test.c b/tests/bios-tables-test.c
index 65b271a173..d45181aa51 100644
--- a/tests/bios-tables-test.c
+++ b/tests/bios-tables-test.c
@@ -654,17 +654,22 @@ static void test_smbios_structs(test_data *data)
     }
 }
 
-static void test_acpi_one(const char *params, test_data *data)
+static void test_acpi_one(const char *extra_machine_opts,
+                          const char *params, test_data *data)
 {
     char *args;
 
     /* Disable kernel irqchip to be able to override apic irq0. */
-    args = g_strdup_printf("-machine %s,accel=%s,kernel-irqchip=off "
+    args = g_strdup_printf("-machine %s,accel=%s,kernel-irqchip=off",
+                           data->machine, "kvm:tcg");
+    if (extra_machine_opts) {
+        args = g_strdup_printf("%s,%s", args, extra_machine_opts);
+    }
+    args = g_strdup_printf("%s "
                            "-net none -display none %s "
                            "-drive id=hd0,if=none,file=%s,format=raw "
                            "-device ide-hd,drive=hd0 ",
-                           data->machine, "kvm:tcg",
-                           params ? params : "", disk);
+                           args, params ? params : "", disk);
 
     qtest_start(args);
 
@@ -711,7 +716,7 @@ static void test_acpi_piix4_tcg(void)
     data.machine = MACHINE_PC;
     data.required_struct_types = base_required_struct_types;
     data.required_struct_types_len = ARRAY_SIZE(base_required_struct_types);
-    test_acpi_one(NULL, &data);
+    test_acpi_one(NULL, NULL, &data);
     free_test_data(&data);
 }
 
@@ -724,7 +729,7 @@ static void test_acpi_piix4_tcg_bridge(void)
     data.variant = ".bridge";
     data.required_struct_types = base_required_struct_types;
     data.required_struct_types_len = ARRAY_SIZE(base_required_struct_types);
-    test_acpi_one("-device pci-bridge,chassis_nr=1", &data);
+    test_acpi_one(NULL, "-device pci-bridge,chassis_nr=1", &data);
     free_test_data(&data);
 }
 
@@ -736,7 +741,7 @@ static void test_acpi_q35_tcg(void)
     data.machine = MACHINE_Q35;
     data.required_struct_types = base_required_struct_types;
     data.required_struct_types_len = ARRAY_SIZE(base_required_struct_types);
-    test_acpi_one(NULL, &data);
+    test_acpi_one(NULL, NULL, &data);
     free_test_data(&data);
 }
 
@@ -749,7 +754,7 @@ static void test_acpi_q35_tcg_bridge(void)
     data.variant = ".bridge";
     data.required_struct_types = base_required_struct_types;
     data.required_struct_types_len = ARRAY_SIZE(base_required_struct_types);
-    test_acpi_one("-device pci-bridge,chassis_nr=1",
+    test_acpi_one(NULL, "-device pci-bridge,chassis_nr=1",
                   &data);
     free_test_data(&data);
 }
@@ -761,7 +766,8 @@ static void test_acpi_piix4_tcg_cphp(void)
     memset(&data, 0, sizeof(data));
     data.machine = MACHINE_PC;
     data.variant = ".cphp";
-    test_acpi_one("-smp 2,cores=3,sockets=2,maxcpus=6"
+    test_acpi_one(NULL,
+                  "-smp 2,cores=3,sockets=2,maxcpus=6"
                   " -numa node -numa node"
                   " -numa dist,src=0,dst=1,val=21",
                   &data);
@@ -775,7 +781,8 @@ static void test_acpi_q35_tcg_cphp(void)
     memset(&data, 0, sizeof(data));
     data.machine = MACHINE_Q35;
     data.variant = ".cphp";
-    test_acpi_one(" -smp 2,cores=3,sockets=2,maxcpus=6"
+    test_acpi_one(NULL,
+                  " -smp 2,cores=3,sockets=2,maxcpus=6"
                   " -numa node -numa node"
                   " -numa dist,src=0,dst=1,val=21",
                   &data);
@@ -795,7 +802,8 @@ static void test_acpi_q35_tcg_ipmi(void)
     data.variant = ".ipmibt";
     data.required_struct_types = ipmi_required_struct_types;
     data.required_struct_types_len = ARRAY_SIZE(ipmi_required_struct_types);
-    test_acpi_one("-device ipmi-bmc-sim,id=bmc0"
+    test_acpi_one(NULL,
+                  "-device ipmi-bmc-sim,id=bmc0"
                   " -device isa-ipmi-bt,bmc=bmc0",
                   &data);
     free_test_data(&data);
@@ -813,7 +821,8 @@ static void test_acpi_piix4_tcg_ipmi(void)
     data.variant = ".ipmikcs";
     data.required_struct_types = ipmi_required_struct_types;
     data.required_struct_types_len = ARRAY_SIZE(ipmi_required_struct_types);
-    test_acpi_one("-device ipmi-bmc-sim,id=bmc0"
+    test_acpi_one(NULL,
+                  "-device ipmi-bmc-sim,id=bmc0"
                   " -device isa-ipmi-kcs,irq=0,bmc=bmc0",
                   &data);
     free_test_data(&data);
@@ -826,7 +835,8 @@ static void test_acpi_q35_tcg_memhp(void)
     memset(&data, 0, sizeof(data));
     data.machine = MACHINE_Q35;
     data.variant = ".memhp";
-    test_acpi_one(" -m 128,slots=3,maxmem=1G"
+    test_acpi_one(NULL,
+                  " -m 128,slots=3,maxmem=1G"
                   " -numa node -numa node"
                   " -numa dist,src=0,dst=1,val=21",
                   &data);
@@ -840,7 +850,8 @@ static void test_acpi_piix4_tcg_memhp(void)
     memset(&data, 0, sizeof(data));
     data.machine = MACHINE_PC;
     data.variant = ".memhp";
-    test_acpi_one(" -m 128,slots=3,maxmem=1G"
+    test_acpi_one(NULL,
+                  " -m 128,slots=3,maxmem=1G"
                   " -numa node -numa node"
                   " -numa dist,src=0,dst=1,val=21",
                   &data);
@@ -854,7 +865,8 @@ static void test_acpi_q35_tcg_numamem(void)
     memset(&data, 0, sizeof(data));
     data.machine = MACHINE_Q35;
     data.variant = ".numamem";
-    test_acpi_one(" -numa node -numa node,mem=128", &data);
+    test_acpi_one(NULL,
+                  " -numa node -numa node,mem=128", &data);
     free_test_data(&data);
 }
 
@@ -865,7 +877,8 @@ static void test_acpi_piix4_tcg_numamem(void)
     memset(&data, 0, sizeof(data));
     data.machine = MACHINE_PC;
     data.variant = ".numamem";
-    test_acpi_one(" -numa node -numa node,mem=128", &data);
+    test_acpi_one(NULL,
+                  " -numa node -numa node,mem=128", &data);
     free_test_data(&data);
 }
 
-- 
2.14.1

^ permalink raw reply related	[flat|nested] 14+ messages in thread

* [Qemu-devel] [PATCH v3 5/5] tests/bios-tables-test: add test cases for DIMM proximity
  2018-03-05  6:57 [Qemu-devel] [PATCH v3 0/5] hw/acpi-build: build SRAT memory affinity structures for DIMM devices Haozhong Zhang
                   ` (3 preceding siblings ...)
  2018-03-05  6:57 ` [Qemu-devel] [PATCH v3 4/5] tests/bios-tables-test: allow setting extra machine options Haozhong Zhang
@ 2018-03-05  6:57 ` Haozhong Zhang
  2018-03-07 12:02   ` Igor Mammedov
  4 siblings, 1 reply; 14+ messages in thread
From: Haozhong Zhang @ 2018-03-05  6:57 UTC (permalink / raw)
  To: qemu-devel
  Cc: mst, Igor Mammedov, Xiao Guangrong, Paolo Bonzini,
	Richard Henderson, Eduardo Habkost, Marcel Apfelbaum,
	Stefan Hajnoczi, Dan Williams, Haozhong Zhang

QEMU now builds one SRAT memory affinity structure for each
static-plugged PC-DIMM and NVDIMM device with the proximity domain
specified in the device option 'node', rather than only one SRAT
memory affinity structure covering the entire hotpluggable address
space with the proximity domain of the last node.

Add test cases on PC and Q35 machines with 3 proximity domains, and
one PC-DIMM and one NVDIMM attached to the second proximity domain.
Check whether the QEMU-built SRAT tables match with the expected ones.

Signed-off-by: Haozhong Zhang <haozhong.zhang@intel.com>
Suggested-by: Igor Mammedov <imammedo@redhat.com>
---
 tests/acpi-test-data/pc/APIC.dimmpxm  | Bin 0 -> 136 bytes
 tests/acpi-test-data/pc/DSDT.dimmpxm  | Bin 0 -> 6710 bytes
 tests/acpi-test-data/pc/NFIT.dimmpxm  | Bin 0 -> 224 bytes
 tests/acpi-test-data/pc/SRAT.dimmpxm  | Bin 0 -> 416 bytes
 tests/acpi-test-data/pc/SSDT.dimmpxm  | Bin 0 -> 685 bytes
 tests/acpi-test-data/q35/APIC.dimmpxm | Bin 0 -> 136 bytes
 tests/acpi-test-data/q35/DSDT.dimmpxm | Bin 0 -> 9394 bytes
 tests/acpi-test-data/q35/NFIT.dimmpxm | Bin 0 -> 224 bytes
 tests/acpi-test-data/q35/SRAT.dimmpxm | Bin 0 -> 416 bytes
 tests/acpi-test-data/q35/SSDT.dimmpxm | Bin 0 -> 685 bytes
 tests/bios-tables-test.c              |  33 +++++++++++++++++++++++++++++++++
 11 files changed, 33 insertions(+)
 create mode 100644 tests/acpi-test-data/pc/APIC.dimmpxm
 create mode 100644 tests/acpi-test-data/pc/DSDT.dimmpxm
 create mode 100644 tests/acpi-test-data/pc/NFIT.dimmpxm
 create mode 100644 tests/acpi-test-data/pc/SRAT.dimmpxm
 create mode 100644 tests/acpi-test-data/pc/SSDT.dimmpxm
 create mode 100644 tests/acpi-test-data/q35/APIC.dimmpxm
 create mode 100644 tests/acpi-test-data/q35/DSDT.dimmpxm
 create mode 100644 tests/acpi-test-data/q35/NFIT.dimmpxm
 create mode 100644 tests/acpi-test-data/q35/SRAT.dimmpxm
 create mode 100644 tests/acpi-test-data/q35/SSDT.dimmpxm

diff --git a/tests/acpi-test-data/pc/APIC.dimmpxm b/tests/acpi-test-data/pc/APIC.dimmpxm
new file mode 100644
index 0000000000000000000000000000000000000000..658d7e748e37540ff85a02f4391efc7eaae3c8b4
GIT binary patch
literal 136
zcmZ<^@O18AU|?W8>g4b25v<@85#a0y6k`O6f!H9Lf#JbFFwFr}2jX%tGD2u3CJ@cY
q0}?#&4@5F?0WpXHVzIIUX<iVElM}|`0xE!radU%NENuUQMgRcNAq@cl

literal 0
HcmV?d00001

diff --git a/tests/acpi-test-data/pc/DSDT.dimmpxm b/tests/acpi-test-data/pc/DSDT.dimmpxm
new file mode 100644
index 0000000000000000000000000000000000000000..20e6433725bb3e70085cf6227f981106772bdaea
GIT binary patch
literal 6710
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

literal 0
HcmV?d00001

diff --git a/tests/acpi-test-data/pc/NFIT.dimmpxm b/tests/acpi-test-data/pc/NFIT.dimmpxm
new file mode 100644
index 0000000000000000000000000000000000000000..207328ed9357409e4098df64f951a29527ab52de
GIT binary patch
literal 224
zcmeZs^9*^wz`(#5;N<V@5v<@85#a0x6k`O6f!H7#0xTF<7?{CKkXYsA4{4vblsK$$
z<~5es-g6r$!~s>y0aC=#03w0rG8iy0L6|`OtRNOx9x8-HL3Fb)1OQdFH828oB7<-f
NAqGZ>^~k~m*#MLQ69E7K

literal 0
HcmV?d00001

diff --git a/tests/acpi-test-data/pc/SRAT.dimmpxm b/tests/acpi-test-data/pc/SRAT.dimmpxm
new file mode 100644
index 0000000000000000000000000000000000000000..b308d09b94cb8547f611bf8eb3a956359a71576c
GIT binary patch
literal 416
zcmWFzatv9($iTp8?d0$55v<@85#SsQ6axw|fY=}!gyBE{ozKXKD$m4(%xBbq>x446
z-~!my0WAQ74{&KX11Qd@0p~G66~br~cQR_gg;}8LU^JRKs4M{r$zGU#4wx2Z7z0Qn
ZspEjU6t0dPMIGFI0#J1?VA9Cu0RYf$3jqKC

literal 0
HcmV?d00001

diff --git a/tests/acpi-test-data/pc/SSDT.dimmpxm b/tests/acpi-test-data/pc/SSDT.dimmpxm
new file mode 100644
index 0000000000000000000000000000000000000000..2d5b721bcf9c398feb6d005761f898015042e8a4
GIT binary patch
literal 685
zcmZXSKZw(C6vtnha!u0~lD6O<%8~6xbDe}6G))>CXws6TMaV(^RC>L(!w>Hk5uvTa
z=?OwFn~0>6QE?aCT%DZU4_w7Xa8Q3QhlA(x-Y@U_^4{nB<L5Y<`!)x_+-~*Mjw4w^
z%`i>+4FIjXeHF7{?d<zb%lB689je=$-!Zg`qV^40-fcp?TeVcBTOnrKRL0)I>Ki?#
zbd~4x^lU38j7uPR%M#XE%he6ZTQ*Q&J6g9b+3let=>toZbj7~2_*w9l)l9X!ZA<ED
zio5t#NUq0oAYzRd(yzje^{aF7>F4TR{A2%pu(_FR$MZ5GXAR$9KD)R1R8>#E7$4s?
zKSaUiN>-QO6jiZuF0R)cNaYvfAi4G^9>ZBY2_PxPQ%FUY$pS;>NJb73jZBd(X*`Ud
z&-i?NGNWsr%m5<tI2w@=GLtd7I!0bTACd<l&qC<c5FNr^YoH&AIlz379@GV2bIg2-
zH#Rw(&VaKWSAn`&uyw;Nay{K~flM$F>_N+y9WhLGi@}b}bZ{B~9Wfvna9C14i?d2f
z*OHSUJPs*V!o?wVmjkaB@KVM|iS!gh{gzLcbA+l9fzfN3AxJX{@b5&7acT*ezxqZ<
zws2T<e-w_6q9F2C4QnXNoUdp$bJ-!|t+uJUo2h)RF8+G~eC|STUg+$9I?Lg^D#N$m
Fg+DfN!vO#Q

literal 0
HcmV?d00001

diff --git a/tests/acpi-test-data/q35/APIC.dimmpxm b/tests/acpi-test-data/q35/APIC.dimmpxm
new file mode 100644
index 0000000000000000000000000000000000000000..658d7e748e37540ff85a02f4391efc7eaae3c8b4
GIT binary patch
literal 136
zcmZ<^@O18AU|?W8>g4b25v<@85#a0y6k`O6f!H9Lf#JbFFwFr}2jX%tGD2u3CJ@cY
q0}?#&4@5F?0WpXHVzIIUX<iVElM}|`0xE!radU%NENuUQMgRcNAq@cl

literal 0
HcmV?d00001

diff --git a/tests/acpi-test-data/q35/DSDT.dimmpxm b/tests/acpi-test-data/q35/DSDT.dimmpxm
new file mode 100644
index 0000000000000000000000000000000000000000..92f2385765ccba9b8cac2db64a68a96caeaab373
GIT binary patch
literal 9394
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
Ac>n+a

literal 0
HcmV?d00001

diff --git a/tests/acpi-test-data/q35/NFIT.dimmpxm b/tests/acpi-test-data/q35/NFIT.dimmpxm
new file mode 100644
index 0000000000000000000000000000000000000000..207328ed9357409e4098df64f951a29527ab52de
GIT binary patch
literal 224
zcmeZs^9*^wz`(#5;N<V@5v<@85#a0x6k`O6f!H7#0xTF<7?{CKkXYsA4{4vblsK$$
z<~5es-g6r$!~s>y0aC=#03w0rG8iy0L6|`OtRNOx9x8-HL3Fb)1OQdFH828oB7<-f
NAqGZ>^~k~m*#MLQ69E7K

literal 0
HcmV?d00001

diff --git a/tests/acpi-test-data/q35/SRAT.dimmpxm b/tests/acpi-test-data/q35/SRAT.dimmpxm
new file mode 100644
index 0000000000000000000000000000000000000000..b308d09b94cb8547f611bf8eb3a956359a71576c
GIT binary patch
literal 416
zcmWFzatv9($iTp8?d0$55v<@85#SsQ6axw|fY=}!gyBE{ozKXKD$m4(%xBbq>x446
z-~!my0WAQ74{&KX11Qd@0p~G66~br~cQR_gg;}8LU^JRKs4M{r$zGU#4wx2Z7z0Qn
ZspEjU6t0dPMIGFI0#J1?VA9Cu0RYf$3jqKC

literal 0
HcmV?d00001

diff --git a/tests/acpi-test-data/q35/SSDT.dimmpxm b/tests/acpi-test-data/q35/SSDT.dimmpxm
new file mode 100644
index 0000000000000000000000000000000000000000..2d5b721bcf9c398feb6d005761f898015042e8a4
GIT binary patch
literal 685
zcmZXSKZw(C6vtnha!u0~lD6O<%8~6xbDe}6G))>CXws6TMaV(^RC>L(!w>Hk5uvTa
z=?OwFn~0>6QE?aCT%DZU4_w7Xa8Q3QhlA(x-Y@U_^4{nB<L5Y<`!)x_+-~*Mjw4w^
z%`i>+4FIjXeHF7{?d<zb%lB689je=$-!Zg`qV^40-fcp?TeVcBTOnrKRL0)I>Ki?#
zbd~4x^lU38j7uPR%M#XE%he6ZTQ*Q&J6g9b+3let=>toZbj7~2_*w9l)l9X!ZA<ED
zio5t#NUq0oAYzRd(yzje^{aF7>F4TR{A2%pu(_FR$MZ5GXAR$9KD)R1R8>#E7$4s?
zKSaUiN>-QO6jiZuF0R)cNaYvfAi4G^9>ZBY2_PxPQ%FUY$pS;>NJb73jZBd(X*`Ud
z&-i?NGNWsr%m5<tI2w@=GLtd7I!0bTACd<l&qC<c5FNr^YoH&AIlz379@GV2bIg2-
zH#Rw(&VaKWSAn`&uyw;Nay{K~flM$F>_N+y9WhLGi@}b}bZ{B~9Wfvna9C14i?d2f
z*OHSUJPs*V!o?wVmjkaB@KVM|iS!gh{gzLcbA+l9fzfN3AxJX{@b5&7acT*ezxqZ<
zws2T<e-w_6q9F2C4QnXNoUdp$bJ-!|t+uJUo2h)RF8+G~eC|STUg+$9I?Lg^D#N$m
Fg+DfN!vO#Q

literal 0
HcmV?d00001

diff --git a/tests/bios-tables-test.c b/tests/bios-tables-test.c
index d45181aa51..319cf84c1a 100644
--- a/tests/bios-tables-test.c
+++ b/tests/bios-tables-test.c
@@ -882,6 +882,37 @@ static void test_acpi_piix4_tcg_numamem(void)
     free_test_data(&data);
 }
 
+static void test_acpi_tcg_dimm_pxm(const char *machine)
+{
+    test_data data;
+
+    memset(&data, 0, sizeof(data));
+    data.machine = machine;
+    data.variant = ".dimmpxm";
+    test_acpi_one("nvdimm=on",
+                  " -smp 3"
+                  " -m 128M,slots=3,maxmem=1G"
+                  " -numa node,mem=32M,cpus=0,nodeid=0"
+                  " -numa node,mem=32M,cpus=1,nodeid=1"
+                  " -numa node,mem=64M,cpus=2,nodeid=2"
+                  " -object memory-backend-ram,id=ram0,size=128M"
+                  " -object memory-backend-ram,id=nvm0,size=128M"
+                  " -device pc-dimm,id=dimm0,memdev=ram0,node=1"
+                  " -device nvdimm,id=dimm1,memdev=nvm0,node=1",
+                  &data);
+    free_test_data(&data);
+}
+
+static void test_acpi_q35_tcg_dimm_pxm(void)
+{
+    test_acpi_tcg_dimm_pxm(MACHINE_Q35);
+}
+
+static void test_acpi_piix4_tcg_dimm_pxm(void)
+{
+    test_acpi_tcg_dimm_pxm(MACHINE_PC);
+}
+
 int main(int argc, char *argv[])
 {
     const char *arch = qtest_get_arch();
@@ -906,6 +937,8 @@ int main(int argc, char *argv[])
         qtest_add_func("acpi/q35/memhp", test_acpi_q35_tcg_memhp);
         qtest_add_func("acpi/piix4/numamem", test_acpi_piix4_tcg_numamem);
         qtest_add_func("acpi/q35/numamem", test_acpi_q35_tcg_numamem);
+        qtest_add_func("acpi/piix4/dimmpxm", test_acpi_piix4_tcg_dimm_pxm);
+        qtest_add_func("acpi/q35/dimmpxm", test_acpi_q35_tcg_dimm_pxm);
     }
     ret = g_test_run();
     boot_sector_cleanup(disk);
-- 
2.14.1

^ permalink raw reply related	[flat|nested] 14+ messages in thread

* Re: [Qemu-devel] [PATCH v3 2/5] qmp: distinguish PC-DIMM and NVDIMM in MemoryDeviceInfoList
  2018-03-05  6:57 ` [Qemu-devel] [PATCH v3 2/5] qmp: distinguish PC-DIMM and NVDIMM in MemoryDeviceInfoList Haozhong Zhang
@ 2018-03-05 19:14   ` Eric Blake
  2018-03-06  0:24     ` Haozhong Zhang
  2018-03-06 12:34     ` Igor Mammedov
  2018-03-07 10:21   ` Igor Mammedov
  1 sibling, 2 replies; 14+ messages in thread
From: Eric Blake @ 2018-03-05 19:14 UTC (permalink / raw)
  To: Haozhong Zhang, qemu-devel
  Cc: mst, Igor Mammedov, Xiao Guangrong, Paolo Bonzini,
	Richard Henderson, Eduardo Habkost, Marcel Apfelbaum,
	Stefan Hajnoczi, Dan Williams, Markus Armbruster, dgilbert

On 03/05/2018 12:57 AM, Haozhong Zhang wrote:
> 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.
> 
> NVDIMMDeviceInfo, which inherits from PCDIMMDeviceInfo, is added to
> union type MemoryDeviceInfo to record information of NVDIMM devices.
> The NVDIMM-specific data is currently left empty and will be filled
> when necessary in the future.
> 
> Signed-off-by: Haozhong Zhang <haozhong.zhang@intel.com>
> ---
>   hmp.c            | 14 +++++++++++---
>   hw/mem/pc-dimm.c | 20 ++++++++++++++++++--
>   numa.c           | 19 +++++++++++++------
>   qapi-schema.json | 18 +++++++++++++++++-

Will need rebasing now that the contents live in qapi/misc.json.

> +++ b/qapi-schema.json
> @@ -2920,6 +2920,18 @@
>             }
>   }
>   
> +##
> +# @NVDIMMDeviceInfo:
> +#
> +# NVDIMMDevice state information
> +#
> +# Since: 2.12
> +##
> +{ 'struct': 'NVDIMMDeviceInfo',
> +  'base': 'PCDIMMDeviceInfo',
> +  'data': {}
> +}

You added no data, so why did you need the type?

> +
>   ##
>   # @MemoryDeviceInfo:
>   #
> @@ -2927,7 +2939,11 @@
>   #
>   # Since: 2.1
>   ##
> -{ 'union': 'MemoryDeviceInfo', 'data': {'dimm': 'PCDIMMDeviceInfo'} }
> +{ 'union': 'MemoryDeviceInfo',
> +  'data': { 'dimm': 'PCDIMMDeviceInfo',
> +            'nvdimm': 'NVDIMMDeviceInfo'

Names aren't part of the interface; would it be better to rename 
PCDIMMDeviceInfo into something that can be generically shared between 
both the 'dimm' and 'nvdimm' branches without having to create a 
pointless subtype?

-- 
Eric Blake, Principal Software Engineer
Red Hat, Inc.           +1-919-301-3266
Virtualization:  qemu.org | libvirt.org

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [Qemu-devel] [PATCH v3 2/5] qmp: distinguish PC-DIMM and NVDIMM in MemoryDeviceInfoList
  2018-03-05 19:14   ` Eric Blake
@ 2018-03-06  0:24     ` Haozhong Zhang
  2018-03-06 12:34     ` Igor Mammedov
  1 sibling, 0 replies; 14+ messages in thread
From: Haozhong Zhang @ 2018-03-06  0:24 UTC (permalink / raw)
  To: Eric Blake
  Cc: qemu-devel, mst, Igor Mammedov, Xiao Guangrong, Paolo Bonzini,
	Richard Henderson, Eduardo Habkost, Marcel Apfelbaum,
	Stefan Hajnoczi, Dan Williams, Markus Armbruster, dgilbert

On 03/05/18 13:14 -0600, Eric Blake wrote:
> On 03/05/2018 12:57 AM, Haozhong Zhang wrote:
> > 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.
> > 
> > NVDIMMDeviceInfo, which inherits from PCDIMMDeviceInfo, is added to
> > union type MemoryDeviceInfo to record information of NVDIMM devices.
> > The NVDIMM-specific data is currently left empty and will be filled
> > when necessary in the future.
> > 
> > Signed-off-by: Haozhong Zhang <haozhong.zhang@intel.com>
> > ---
> >   hmp.c            | 14 +++++++++++---
> >   hw/mem/pc-dimm.c | 20 ++++++++++++++++++--
> >   numa.c           | 19 +++++++++++++------
> >   qapi-schema.json | 18 +++++++++++++++++-
> 
> Will need rebasing now that the contents live in qapi/misc.json.

will do

> 
> > +++ b/qapi-schema.json
> > @@ -2920,6 +2920,18 @@
> >             }
> >   }
> > +##
> > +# @NVDIMMDeviceInfo:
> > +#
> > +# NVDIMMDevice state information
> > +#
> > +# Since: 2.12
> > +##
> > +{ 'struct': 'NVDIMMDeviceInfo',
> > +  'base': 'PCDIMMDeviceInfo',
> > +  'data': {}
> > +}
> 
> You added no data, so why did you need the type?
> 
> > +
> >   ##
> >   # @MemoryDeviceInfo:
> >   #
> > @@ -2927,7 +2939,11 @@
> >   #
> >   # Since: 2.1
> >   ##
> > -{ 'union': 'MemoryDeviceInfo', 'data': {'dimm': 'PCDIMMDeviceInfo'} }
> > +{ 'union': 'MemoryDeviceInfo',
> > +  'data': { 'dimm': 'PCDIMMDeviceInfo',
> > +            'nvdimm': 'NVDIMMDeviceInfo'
> 
> Names aren't part of the interface; would it be better to rename
> PCDIMMDeviceInfo into something that can be generically shared between both
> the 'dimm' and 'nvdimm' branches without having to create a pointless
> subtype?
>

The purpose of this NVDIMMDeviceInfo is to introduce
MEMORY_DEVICE_INFO_KIND_NVDIMM, which can be used to distinguish
NVDIMM from PC-DIMM in the list returned from query-memory-device.

If 'data' of NVDIMMDeviceInfo is filled with NVDIMM-specific
information (there does have some), would it make this type less
pointless?

Thanks,
Haozhong

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [Qemu-devel] [PATCH v3 2/5] qmp: distinguish PC-DIMM and NVDIMM in MemoryDeviceInfoList
  2018-03-05 19:14   ` Eric Blake
  2018-03-06  0:24     ` Haozhong Zhang
@ 2018-03-06 12:34     ` Igor Mammedov
  1 sibling, 0 replies; 14+ messages in thread
From: Igor Mammedov @ 2018-03-06 12:34 UTC (permalink / raw)
  To: Eric Blake
  Cc: Haozhong Zhang, qemu-devel, mst, Xiao Guangrong, Paolo Bonzini,
	Richard Henderson, Eduardo Habkost, Marcel Apfelbaum,
	Stefan Hajnoczi, Dan Williams, Markus Armbruster, dgilbert

On Mon, 5 Mar 2018 13:14:34 -0600
Eric Blake <eblake@redhat.com> wrote:

> On 03/05/2018 12:57 AM, Haozhong Zhang wrote:
> > 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.
> > 
> > NVDIMMDeviceInfo, which inherits from PCDIMMDeviceInfo, is added to
> > union type MemoryDeviceInfo to record information of NVDIMM devices.
> > The NVDIMM-specific data is currently left empty and will be filled
> > when necessary in the future.
> > 
> > Signed-off-by: Haozhong Zhang <haozhong.zhang@intel.com>
> > ---
> >   hmp.c            | 14 +++++++++++---
> >   hw/mem/pc-dimm.c | 20 ++++++++++++++++++--
> >   numa.c           | 19 +++++++++++++------
> >   qapi-schema.json | 18 +++++++++++++++++-  
> 
> Will need rebasing now that the contents live in qapi/misc.json.
> 
> > +++ b/qapi-schema.json
> > @@ -2920,6 +2920,18 @@
> >             }
> >   }
> >   
> > +##
> > +# @NVDIMMDeviceInfo:
> > +#
> > +# NVDIMMDevice state information
> > +#
> > +# Since: 2.12
> > +##
> > +{ 'struct': 'NVDIMMDeviceInfo',
> > +  'base': 'PCDIMMDeviceInfo',
> > +  'data': {}
> > +}  
> 
> You added no data, so why did you need the type?
> 
> > +
> >   ##
> >   # @MemoryDeviceInfo:
> >   #
> > @@ -2927,7 +2939,11 @@
> >   #
> >   # Since: 2.1
> >   ##
> > -{ 'union': 'MemoryDeviceInfo', 'data': {'dimm': 'PCDIMMDeviceInfo'} }
> > +{ 'union': 'MemoryDeviceInfo',
> > +  'data': { 'dimm': 'PCDIMMDeviceInfo',
> > +            'nvdimm': 'NVDIMMDeviceInfo'  
> 
> Names aren't part of the interface; would it be better to rename 
> PCDIMMDeviceInfo into something that can be generically shared between 
> both the 'dimm' and 'nvdimm' branches without having to create a 
> pointless subtype?
Currently we are lying on query-memory-devices and reporting nvdimm
devices as pcdimm (I haven't noticed it when nvdimms were introduced),
this patch fixes it so it will be clear what type of device is used where.

Later we can extend data{} section with nvdimm specific info as needed.

The second goal of this patch (well, the actual reason I've asked for it),
is to reuse qmp_pc_dimm_device_list() internally in QEMU to get
list of dimm based memory devices, instead of creating yet another
API to do that for internal usage.

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [Qemu-devel] [PATCH v3 1/5] pc-dimm: refactor qmp_pc_dimm_device_list
  2018-03-05  6:57 ` [Qemu-devel] [PATCH v3 1/5] pc-dimm: refactor qmp_pc_dimm_device_list Haozhong Zhang
@ 2018-03-07 10:10   ` Igor Mammedov
  0 siblings, 0 replies; 14+ messages in thread
From: Igor Mammedov @ 2018-03-07 10:10 UTC (permalink / raw)
  To: Haozhong Zhang
  Cc: qemu-devel, Xiao Guangrong, mst, Bharata B Rao, Alexander Graf,
	Eduardo Habkost, Markus Armbruster, qemu-ppc, Stefan Hajnoczi,
	Paolo Bonzini, Marcel Apfelbaum, Dan Williams, David Gibson,
	Richard Henderson

On Mon,  5 Mar 2018 14:57:06 +0800
Haozhong Zhang <haozhong.zhang@intel.com> wrote:

I'd suggest following commit subj/msg:

-----
 pc-dimm: make qmp_pc_dimm_device_list() sort devices by address

 Make qmp_pc_dimm_device_list() return sorted by start address
 list of devices so that it could be reused in places that
 would need sorted list*. Reuse existing pc_dimm_built_list()
 to get sorted list.

 While at it hide recursive callbacks from callers, so that:

   qmp_pc_dimm_device_list(qdev_get_machine(), &list);

 could be replaced with simpler:

   list = qmp_pc_dimm_device_list();

 * follow up patch will use it in build_srat()
-----

with commit message updated:
  Reviewed-by: Igor Mammedov <imammedo@redhat.com>

> Use pc_dimm_built_list to hide recursive callbacks from callers.
> 
> Signed-off-by: Haozhong Zhang <haozhong.zhang@intel.com>
> ---
>  hw/mem/pc-dimm.c         | 83 +++++++++++++++++++++++++-----------------------
>  hw/ppc/spapr.c           |  3 +-
>  include/hw/mem/pc-dimm.h |  2 +-
>  numa.c                   |  4 +--
>  qmp.c                    |  7 +---
>  stubs/qmp_pc_dimm.c      |  4 +--
>  6 files changed, 50 insertions(+), 53 deletions(-)
> 
> diff --git a/hw/mem/pc-dimm.c b/hw/mem/pc-dimm.c
> index 6e74b61cb6..4d050fe2cd 100644
> --- a/hw/mem/pc-dimm.c
> +++ b/hw/mem/pc-dimm.c
> @@ -162,45 +162,6 @@ uint64_t get_plugged_memory_size(void)
>      return pc_existing_dimms_capacity(&error_abort);
>  }
>  
> -int qmp_pc_dimm_device_list(Object *obj, void *opaque)
> -{
> -    MemoryDeviceInfoList ***prev = opaque;
> -
> -    if (object_dynamic_cast(obj, TYPE_PC_DIMM)) {
> -        DeviceState *dev = DEVICE(obj);
> -
> -        if (dev->realized) {
> -            MemoryDeviceInfoList *elem = g_new0(MemoryDeviceInfoList, 1);
> -            MemoryDeviceInfo *info = g_new0(MemoryDeviceInfo, 1);
> -            PCDIMMDeviceInfo *di = g_new0(PCDIMMDeviceInfo, 1);
> -            DeviceClass *dc = DEVICE_GET_CLASS(obj);
> -            PCDIMMDevice *dimm = PC_DIMM(obj);
> -
> -            if (dev->id) {
> -                di->has_id = true;
> -                di->id = g_strdup(dev->id);
> -            }
> -            di->hotplugged = dev->hotplugged;
> -            di->hotpluggable = dc->hotpluggable;
> -            di->addr = dimm->addr;
> -            di->slot = dimm->slot;
> -            di->node = dimm->node;
> -            di->size = object_property_get_uint(OBJECT(dimm), PC_DIMM_SIZE_PROP,
> -                                                NULL);
> -            di->memdev = object_get_canonical_path(OBJECT(dimm->hostmem));
> -
> -            info->u.dimm.data = di;
> -            elem->value = info;
> -            elem->next = NULL;
> -            **prev = elem;
> -            *prev = &elem->next;
> -        }
> -    }
> -
> -    object_child_foreach(obj, qmp_pc_dimm_device_list, opaque);
> -    return 0;
> -}
> -
>  static int pc_dimm_slot2bitmap(Object *obj, void *opaque)
>  {
>      unsigned long *bitmap = opaque;
> @@ -276,6 +237,50 @@ static int pc_dimm_built_list(Object *obj, void *opaque)
>      return 0;
>  }
>  
> +MemoryDeviceInfoList *qmp_pc_dimm_device_list(void)
> +{
> +    GSList *dimms = NULL, *item;
> +    MemoryDeviceInfoList *list = NULL, *prev = NULL;
> +
> +    object_child_foreach(qdev_get_machine(), pc_dimm_built_list, &dimms);
> +
> +    for (item = dimms; item; item = g_slist_next(item)) {
> +        PCDIMMDevice *dimm = PC_DIMM(item->data);
> +        Object *obj = OBJECT(dimm);
> +        MemoryDeviceInfoList *elem = g_new0(MemoryDeviceInfoList, 1);
> +        MemoryDeviceInfo *info = g_new0(MemoryDeviceInfo, 1);
> +        PCDIMMDeviceInfo *di = g_new0(PCDIMMDeviceInfo, 1);
> +        DeviceClass *dc = DEVICE_GET_CLASS(obj);
> +        DeviceState *dev = DEVICE(obj);
> +
> +        if (dev->id) {
> +            di->has_id = true;
> +            di->id = g_strdup(dev->id);
> +        }
> +        di->hotplugged = dev->hotplugged;
> +        di->hotpluggable = dc->hotpluggable;
> +        di->addr = dimm->addr;
> +        di->slot = dimm->slot;
> +        di->node = dimm->node;
> +        di->size = object_property_get_uint(obj, PC_DIMM_SIZE_PROP, NULL);
> +        di->memdev = object_get_canonical_path(OBJECT(dimm->hostmem));
> +
> +        info->u.dimm.data = di;
> +        elem->value = info;
> +        elem->next = NULL;
> +        if (prev) {
> +            prev->next = elem;
> +        } else {
> +            list = elem;
> +        }
> +        prev = elem;
> +    }
> +
> +    g_slist_free(dimms);
> +
> +    return list;
> +}
> +
>  uint64_t pc_dimm_get_free_addr(uint64_t address_space_start,
>                                 uint64_t address_space_size,
>                                 uint64_t *hint, uint64_t align, uint64_t size,
> diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
> index 83c9d66dd5..68a81e47d2 100644
> --- a/hw/ppc/spapr.c
> +++ b/hw/ppc/spapr.c
> @@ -731,8 +731,7 @@ static int spapr_populate_drconf_memory(sPAPRMachineState *spapr, void *fdt)
>      }
>  
>      if (hotplug_lmb_start) {
> -        MemoryDeviceInfoList **prev = &dimms;
> -        qmp_pc_dimm_device_list(qdev_get_machine(), &prev);
> +        dimms = qmp_pc_dimm_device_list();
>      }
>  
>      /* ibm,dynamic-memory */
> diff --git a/include/hw/mem/pc-dimm.h b/include/hw/mem/pc-dimm.h
> index d83b957829..1fc479281c 100644
> --- a/include/hw/mem/pc-dimm.h
> +++ b/include/hw/mem/pc-dimm.h
> @@ -93,7 +93,7 @@ uint64_t pc_dimm_get_free_addr(uint64_t address_space_start,
>  
>  int pc_dimm_get_free_slot(const int *hint, int max_slots, Error **errp);
>  
> -int qmp_pc_dimm_device_list(Object *obj, void *opaque);
> +MemoryDeviceInfoList *qmp_pc_dimm_device_list(void);
>  uint64_t pc_existing_dimms_capacity(Error **errp);
>  uint64_t get_plugged_memory_size(void);
>  void pc_dimm_memory_plug(DeviceState *dev, MemoryHotplugState *hpms,
> diff --git a/numa.c b/numa.c
> index 7e0e789b02..c6734ceb8c 100644
> --- a/numa.c
> +++ b/numa.c
> @@ -520,12 +520,10 @@ void memory_region_allocate_system_memory(MemoryRegion *mr, Object *owner,
>  
>  static void numa_stat_memory_devices(NumaNodeMem node_mem[])
>  {
> -    MemoryDeviceInfoList *info_list = NULL;
> -    MemoryDeviceInfoList **prev = &info_list;
> +    MemoryDeviceInfoList *info_list = qmp_pc_dimm_device_list();
>      MemoryDeviceInfoList *info;
>      PCDIMMDeviceInfo     *pcdimm_info;
>  
> -    qmp_pc_dimm_device_list(qdev_get_machine(), &prev);
>      for (info = info_list; info; info = info->next) {
>          MemoryDeviceInfo *value = info->value;
>  
> diff --git a/qmp.c b/qmp.c
> index 793f6f3323..c6ac7b05b4 100644
> --- a/qmp.c
> +++ b/qmp.c
> @@ -680,12 +680,7 @@ void qmp_object_del(const char *id, Error **errp)
>  
>  MemoryDeviceInfoList *qmp_query_memory_devices(Error **errp)
>  {
> -    MemoryDeviceInfoList *head = NULL;
> -    MemoryDeviceInfoList **prev = &head;
> -
> -    qmp_pc_dimm_device_list(qdev_get_machine(), &prev);
> -
> -    return head;
> +    return qmp_pc_dimm_device_list();
>  }
>  
>  ACPIOSTInfoList *qmp_query_acpi_ospm_status(Error **errp)
> diff --git a/stubs/qmp_pc_dimm.c b/stubs/qmp_pc_dimm.c
> index 9ddc4f619a..b6b2cca89e 100644
> --- a/stubs/qmp_pc_dimm.c
> +++ b/stubs/qmp_pc_dimm.c
> @@ -2,9 +2,9 @@
>  #include "qom/object.h"
>  #include "hw/mem/pc-dimm.h"
>  
> -int qmp_pc_dimm_device_list(Object *obj, void *opaque)
> +MemoryDeviceInfoList *qmp_pc_dimm_device_list(void)
>  {
> -   return 0;
> +   return NULL;
>  }
>  
>  uint64_t get_plugged_memory_size(void)

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [Qemu-devel] [PATCH v3 2/5] qmp: distinguish PC-DIMM and NVDIMM in MemoryDeviceInfoList
  2018-03-05  6:57 ` [Qemu-devel] [PATCH v3 2/5] qmp: distinguish PC-DIMM and NVDIMM in MemoryDeviceInfoList Haozhong Zhang
  2018-03-05 19:14   ` Eric Blake
@ 2018-03-07 10:21   ` Igor Mammedov
  1 sibling, 0 replies; 14+ messages in thread
From: Igor Mammedov @ 2018-03-07 10:21 UTC (permalink / raw)
  To: Haozhong Zhang
  Cc: qemu-devel, Xiao Guangrong, mst, Markus Armbruster,
	Eduardo Habkost, dgilbert, Stefan Hajnoczi, Paolo Bonzini,
	Marcel Apfelbaum, Dan Williams, Richard Henderson

On Mon,  5 Mar 2018 14:57:07 +0800
Haozhong Zhang <haozhong.zhang@intel.com> wrote:

> 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.
> 
> NVDIMMDeviceInfo, which inherits from PCDIMMDeviceInfo, is added to
> union type MemoryDeviceInfo to record information of NVDIMM devices.
> The NVDIMM-specific data is currently left empty and will be filled
> when necessary in the future.
Maybe add to commit message that:

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.

Otherwise patch looks good,
I'll ack it after rebase with is necessary for this patch.

> Signed-off-by: Haozhong Zhang <haozhong.zhang@intel.com>
> ---
>  hmp.c            | 14 +++++++++++---
>  hw/mem/pc-dimm.c | 20 ++++++++++++++++++--
>  numa.c           | 19 +++++++++++++------
>  qapi-schema.json | 18 +++++++++++++++++-
>  4 files changed, 59 insertions(+), 12 deletions(-)
> 
> diff --git a/hmp.c b/hmp.c
> index ae86bfbade..3f06407c5e 100644
> --- a/hmp.c
> +++ b/hmp.c
> @@ -2413,7 +2413,18 @@ void hmp_info_memory_devices(Monitor *mon, const QDict *qdict)
>              switch (value->type) {
>              case MEMORY_DEVICE_INFO_KIND_DIMM:
>                  di = value->u.dimm.data;
> +                break;
> +
> +            case MEMORY_DEVICE_INFO_KIND_NVDIMM:
> +                di = qapi_NVDIMMDeviceInfo_base(value->u.nvdimm.data);
> +                break;
> +
> +            default:
> +                di = NULL;
> +                break;
> +            }
>  
> +            if (di) {
>                  monitor_printf(mon, "Memory device [%s]: \"%s\"\n",
>                                 MemoryDeviceInfoKind_str(value->type),
>                                 di->id ? di->id : "");
> @@ -2426,9 +2437,6 @@ void hmp_info_memory_devices(Monitor *mon, const QDict *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..866ecc699a 100644
> --- a/hw/mem/pc-dimm.c
> +++ b/hw/mem/pc-dimm.c
> @@ -20,6 +20,7 @@
>  
>  #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"
> @@ -249,10 +250,19 @@ MemoryDeviceInfoList *qmp_pc_dimm_device_list(void)
>          Object *obj = OBJECT(dimm);
>          MemoryDeviceInfoList *elem = g_new0(MemoryDeviceInfoList, 1);
>          MemoryDeviceInfo *info = g_new0(MemoryDeviceInfo, 1);
> -        PCDIMMDeviceInfo *di = g_new0(PCDIMMDeviceInfo, 1);
> +        PCDIMMDeviceInfo *di;
> +        NVDIMMDeviceInfo *ndi;
> +        bool is_nvdimm = object_dynamic_cast(obj, TYPE_NVDIMM);
>          DeviceClass *dc = DEVICE_GET_CLASS(obj);
>          DeviceState *dev = DEVICE(obj);
>  
> +        if (!is_nvdimm) {
> +            di = g_new0(PCDIMMDeviceInfo, 1);
> +        } else {
> +            ndi = g_new0(NVDIMMDeviceInfo, 1);
> +            di = qapi_NVDIMMDeviceInfo_base(ndi);
> +        }
> +
>          if (dev->id) {
>              di->has_id = true;
>              di->id = g_strdup(dev->id);
> @@ -265,7 +275,13 @@ MemoryDeviceInfoList *qmp_pc_dimm_device_list(void)
>          di->size = object_property_get_uint(obj, PC_DIMM_SIZE_PROP, NULL);
>          di->memdev = object_get_canonical_path(OBJECT(dimm->hostmem));
>  
> -        info->u.dimm.data = di;
> +        if (!is_nvdimm) {
> +            info->u.dimm.data = di;
> +            info->type = MEMORY_DEVICE_INFO_KIND_DIMM;
> +        } else {
> +            info->u.nvdimm.data = ndi;
> +            info->type = MEMORY_DEVICE_INFO_KIND_NVDIMM;
> +        }
>          elem->value = info;
>          elem->next = NULL;
>          if (prev) {
> diff --git a/numa.c b/numa.c
> index c6734ceb8c..23c4371e51 100644
> --- a/numa.c
> +++ b/numa.c
> @@ -529,18 +529,25 @@ static void numa_stat_memory_devices(NumaNodeMem node_mem[])
>  
>          if (value) {
>              switch (value->type) {
> -            case MEMORY_DEVICE_INFO_KIND_DIMM: {
> +            case MEMORY_DEVICE_INFO_KIND_DIMM:
>                  pcdimm_info = value->u.dimm.data;
> +                break;
> +
> +            case MEMORY_DEVICE_INFO_KIND_NVDIMM:
> +                pcdimm_info = qapi_NVDIMMDeviceInfo_base(value->u.nvdimm.data);
> +                break;
> +
> +            default:
> +                pcdimm_info = NULL;
> +                break;
> +            }
> +
> +            if (pcdimm_info) {
>                  node_mem[pcdimm_info->node].node_mem += pcdimm_info->size;
>                  if (pcdimm_info->hotpluggable && pcdimm_info->hotplugged) {
>                      node_mem[pcdimm_info->node].node_plugged_mem +=
>                          pcdimm_info->size;
>                  }
> -                break;
> -            }
> -
> -            default:
> -                break;
>              }
>          }
>      }
> diff --git a/qapi-schema.json b/qapi-schema.json
> index cd98a94388..1c2d281749 100644
> --- a/qapi-schema.json
> +++ b/qapi-schema.json
> @@ -2920,6 +2920,18 @@
>            }
>  }
>  
> +##
> +# @NVDIMMDeviceInfo:
> +#
> +# NVDIMMDevice state information
> +#
> +# Since: 2.12
> +##
> +{ 'struct': 'NVDIMMDeviceInfo',
> +  'base': 'PCDIMMDeviceInfo',
> +  'data': {}
> +}
> +
>  ##
>  # @MemoryDeviceInfo:
>  #
> @@ -2927,7 +2939,11 @@
>  #
>  # Since: 2.1
>  ##
> -{ 'union': 'MemoryDeviceInfo', 'data': {'dimm': 'PCDIMMDeviceInfo'} }
> +{ 'union': 'MemoryDeviceInfo',
> +  'data': { 'dimm': 'PCDIMMDeviceInfo',
> +            'nvdimm': 'NVDIMMDeviceInfo'
> +          }
> +}
>  
>  ##
>  # @query-memory-devices:

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [Qemu-devel] [PATCH v3 3/5] hw/acpi-build: build SRAT memory affinity structures for DIMM devices
  2018-03-05  6:57 ` [Qemu-devel] [PATCH v3 3/5] hw/acpi-build: build SRAT memory affinity structures for DIMM devices Haozhong Zhang
@ 2018-03-07 10:30   ` Igor Mammedov
  0 siblings, 0 replies; 14+ messages in thread
From: Igor Mammedov @ 2018-03-07 10:30 UTC (permalink / raw)
  To: Haozhong Zhang
  Cc: qemu-devel, mst, Xiao Guangrong, Paolo Bonzini,
	Richard Henderson, Eduardo Habkost, Marcel Apfelbaum,
	Stefan Hajnoczi, Dan Williams

On Mon,  5 Mar 2018 14:57:08 +0800
Haozhong Zhang <haozhong.zhang@intel.com> wrote:

> ACPI 6.2A Table 5-129 "SPA Range Structure" requires the proximity
> domain of a NVDIMM SPA range must match with corresponding entry in
> SRAT table.
> 
> The address ranges of vNVDIMM in QEMU are allocated from the
> hot-pluggable address space, which is entirely covered by one SRAT
> memory affinity structure. However, users can set the vNVDIMM
> proximity domain in NFIT SPA range structure by the 'node' property of
> '-device nvdimm' to a value different than the one in the above SRAT
> memory affinity structure.
> 
> In order to solve such proximity domain mismatch, this patch builds
> one SRAT memory affinity structure for each DIMM device present at
> boot time, including both PC-DIMM and NVDIMM, with the proximity
> domain specified in '-device pc-dimm' or '-device nvdimm'.
> 
> The remaining hot-pluggable address space is covered by one or multiple
> SRAT memory affinity structures with the proximity domain of the last
> node as before.
> 
> Signed-off-by: Haozhong Zhang <haozhong.zhang@intel.com>
> ---
>  hw/i386/acpi-build.c | 60 ++++++++++++++++++++++++++++++++++++++++++++++++----
>  1 file changed, 56 insertions(+), 4 deletions(-)
> 
> diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c
> index deb440f286..2ca0317386 100644
> --- a/hw/i386/acpi-build.c
> +++ b/hw/i386/acpi-build.c
> @@ -2323,6 +2323,59 @@ build_tpm2(GArray *table_data, BIOSLinker *linker, GArray *tcpalog)
>  #define HOLE_640K_START  (640 * 1024)
>  #define HOLE_640K_END   (1024 * 1024)
>  
> +static void build_srat_hotpluggable_memory(GArray *table_data, uint64_t base,
> +                                           uint64_t len, int default_node)
> +{
> +    MemoryDeviceInfoList *info_list = qmp_pc_dimm_device_list();
> +    MemoryDeviceInfoList *info;
> +    MemoryDeviceInfo *mi;
> +    PCDIMMDeviceInfo *di;
> +    uint64_t end = base + len, cur, addr, size;
> +    int node;
> +    bool is_nvdimm;
> +    AcpiSratMemoryAffinity *numamem;
> +    MemoryAffinityFlags flags;
> +
> +    for (cur = base, info = info_list;
> +         cur < end;
> +         cur += size, info = info->next) {
> +        numamem = acpi_data_push(table_data, sizeof *numamem);
> +
> +        if (!info) {
> +            build_srat_memory(numamem, cur, end - cur, default_node,
> +                              MEM_AFFINITY_HOTPLUGGABLE | MEM_AFFINITY_ENABLED);
> +            break;
> +        }
> +
> +        mi = info->value;
> +        is_nvdimm = (mi->type == MEMORY_DEVICE_INFO_KIND_NVDIMM);
> +        di = !is_nvdimm ? mi->u.dimm.data :
> +                          qapi_NVDIMMDeviceInfo_base(mi->u.nvdimm.data);
> +
> +        addr = di->addr;
maybe drop addr and use di->addr directly

> +        if (cur < addr) {
> +            build_srat_memory(numamem, cur, addr - cur, default_node,
> +                              MEM_AFFINITY_HOTPLUGGABLE | MEM_AFFINITY_ENABLED);
> +            numamem = acpi_data_push(table_data, sizeof *numamem);
> +        }
> +
> +        size = di->size;
> +        node = di->node;
the same wrt di->node

> +
> +        flags = MEM_AFFINITY_ENABLED;
> +        if (di->hotpluggable) {
> +            flags |= MEM_AFFINITY_HOTPLUGGABLE;
> +        }
> +        if (is_nvdimm) {
> +            flags |= MEM_AFFINITY_NON_VOLATILE;
> +        }
> +
> +        build_srat_memory(numamem, addr, size, node, flags);
> +    }
> +
> +    qapi_free_MemoryDeviceInfoList(info_list);
> +}
> +
>  static void
>  build_srat(GArray *table_data, BIOSLinker *linker, MachineState *machine)
>  {
> @@ -2434,10 +2487,9 @@ build_srat(GArray *table_data, BIOSLinker *linker, MachineState *machine)
>       * providing _PXM method if necessary.
>       */
>      if (hotplugabble_address_space_size) {
> -        numamem = acpi_data_push(table_data, sizeof *numamem);
> -        build_srat_memory(numamem, pcms->hotplug_memory.base,
> -                          hotplugabble_address_space_size, pcms->numa_nodes - 1,
> -                          MEM_AFFINITY_HOTPLUGGABLE | MEM_AFFINITY_ENABLED);
> +        build_srat_hotpluggable_memory(table_data, pcms->hotplug_memory.base,
> +                                       hotplugabble_address_space_size,
> +                                       pcms->numa_nodes - 1);
>      }
>  
>      build_header(linker, table_data,

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [Qemu-devel] [PATCH v3 4/5] tests/bios-tables-test: allow setting extra machine options
  2018-03-05  6:57 ` [Qemu-devel] [PATCH v3 4/5] tests/bios-tables-test: allow setting extra machine options Haozhong Zhang
@ 2018-03-07 10:40   ` Igor Mammedov
  0 siblings, 0 replies; 14+ messages in thread
From: Igor Mammedov @ 2018-03-07 10:40 UTC (permalink / raw)
  To: Haozhong Zhang
  Cc: qemu-devel, mst, Xiao Guangrong, Paolo Bonzini,
	Richard Henderson, Eduardo Habkost, Marcel Apfelbaum,
	Stefan Hajnoczi, Dan Williams

On Mon,  5 Mar 2018 14:57:09 +0800
Haozhong Zhang <haozhong.zhang@intel.com> wrote:

> Some test cases may require extra machine options than those used in
> the current test_acpi_ones(), e.g., nvdimm test cases require the
> machine option 'nvdimm=on'.
> 
> Signed-off-by: Haozhong Zhang <haozhong.zhang@intel.com>
> ---
>  tests/bios-tables-test.c | 45 +++++++++++++++++++++++++++++----------------
>  1 file changed, 29 insertions(+), 16 deletions(-)
> 
> diff --git a/tests/bios-tables-test.c b/tests/bios-tables-test.c
> index 65b271a173..d45181aa51 100644
> --- a/tests/bios-tables-test.c
> +++ b/tests/bios-tables-test.c
> @@ -654,17 +654,22 @@ static void test_smbios_structs(test_data *data)
>      }
>  }
>  
> -static void test_acpi_one(const char *params, test_data *data)
> +static void test_acpi_one(const char *extra_machine_opts,
> +                          const char *params, test_data *data)
>  {
>      char *args;
>  
>      /* Disable kernel irqchip to be able to override apic irq0. */
> -    args = g_strdup_printf("-machine %s,accel=%s,kernel-irqchip=off "
> +    args = g_strdup_printf("-machine %s,accel=%s,kernel-irqchip=off",
> +                           data->machine, "kvm:tcg");
> +    if (extra_machine_opts) {
> +        args = g_strdup_printf("%s,%s", args, extra_machine_opts);
> +    }
> +    args = g_strdup_printf("%s "
wouldn't 2nd and the rest of "args = g_strdup_printf", leak memory?

btw you don't really need this patch, you can just add
 "-machine nvdimm=on" to params argument at call site.
it's allowed to have several -FOO options on CLI, since
they are merged together and applied to machine object in QEMU.


>                             "-net none -display none %s "
>                             "-drive id=hd0,if=none,file=%s,format=raw "
>                             "-device ide-hd,drive=hd0 ",
> -                           data->machine, "kvm:tcg",
> -                           params ? params : "", disk);
> +                           args, params ? params : "", disk);
>  
>      qtest_start(args);
>  
> @@ -711,7 +716,7 @@ static void test_acpi_piix4_tcg(void)
>      data.machine = MACHINE_PC;
>      data.required_struct_types = base_required_struct_types;
>      data.required_struct_types_len = ARRAY_SIZE(base_required_struct_types);
> -    test_acpi_one(NULL, &data);
> +    test_acpi_one(NULL, NULL, &data);
>      free_test_data(&data);
>  }
>  
> @@ -724,7 +729,7 @@ static void test_acpi_piix4_tcg_bridge(void)
>      data.variant = ".bridge";
>      data.required_struct_types = base_required_struct_types;
>      data.required_struct_types_len = ARRAY_SIZE(base_required_struct_types);
> -    test_acpi_one("-device pci-bridge,chassis_nr=1", &data);
> +    test_acpi_one(NULL, "-device pci-bridge,chassis_nr=1", &data);
>      free_test_data(&data);
>  }
>  
> @@ -736,7 +741,7 @@ static void test_acpi_q35_tcg(void)
>      data.machine = MACHINE_Q35;
>      data.required_struct_types = base_required_struct_types;
>      data.required_struct_types_len = ARRAY_SIZE(base_required_struct_types);
> -    test_acpi_one(NULL, &data);
> +    test_acpi_one(NULL, NULL, &data);
>      free_test_data(&data);
>  }
>  
> @@ -749,7 +754,7 @@ static void test_acpi_q35_tcg_bridge(void)
>      data.variant = ".bridge";
>      data.required_struct_types = base_required_struct_types;
>      data.required_struct_types_len = ARRAY_SIZE(base_required_struct_types);
> -    test_acpi_one("-device pci-bridge,chassis_nr=1",
> +    test_acpi_one(NULL, "-device pci-bridge,chassis_nr=1",
>                    &data);
>      free_test_data(&data);
>  }
> @@ -761,7 +766,8 @@ static void test_acpi_piix4_tcg_cphp(void)
>      memset(&data, 0, sizeof(data));
>      data.machine = MACHINE_PC;
>      data.variant = ".cphp";
> -    test_acpi_one("-smp 2,cores=3,sockets=2,maxcpus=6"
> +    test_acpi_one(NULL,
> +                  "-smp 2,cores=3,sockets=2,maxcpus=6"
>                    " -numa node -numa node"
>                    " -numa dist,src=0,dst=1,val=21",
>                    &data);
> @@ -775,7 +781,8 @@ static void test_acpi_q35_tcg_cphp(void)
>      memset(&data, 0, sizeof(data));
>      data.machine = MACHINE_Q35;
>      data.variant = ".cphp";
> -    test_acpi_one(" -smp 2,cores=3,sockets=2,maxcpus=6"
> +    test_acpi_one(NULL,
> +                  " -smp 2,cores=3,sockets=2,maxcpus=6"
>                    " -numa node -numa node"
>                    " -numa dist,src=0,dst=1,val=21",
>                    &data);
> @@ -795,7 +802,8 @@ static void test_acpi_q35_tcg_ipmi(void)
>      data.variant = ".ipmibt";
>      data.required_struct_types = ipmi_required_struct_types;
>      data.required_struct_types_len = ARRAY_SIZE(ipmi_required_struct_types);
> -    test_acpi_one("-device ipmi-bmc-sim,id=bmc0"
> +    test_acpi_one(NULL,
> +                  "-device ipmi-bmc-sim,id=bmc0"
>                    " -device isa-ipmi-bt,bmc=bmc0",
>                    &data);
>      free_test_data(&data);
> @@ -813,7 +821,8 @@ static void test_acpi_piix4_tcg_ipmi(void)
>      data.variant = ".ipmikcs";
>      data.required_struct_types = ipmi_required_struct_types;
>      data.required_struct_types_len = ARRAY_SIZE(ipmi_required_struct_types);
> -    test_acpi_one("-device ipmi-bmc-sim,id=bmc0"
> +    test_acpi_one(NULL,
> +                  "-device ipmi-bmc-sim,id=bmc0"
>                    " -device isa-ipmi-kcs,irq=0,bmc=bmc0",
>                    &data);
>      free_test_data(&data);
> @@ -826,7 +835,8 @@ static void test_acpi_q35_tcg_memhp(void)
>      memset(&data, 0, sizeof(data));
>      data.machine = MACHINE_Q35;
>      data.variant = ".memhp";
> -    test_acpi_one(" -m 128,slots=3,maxmem=1G"
> +    test_acpi_one(NULL,
> +                  " -m 128,slots=3,maxmem=1G"
>                    " -numa node -numa node"
>                    " -numa dist,src=0,dst=1,val=21",
>                    &data);
> @@ -840,7 +850,8 @@ static void test_acpi_piix4_tcg_memhp(void)
>      memset(&data, 0, sizeof(data));
>      data.machine = MACHINE_PC;
>      data.variant = ".memhp";
> -    test_acpi_one(" -m 128,slots=3,maxmem=1G"
> +    test_acpi_one(NULL,
> +                  " -m 128,slots=3,maxmem=1G"
>                    " -numa node -numa node"
>                    " -numa dist,src=0,dst=1,val=21",
>                    &data);
> @@ -854,7 +865,8 @@ static void test_acpi_q35_tcg_numamem(void)
>      memset(&data, 0, sizeof(data));
>      data.machine = MACHINE_Q35;
>      data.variant = ".numamem";
> -    test_acpi_one(" -numa node -numa node,mem=128", &data);
> +    test_acpi_one(NULL,
> +                  " -numa node -numa node,mem=128", &data);
>      free_test_data(&data);
>  }
>  
> @@ -865,7 +877,8 @@ static void test_acpi_piix4_tcg_numamem(void)
>      memset(&data, 0, sizeof(data));
>      data.machine = MACHINE_PC;
>      data.variant = ".numamem";
> -    test_acpi_one(" -numa node -numa node,mem=128", &data);
> +    test_acpi_one(NULL,
> +                  " -numa node -numa node,mem=128", &data);
>      free_test_data(&data);
>  }
>  

^ permalink raw reply	[flat|nested] 14+ messages in thread

* Re: [Qemu-devel] [PATCH v3 5/5] tests/bios-tables-test: add test cases for DIMM proximity
  2018-03-05  6:57 ` [Qemu-devel] [PATCH v3 5/5] tests/bios-tables-test: add test cases for DIMM proximity Haozhong Zhang
@ 2018-03-07 12:02   ` Igor Mammedov
  0 siblings, 0 replies; 14+ messages in thread
From: Igor Mammedov @ 2018-03-07 12:02 UTC (permalink / raw)
  To: Haozhong Zhang
  Cc: qemu-devel, mst, Xiao Guangrong, Paolo Bonzini,
	Richard Henderson, Eduardo Habkost, Marcel Apfelbaum,
	Stefan Hajnoczi, Dan Williams

On Mon,  5 Mar 2018 14:57:10 +0800
Haozhong Zhang <haozhong.zhang@intel.com> wrote:

> QEMU now builds one SRAT memory affinity structure for each
> static-plugged PC-DIMM and NVDIMM device with the proximity domain
> specified in the device option 'node', rather than only one SRAT
> memory affinity structure covering the entire hotpluggable address
> space with the proximity domain of the last node.
> 
> Add test cases on PC and Q35 machines with 3 proximity domains, and
> one PC-DIMM and one NVDIMM attached to the second proximity domain.
> Check whether the QEMU-built SRAT tables match with the expected ones.
> 
> Signed-off-by: Haozhong Zhang <haozhong.zhang@intel.com>
> Suggested-by: Igor Mammedov <imammedo@redhat.com>
> ---
>  tests/acpi-test-data/pc/APIC.dimmpxm  | Bin 0 -> 136 bytes
>  tests/acpi-test-data/pc/DSDT.dimmpxm  | Bin 0 -> 6710 bytes
>  tests/acpi-test-data/pc/NFIT.dimmpxm  | Bin 0 -> 224 bytes
>  tests/acpi-test-data/pc/SRAT.dimmpxm  | Bin 0 -> 416 bytes
>  tests/acpi-test-data/pc/SSDT.dimmpxm  | Bin 0 -> 685 bytes
>  tests/acpi-test-data/q35/APIC.dimmpxm | Bin 0 -> 136 bytes
>  tests/acpi-test-data/q35/DSDT.dimmpxm | Bin 0 -> 9394 bytes
>  tests/acpi-test-data/q35/NFIT.dimmpxm | Bin 0 -> 224 bytes
>  tests/acpi-test-data/q35/SRAT.dimmpxm | Bin 0 -> 416 bytes
>  tests/acpi-test-data/q35/SSDT.dimmpxm | Bin 0 -> 685 bytes
>  tests/bios-tables-test.c              |  33 +++++++++++++++++++++++++++++++++
>  11 files changed, 33 insertions(+)
>  create mode 100644 tests/acpi-test-data/pc/APIC.dimmpxm
>  create mode 100644 tests/acpi-test-data/pc/DSDT.dimmpxm
>  create mode 100644 tests/acpi-test-data/pc/NFIT.dimmpxm
>  create mode 100644 tests/acpi-test-data/pc/SRAT.dimmpxm
>  create mode 100644 tests/acpi-test-data/pc/SSDT.dimmpxm
>  create mode 100644 tests/acpi-test-data/q35/APIC.dimmpxm
>  create mode 100644 tests/acpi-test-data/q35/DSDT.dimmpxm
>  create mode 100644 tests/acpi-test-data/q35/NFIT.dimmpxm
>  create mode 100644 tests/acpi-test-data/q35/SRAT.dimmpxm
>  create mode 100644 tests/acpi-test-data/q35/SSDT.dimmpxm
drop binary blobs from patch,
just add in patch description which tables new and differ
from default ones, like

Note to maintainer, please update/add following tables
  tests/acpi-test-data/pc/APIC.dimmpxm
  tests/acpi-test-data/pc/NFIT.dimmpxm
  tests/acpi-test-data/pc/SRAT.dimmpxm
  ...

If you wish to simplify testing for reviewers it's ok post
an additional patch with blobs and "DO NOT APPLY" note in subj.

> 
> diff --git a/tests/acpi-test-data/pc/APIC.dimmpxm b/tests/acpi-test-data/pc/APIC.dimmpxm
> new file mode 100644
> index 0000000000000000000000000000000000000000..658d7e748e37540ff85a02f4391efc7eaae3c8b4
> GIT binary patch
> literal 136
> zcmZ<^@O18AU|?W8>g4b25v<@85#a0y6k`O6f!H9Lf#JbFFwFr}2jX%tGD2u3CJ@cY
> q0}?#&4@5F?0WpXHVzIIUX<iVElM}|`0xE!radU%NENuUQMgRcNAq@cl
> 
> literal 0
> HcmV?d00001
> 
> diff --git a/tests/acpi-test-data/pc/DSDT.dimmpxm b/tests/acpi-test-data/pc/DSDT.dimmpxm
> new file mode 100644
> index 0000000000000000000000000000000000000000..20e6433725bb3e70085cf6227f981106772bdaea
> GIT binary patch
> literal 6710
> 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
> 
> literal 0
> HcmV?d00001
> 
> diff --git a/tests/acpi-test-data/pc/NFIT.dimmpxm b/tests/acpi-test-data/pc/NFIT.dimmpxm
> new file mode 100644
> index 0000000000000000000000000000000000000000..207328ed9357409e4098df64f951a29527ab52de
> GIT binary patch
> literal 224
> zcmeZs^9*^wz`(#5;N<V@5v<@85#a0x6k`O6f!H7#0xTF<7?{CKkXYsA4{4vblsK$$
> z<~5es-g6r$!~s>y0aC=#03w0rG8iy0L6|`OtRNOx9x8-HL3Fb)1OQdFH828oB7<-f
> NAqGZ>^~k~m*#MLQ69E7K  
> 
> literal 0
> HcmV?d00001
> 
> diff --git a/tests/acpi-test-data/pc/SRAT.dimmpxm b/tests/acpi-test-data/pc/SRAT.dimmpxm
> new file mode 100644
> index 0000000000000000000000000000000000000000..b308d09b94cb8547f611bf8eb3a956359a71576c
> GIT binary patch
> literal 416
> zcmWFzatv9($iTp8?d0$55v<@85#SsQ6axw|fY=}!gyBE{ozKXKD$m4(%xBbq>x446
> z-~!my0WAQ74{&KX11Qd@0p~G66~br~cQR_gg;}8LU^JRKs4M{r$zGU#4wx2Z7z0Qn
> ZspEjU6t0dPMIGFI0#J1?VA9Cu0RYf$3jqKC
> 
> literal 0
> HcmV?d00001
> 
> diff --git a/tests/acpi-test-data/pc/SSDT.dimmpxm b/tests/acpi-test-data/pc/SSDT.dimmpxm
> new file mode 100644
> index 0000000000000000000000000000000000000000..2d5b721bcf9c398feb6d005761f898015042e8a4
> GIT binary patch
> literal 685
> zcmZXSKZw(C6vtnha!u0~lD6O<%8~6xbDe}6G))>CXws6TMaV(^RC>L(!w>Hk5uvTa
> z=?OwFn~0>6QE?aCT%DZU4_w7Xa8Q3QhlA(x-Y@U_^4{nB<L5Y<`!)x_+-~*Mjw4w^
> z%`i>+4FIjXeHF7{?d<zb%lB689je=$-!Zg`qV^40-fcp?TeVcBTOnrKRL0)I>Ki?#
> zbd~4x^lU38j7uPR%M#XE%he6ZTQ*Q&J6g9b+3let=>toZbj7~2_*w9l)l9X!ZA<ED  
> zio5t#NUq0oAYzRd(yzje^{aF7>F4TR{A2%pu(_FR$MZ5GXAR$9KD)R1R8>#E7$4s?  
> zKSaUiN>-QO6jiZuF0R)cNaYvfAi4G^9>ZBY2_PxPQ%FUY$pS;>NJb73jZBd(X*`Ud  
> z&-i?NGNWsr%m5<tI2w@=GLtd7I!0bTACd<l&qC<c5FNr^YoH&AIlz379@GV2bIg2-
> zH#Rw(&VaKWSAn`&uyw;Nay{K~flM$F>_N+y9WhLGi@}b}bZ{B~9Wfvna9C14i?d2f  
> z*OHSUJPs*V!o?wVmjkaB@KVM|iS!gh{gzLcbA+l9fzfN3AxJX{@b5&7acT*ezxqZ<
> zws2T<e-w_6q9F2C4QnXNoUdp$bJ-!|t+uJUo2h)RF8+G~eC|STUg+$9I?Lg^D#N$m
> Fg+DfN!vO#Q
> 
> literal 0
> HcmV?d00001
> 
> diff --git a/tests/acpi-test-data/q35/APIC.dimmpxm b/tests/acpi-test-data/q35/APIC.dimmpxm
> new file mode 100644
> index 0000000000000000000000000000000000000000..658d7e748e37540ff85a02f4391efc7eaae3c8b4
> GIT binary patch
> literal 136
> zcmZ<^@O18AU|?W8>g4b25v<@85#a0y6k`O6f!H9Lf#JbFFwFr}2jX%tGD2u3CJ@cY
> q0}?#&4@5F?0WpXHVzIIUX<iVElM}|`0xE!radU%NENuUQMgRcNAq@cl
> 
> literal 0
> HcmV?d00001
> 
> diff --git a/tests/acpi-test-data/q35/DSDT.dimmpxm b/tests/acpi-test-data/q35/DSDT.dimmpxm
> new file mode 100644
> index 0000000000000000000000000000000000000000..92f2385765ccba9b8cac2db64a68a96caeaab373
> GIT binary patch
> literal 9394
> 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  
> Ac>n+a  
> 
> literal 0
> HcmV?d00001
> 
> diff --git a/tests/acpi-test-data/q35/NFIT.dimmpxm b/tests/acpi-test-data/q35/NFIT.dimmpxm
> new file mode 100644
> index 0000000000000000000000000000000000000000..207328ed9357409e4098df64f951a29527ab52de
> GIT binary patch
> literal 224
> zcmeZs^9*^wz`(#5;N<V@5v<@85#a0x6k`O6f!H7#0xTF<7?{CKkXYsA4{4vblsK$$
> z<~5es-g6r$!~s>y0aC=#03w0rG8iy0L6|`OtRNOx9x8-HL3Fb)1OQdFH828oB7<-f
> NAqGZ>^~k~m*#MLQ69E7K  
> 
> literal 0
> HcmV?d00001
> 
> diff --git a/tests/acpi-test-data/q35/SRAT.dimmpxm b/tests/acpi-test-data/q35/SRAT.dimmpxm
> new file mode 100644
> index 0000000000000000000000000000000000000000..b308d09b94cb8547f611bf8eb3a956359a71576c
> GIT binary patch
> literal 416
> zcmWFzatv9($iTp8?d0$55v<@85#SsQ6axw|fY=}!gyBE{ozKXKD$m4(%xBbq>x446
> z-~!my0WAQ74{&KX11Qd@0p~G66~br~cQR_gg;}8LU^JRKs4M{r$zGU#4wx2Z7z0Qn
> ZspEjU6t0dPMIGFI0#J1?VA9Cu0RYf$3jqKC
> 
> literal 0
> HcmV?d00001
> 
> diff --git a/tests/acpi-test-data/q35/SSDT.dimmpxm b/tests/acpi-test-data/q35/SSDT.dimmpxm
> new file mode 100644
> index 0000000000000000000000000000000000000000..2d5b721bcf9c398feb6d005761f898015042e8a4
> GIT binary patch
> literal 685
> zcmZXSKZw(C6vtnha!u0~lD6O<%8~6xbDe}6G))>CXws6TMaV(^RC>L(!w>Hk5uvTa
> z=?OwFn~0>6QE?aCT%DZU4_w7Xa8Q3QhlA(x-Y@U_^4{nB<L5Y<`!)x_+-~*Mjw4w^
> z%`i>+4FIjXeHF7{?d<zb%lB689je=$-!Zg`qV^40-fcp?TeVcBTOnrKRL0)I>Ki?#
> zbd~4x^lU38j7uPR%M#XE%he6ZTQ*Q&J6g9b+3let=>toZbj7~2_*w9l)l9X!ZA<ED  
> zio5t#NUq0oAYzRd(yzje^{aF7>F4TR{A2%pu(_FR$MZ5GXAR$9KD)R1R8>#E7$4s?  
> zKSaUiN>-QO6jiZuF0R)cNaYvfAi4G^9>ZBY2_PxPQ%FUY$pS;>NJb73jZBd(X*`Ud  
> z&-i?NGNWsr%m5<tI2w@=GLtd7I!0bTACd<l&qC<c5FNr^YoH&AIlz379@GV2bIg2-
> zH#Rw(&VaKWSAn`&uyw;Nay{K~flM$F>_N+y9WhLGi@}b}bZ{B~9Wfvna9C14i?d2f  
> z*OHSUJPs*V!o?wVmjkaB@KVM|iS!gh{gzLcbA+l9fzfN3AxJX{@b5&7acT*ezxqZ<
> zws2T<e-w_6q9F2C4QnXNoUdp$bJ-!|t+uJUo2h)RF8+G~eC|STUg+$9I?Lg^D#N$m
> Fg+DfN!vO#Q
> 
> literal 0
> HcmV?d00001
> 
> diff --git a/tests/bios-tables-test.c b/tests/bios-tables-test.c
> index d45181aa51..319cf84c1a 100644
> --- a/tests/bios-tables-test.c
> +++ b/tests/bios-tables-test.c
> @@ -882,6 +882,37 @@ static void test_acpi_piix4_tcg_numamem(void)
>      free_test_data(&data);
>  }
>  
> +static void test_acpi_tcg_dimm_pxm(const char *machine)
> +{
> +    test_data data;
> +
> +    memset(&data, 0, sizeof(data));
> +    data.machine = machine;
> +    data.variant = ".dimmpxm";
> +    test_acpi_one("nvdimm=on",
> +                  " -smp 3"
> +                  " -m 128M,slots=3,maxmem=1G"


> +                  " -numa node,mem=32M,cpus=0,nodeid=0"
I'd use new CLI syntax to specify CPUs, see pc_numa_cpu(),
so we won't have to touch it later when deprecating "cpus="
option.


> +                  " -numa node,mem=32M,cpus=1,nodeid=1"
> +                  " -numa node,mem=64M,cpus=2,nodeid=2"
> +                  " -object memory-backend-ram,id=ram0,size=128M"
> +                  " -object memory-backend-ram,id=nvm0,size=128M"
> +                  " -device pc-dimm,id=dimm0,memdev=ram0,node=1"
> +                  " -device nvdimm,id=dimm1,memdev=nvm0,node=1",
maybe use a different node for dimm and nvdimm

> +                  &data);
> +    free_test_data(&data);
> +}
> +
> +static void test_acpi_q35_tcg_dimm_pxm(void)
> +{
> +    test_acpi_tcg_dimm_pxm(MACHINE_Q35);
> +}
> +
> +static void test_acpi_piix4_tcg_dimm_pxm(void)
> +{
> +    test_acpi_tcg_dimm_pxm(MACHINE_PC);
> +}
> +
>  int main(int argc, char *argv[])
>  {
>      const char *arch = qtest_get_arch();
> @@ -906,6 +937,8 @@ int main(int argc, char *argv[])
>          qtest_add_func("acpi/q35/memhp", test_acpi_q35_tcg_memhp);
>          qtest_add_func("acpi/piix4/numamem", test_acpi_piix4_tcg_numamem);
>          qtest_add_func("acpi/q35/numamem", test_acpi_q35_tcg_numamem);
> +        qtest_add_func("acpi/piix4/dimmpxm", test_acpi_piix4_tcg_dimm_pxm);
> +        qtest_add_func("acpi/q35/dimmpxm", test_acpi_q35_tcg_dimm_pxm);
>      }
>      ret = g_test_run();
>      boot_sector_cleanup(disk);

^ permalink raw reply	[flat|nested] 14+ messages in thread

end of thread, other threads:[~2018-03-07 12:02 UTC | newest]

Thread overview: 14+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-03-05  6:57 [Qemu-devel] [PATCH v3 0/5] hw/acpi-build: build SRAT memory affinity structures for DIMM devices Haozhong Zhang
2018-03-05  6:57 ` [Qemu-devel] [PATCH v3 1/5] pc-dimm: refactor qmp_pc_dimm_device_list Haozhong Zhang
2018-03-07 10:10   ` Igor Mammedov
2018-03-05  6:57 ` [Qemu-devel] [PATCH v3 2/5] qmp: distinguish PC-DIMM and NVDIMM in MemoryDeviceInfoList Haozhong Zhang
2018-03-05 19:14   ` Eric Blake
2018-03-06  0:24     ` Haozhong Zhang
2018-03-06 12:34     ` Igor Mammedov
2018-03-07 10:21   ` Igor Mammedov
2018-03-05  6:57 ` [Qemu-devel] [PATCH v3 3/5] hw/acpi-build: build SRAT memory affinity structures for DIMM devices Haozhong Zhang
2018-03-07 10:30   ` Igor Mammedov
2018-03-05  6:57 ` [Qemu-devel] [PATCH v3 4/5] tests/bios-tables-test: allow setting extra machine options Haozhong Zhang
2018-03-07 10:40   ` Igor Mammedov
2018-03-05  6:57 ` [Qemu-devel] [PATCH v3 5/5] tests/bios-tables-test: add test cases for DIMM proximity Haozhong Zhang
2018-03-07 12:02   ` Igor Mammedov

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.