* [Qemu-devel] [PATCH v6 0/5] hw/acpi-build: build SRAT memory affinity structures for DIMM devices
@ 2018-03-11 3:02 Haozhong Zhang
2018-03-11 3:02 ` [Qemu-devel] [PATCH v6 1/5] pc-dimm: make qmp_pc_dimm_device_list() sort devices by address Haozhong Zhang
` (4 more replies)
0 siblings, 5 replies; 7+ messages in thread
From: Haozhong Zhang @ 2018-03-11 3:02 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
(Patch 5 is only for reviewers to run test cases in patch 4)
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 v6:
* (Patch 2) Fix the commit message.
Changes in v5:
* (Patch 2) Inline qmp nvdimm info in MemoryDeviceInfo.
Changes in v4:
* (Patch 1) Update the commit message and add R-b from Igor Mammedov.
* (Patch 2) Rebase on misc.json and update the commit message.
* (Patch 3) Directly use di-addr and di-node.
* (Patch 4) Drop the previous v3 patch 3 and add '-machine nvdimm=on'
to parameters of test_acpi_one().
* (Patch 4) Put PC-DIMM and NVDIMM to different numa nodes.
* (Patch 4&5) Move binary blobs of ACPI tables to DO-NOT-APPLY patch 5.
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: make qmp_pc_dimm_device_list() sort devices by address
qmp: distinguish PC-DIMM and NVDIMM in MemoryDeviceInfoList
hw/acpi-build: build SRAT memory affinity structures for DIMM devices
tests/bios-tables-test: add test cases for DIMM proximity
test/acpi-test-data: add ACPI tables for dimmpxm test
hmp.c | 14 ++++--
hw/i386/acpi-build.c | 56 +++++++++++++++++++--
hw/mem/pc-dimm.c | 91 +++++++++++++++++++---------------
hw/ppc/spapr.c | 3 +-
include/hw/mem/pc-dimm.h | 2 +-
numa.c | 23 +++++----
qapi/misc.json | 6 ++-
qmp.c | 7 +--
stubs/qmp_pc_dimm.c | 4 +-
tests/acpi-test-data/pc/APIC.dimmpxm | Bin 0 -> 144 bytes
tests/acpi-test-data/pc/DSDT.dimmpxm | Bin 0 -> 6803 bytes
tests/acpi-test-data/pc/NFIT.dimmpxm | Bin 0 -> 224 bytes
tests/acpi-test-data/pc/SRAT.dimmpxm | Bin 0 -> 472 bytes
tests/acpi-test-data/pc/SSDT.dimmpxm | Bin 0 -> 685 bytes
tests/acpi-test-data/q35/APIC.dimmpxm | Bin 0 -> 144 bytes
tests/acpi-test-data/q35/DSDT.dimmpxm | Bin 0 -> 9487 bytes
tests/acpi-test-data/q35/NFIT.dimmpxm | Bin 0 -> 224 bytes
tests/acpi-test-data/q35/SRAT.dimmpxm | Bin 0 -> 472 bytes
tests/acpi-test-data/q35/SSDT.dimmpxm | Bin 0 -> 685 bytes
tests/bios-tables-test.c | 38 ++++++++++++++
20 files changed, 177 insertions(+), 67 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] 7+ messages in thread
* [Qemu-devel] [PATCH v6 1/5] pc-dimm: make qmp_pc_dimm_device_list() sort devices by address
2018-03-11 3:02 [Qemu-devel] [PATCH v6 0/5] hw/acpi-build: build SRAT memory affinity structures for DIMM devices Haozhong Zhang
@ 2018-03-11 3:02 ` Haozhong Zhang
2018-03-11 3:02 ` [Qemu-devel] [PATCH v6 2/5] qmp: distinguish PC-DIMM and NVDIMM in MemoryDeviceInfoList Haozhong Zhang
` (3 subsequent siblings)
4 siblings, 0 replies; 7+ messages in thread
From: Haozhong Zhang @ 2018-03-11 3:02 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
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()
Signed-off-by: Haozhong Zhang <haozhong.zhang@intel.com>
Reviewed-by: Igor Mammedov <imammedo@redhat.com>
Acked-by: David Gibson <david@gibson.dropbear.id.au> for ppc part
Reviewed-by: Bharata B Rao <bharata@linux.vnet.ibm.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 7e1c858566..44a0670d11 100644
--- a/hw/ppc/spapr.c
+++ b/hw/ppc/spapr.c
@@ -722,8 +722,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 398e2c9a85..94427046ec 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 8c7d1cc479..4b2517d8b5 100644
--- a/qmp.c
+++ b/qmp.c
@@ -731,12 +731,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] 7+ messages in thread
* [Qemu-devel] [PATCH v6 2/5] qmp: distinguish PC-DIMM and NVDIMM in MemoryDeviceInfoList
2018-03-11 3:02 [Qemu-devel] [PATCH v6 0/5] hw/acpi-build: build SRAT memory affinity structures for DIMM devices Haozhong Zhang
2018-03-11 3:02 ` [Qemu-devel] [PATCH v6 1/5] pc-dimm: make qmp_pc_dimm_device_list() sort devices by address Haozhong Zhang
@ 2018-03-11 3:02 ` Haozhong Zhang
2018-03-12 17:02 ` Igor Mammedov
2018-03-11 3:02 ` [Qemu-devel] [PATCH v6 3/5] hw/acpi-build: build SRAT memory affinity structures for DIMM devices Haozhong Zhang
` (2 subsequent siblings)
4 siblings, 1 reply; 7+ messages in thread
From: Haozhong Zhang @ 2018-03-11 3:02 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.
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 <haozhong.zhang@intel.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
---
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 QDict *qdict)
switch (value->type) {
case MEMORY_DEVICE_INFO_KIND_DIMM:
di = value->u.dimm.data;
+ break;
+
+ case MEMORY_DEVICE_INFO_KIND_NVDIMM:
+ di = 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 : "");
@@ -2434,9 +2445,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..51350d9c2d 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"
@@ -250,6 +251,7 @@ MemoryDeviceInfoList *qmp_pc_dimm_device_list(void)
MemoryDeviceInfoList *elem = g_new0(MemoryDeviceInfoList, 1);
MemoryDeviceInfo *info = g_new0(MemoryDeviceInfo, 1);
PCDIMMDeviceInfo *di = g_new0(PCDIMMDeviceInfo, 1);
+ bool is_nvdimm = object_dynamic_cast(obj, TYPE_NVDIMM);
DeviceClass *dc = DEVICE_GET_CLASS(obj);
DeviceState *dev = DEVICE(obj);
@@ -265,7 +267,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 = di;
+ info->type = MEMORY_DEVICE_INFO_KIND_NVDIMM;
+ }
elem->value = info;
elem->next = 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[])
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 = 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/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'
+ }
+}
##
# @query-memory-devices:
--
2.14.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [Qemu-devel] [PATCH v6 3/5] hw/acpi-build: build SRAT memory affinity structures for DIMM devices
2018-03-11 3:02 [Qemu-devel] [PATCH v6 0/5] hw/acpi-build: build SRAT memory affinity structures for DIMM devices Haozhong Zhang
2018-03-11 3:02 ` [Qemu-devel] [PATCH v6 1/5] pc-dimm: make qmp_pc_dimm_device_list() sort devices by address Haozhong Zhang
2018-03-11 3:02 ` [Qemu-devel] [PATCH v6 2/5] qmp: distinguish PC-DIMM and NVDIMM in MemoryDeviceInfoList Haozhong Zhang
@ 2018-03-11 3:02 ` Haozhong Zhang
2018-03-11 3:02 ` [Qemu-devel] [PATCH v6 4/5] tests/bios-tables-test: add test cases for DIMM proximity Haozhong Zhang
2018-03-11 3:02 ` [Qemu-devel] [PATCH v6 5/5] test/acpi-test-data: add ACPI tables for dimmpxm test Haozhong Zhang
4 siblings, 0 replies; 7+ messages in thread
From: Haozhong Zhang @ 2018-03-11 3:02 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 | 56 ++++++++++++++++++++++++++++++++++++++++++++++++----
1 file changed, 52 insertions(+), 4 deletions(-)
diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c
index deb440f286..2c1f694da4 100644
--- a/hw/i386/acpi-build.c
+++ b/hw/i386/acpi-build.c
@@ -2323,6 +2323,55 @@ 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, size;
+ 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 : mi->u.nvdimm.data;
+
+ if (cur < di->addr) {
+ build_srat_memory(numamem, cur, di->addr - cur, default_node,
+ MEM_AFFINITY_HOTPLUGGABLE | MEM_AFFINITY_ENABLED);
+ numamem = acpi_data_push(table_data, sizeof *numamem);
+ }
+
+ size = di->size;
+
+ flags = MEM_AFFINITY_ENABLED;
+ if (di->hotpluggable) {
+ flags |= MEM_AFFINITY_HOTPLUGGABLE;
+ }
+ if (is_nvdimm) {
+ flags |= MEM_AFFINITY_NON_VOLATILE;
+ }
+
+ build_srat_memory(numamem, di->addr, size, di->node, flags);
+ }
+
+ qapi_free_MemoryDeviceInfoList(info_list);
+}
+
static void
build_srat(GArray *table_data, BIOSLinker *linker, MachineState *machine)
{
@@ -2434,10 +2483,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] 7+ messages in thread
* [Qemu-devel] [PATCH v6 4/5] tests/bios-tables-test: add test cases for DIMM proximity
2018-03-11 3:02 [Qemu-devel] [PATCH v6 0/5] hw/acpi-build: build SRAT memory affinity structures for DIMM devices Haozhong Zhang
` (2 preceding siblings ...)
2018-03-11 3:02 ` [Qemu-devel] [PATCH v6 3/5] hw/acpi-build: build SRAT memory affinity structures for DIMM devices Haozhong Zhang
@ 2018-03-11 3:02 ` Haozhong Zhang
2018-03-11 3:02 ` [Qemu-devel] [PATCH v6 5/5] test/acpi-test-data: add ACPI tables for dimmpxm test Haozhong Zhang
4 siblings, 0 replies; 7+ messages in thread
From: Haozhong Zhang @ 2018-03-11 3:02 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 PC-DIMM
and NVDIMM device presented at boot time 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 4 proximity domains, and
one PC-DIMM and one NVDIMM attached to the 2nd and 3rd proximity
domains respectively. Check whether the QEMU-built SRAT tables match
with the expected ones.
The following ACPI tables need to be added for this test:
tests/acpi-test-data/pc/APIC.dimmpxm
tests/acpi-test-data/pc/DSDT.dimmpxm
tests/acpi-test-data/pc/NFIT.dimmpxm
tests/acpi-test-data/pc/SRAT.dimmpxm
tests/acpi-test-data/pc/SSDT.dimmpxm
tests/acpi-test-data/q35/APIC.dimmpxm
tests/acpi-test-data/q35/DSDT.dimmpxm
tests/acpi-test-data/q35/NFIT.dimmpxm
tests/acpi-test-data/q35/SRAT.dimmpxm
tests/acpi-test-data/q35/SSDT.dimmpxm
New APIC and DSDT are needed because of the multiple processors
configuration. New NFIT and SSDT are needed because of NVDIMM.
Signed-off-by: Haozhong Zhang <haozhong.zhang@intel.com>
Suggested-by: Igor Mammedov <imammedo@redhat.com>
---
tests/bios-tables-test.c | 38 ++++++++++++++++++++++++++++++++++++++
1 file changed, 38 insertions(+)
diff --git a/tests/bios-tables-test.c b/tests/bios-tables-test.c
index 65b271a173..34b55ff812 100644
--- a/tests/bios-tables-test.c
+++ b/tests/bios-tables-test.c
@@ -869,6 +869,42 @@ 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(" -machine nvdimm=on"
+ " -smp 4,sockets=4"
+ " -m 128M,slots=3,maxmem=1G"
+ " -numa node,mem=32M,nodeid=0"
+ " -numa node,mem=32M,nodeid=1"
+ " -numa node,mem=32M,nodeid=2"
+ " -numa node,mem=32M,nodeid=3"
+ " -numa cpu,node-id=0,socket-id=0"
+ " -numa cpu,node-id=1,socket-id=1"
+ " -numa cpu,node-id=2,socket-id=2"
+ " -numa cpu,node-id=3,socket-id=3"
+ " -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=2",
+ &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();
@@ -893,6 +929,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] 7+ messages in thread
* [Qemu-devel] [PATCH v6 5/5] test/acpi-test-data: add ACPI tables for dimmpxm test
2018-03-11 3:02 [Qemu-devel] [PATCH v6 0/5] hw/acpi-build: build SRAT memory affinity structures for DIMM devices Haozhong Zhang
` (3 preceding siblings ...)
2018-03-11 3:02 ` [Qemu-devel] [PATCH v6 4/5] tests/bios-tables-test: add test cases for DIMM proximity Haozhong Zhang
@ 2018-03-11 3:02 ` Haozhong Zhang
4 siblings, 0 replies; 7+ messages in thread
From: Haozhong Zhang @ 2018-03-11 3:02 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
Reviewers can use ACPI tables in this patch to run
test_acpi_{piix4,q35}_tcg_dimm_pxm cases.
Signed-off-by: Haozhong Zhang <haozhong.zhang@intel.com>
---
tests/acpi-test-data/pc/APIC.dimmpxm | Bin 0 -> 144 bytes
tests/acpi-test-data/pc/DSDT.dimmpxm | Bin 0 -> 6803 bytes
tests/acpi-test-data/pc/NFIT.dimmpxm | Bin 0 -> 224 bytes
tests/acpi-test-data/pc/SRAT.dimmpxm | Bin 0 -> 472 bytes
tests/acpi-test-data/pc/SSDT.dimmpxm | Bin 0 -> 685 bytes
tests/acpi-test-data/q35/APIC.dimmpxm | Bin 0 -> 144 bytes
tests/acpi-test-data/q35/DSDT.dimmpxm | Bin 0 -> 9487 bytes
tests/acpi-test-data/q35/NFIT.dimmpxm | Bin 0 -> 224 bytes
tests/acpi-test-data/q35/SRAT.dimmpxm | Bin 0 -> 472 bytes
tests/acpi-test-data/q35/SSDT.dimmpxm | Bin 0 -> 685 bytes
10 files changed, 0 insertions(+), 0 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
diff --git a/tests/acpi-test-data/pc/APIC.dimmpxm b/tests/acpi-test-data/pc/APIC.dimmpxm
new file mode 100644
index 0000000000000000000000000000000000000000..427bb08248e6a029c1c988f74f5e48f93ee4ebe0
GIT binary patch
literal 144
zcmZ<^@N}NQz`($`&dJ}|BUr&HBEZ=ZD8>jB1F=Cg1H*%VV44G{4#eePWQ5R6Oc0ux
t8ALPkfFuw61CdNzKn!AlSgfo-nis_4<b<)ffC?aD+}vOm3)_F75dauy4FLcE
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..38661cb13ee348718ab45bfc69452cd642cf9bb9
GIT binary patch
literal 6803
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
M&bmz+HgqQb7xYSyTL1t6
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..2bfc6c51f31c25a052803c494c933d4948fc0106
GIT binary patch
literal 224
zcmeZs^9*^wz`(%h@8s|75v<@85#a0x6k`O6f!H7#0xTF<7?{CKCLmdP`9s?0EhP?X
zoOz8Uw)fly3UNTya)1<ZG=NB;xeNvjAoU=?!oUim!15plDuC!_VF&=KYHMHw>O=<N
OCPEC15bKeJ39<o`))N5$
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..3b10a607d5bba6cebb97d9174c2a54a577bba9a8
GIT binary patch
literal 472
zcmWFzatyh_$iTq3-O1nCBUr&HBEUHqC<YW_0I@+d2*ZH@I-ijdRi23nmCwwK%xBbq
zn*?QW!3D6Z16l|MAK=n(22h+)1I}ZDDumG}?q<}03$x%?#|)KbV8gEtrVKxg<UW{t
kIAA*9HUR~Y+{Xd+5nLTROaoXQT$cb;-3ypBTm~or07$zG0RR91
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..8ba0e67cb72daa81a65da4906d37a5e0f4af1fd4
GIT binary patch
literal 685
zcmZXSKZw(C6vtnha!u17ByGVzlq1`X<~j)uk|vD}G-*lFBIF?dq}OXZ{P1oO5!yPO
zo*?wHiAX9L6?ehS)yc`t;lSNRa8Q3QhlA(x-Y@U_^4{nB<L5Y<`?dhU4BCCQ>qyo}
zGfb0y13>%kK*cOryZgS=_PteSm+Cg>cMWY@Q3r-B@3o-Ot68ej+a_kmRL0)I8W?@1
za+T+c^lU38j4L2`%L>+6%he6ZTQ*T(yIQX!*`1Li=|fAEbj7~2_*wFnwOqA(9ZTwK
zio5t#O0Oq#AYz>tvTwqT^{aF7>F3(5<j4N|U~@CwN#<2V&KthJe0Fd1sivNOF+RR)
zeTah1mAo#$DXZf4xwu|)AXQ(CgY?>?WDIA?B!IM>Od%6lCJzjmBN;hFG%`iDwD~Z3
zKI4nY$&9XfG6RUn<0vLEGLtd7I!0c;7?KAe&qC<c5go#Qd#E3Y1;Bie9W(@AbIf9f
zH#Rw(&VaKWSAm9EvUS5PbA8=$flM$F>_N+y9WhL8i@}cEbZ{B~9Wf*ra9CPBOY%xa
z*OHSUJPs*V$|WInR{*ab@KVl5iS!IZ<F-$ibA+l9f%vt|5TuC%{5usBoLT|quf7q|
zEgTlzkHh#V3L<aSv_`Vb`HE&UmmM<RYKN+OxylzB;=dQb7cTVHh0gw`vmCywDt!H2
F`U7Br!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..427bb08248e6a029c1c988f74f5e48f93ee4ebe0
GIT binary patch
literal 144
zcmZ<^@N}NQz`($`&dJ}|BUr&HBEZ=ZD8>jB1F=Cg1H*%VV44G{4#eePWQ5R6Oc0ux
t8ALPkfFuw61CdNzKn!AlSgfo-nis_4<b<)ffC?aD+}vOm3)_F75dauy4FLcE
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..14904e8ea2376abd989aa9e99f5bf388a3b85032
GIT binary patch
literal 9487
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
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..2bfc6c51f31c25a052803c494c933d4948fc0106
GIT binary patch
literal 224
zcmeZs^9*^wz`(%h@8s|75v<@85#a0x6k`O6f!H7#0xTF<7?{CKCLmdP`9s?0EhP?X
zoOz8Uw)fly3UNTya)1<ZG=NB;xeNvjAoU=?!oUim!15plDuC!_VF&=KYHMHw>O=<N
OCPEC15bKeJ39<o`))N5$
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..3b10a607d5bba6cebb97d9174c2a54a577bba9a8
GIT binary patch
literal 472
zcmWFzatyh_$iTq3-O1nCBUr&HBEUHqC<YW_0I@+d2*ZH@I-ijdRi23nmCwwK%xBbq
zn*?QW!3D6Z16l|MAK=n(22h+)1I}ZDDumG}?q<}03$x%?#|)KbV8gEtrVKxg<UW{t
kIAA*9HUR~Y+{Xd+5nLTROaoXQT$cb;-3ypBTm~or07$zG0RR91
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..8ba0e67cb72daa81a65da4906d37a5e0f4af1fd4
GIT binary patch
literal 685
zcmZXSKZw(C6vtnha!u17ByGVzlq1`X<~j)uk|vD}G-*lFBIF?dq}OXZ{P1oO5!yPO
zo*?wHiAX9L6?ehS)yc`t;lSNRa8Q3QhlA(x-Y@U_^4{nB<L5Y<`?dhU4BCCQ>qyo}
zGfb0y13>%kK*cOryZgS=_PteSm+Cg>cMWY@Q3r-B@3o-Ot68ej+a_kmRL0)I8W?@1
za+T+c^lU38j4L2`%L>+6%he6ZTQ*T(yIQX!*`1Li=|fAEbj7~2_*wFnwOqA(9ZTwK
zio5t#O0Oq#AYz>tvTwqT^{aF7>F3(5<j4N|U~@CwN#<2V&KthJe0Fd1sivNOF+RR)
zeTah1mAo#$DXZf4xwu|)AXQ(CgY?>?WDIA?B!IM>Od%6lCJzjmBN;hFG%`iDwD~Z3
zKI4nY$&9XfG6RUn<0vLEGLtd7I!0c;7?KAe&qC<c5go#Qd#E3Y1;Bie9W(@AbIf9f
zH#Rw(&VaKWSAm9EvUS5PbA8=$flM$F>_N+y9WhL8i@}cEbZ{B~9Wf*ra9CPBOY%xa
z*OHSUJPs*V$|WInR{*ab@KVl5iS!IZ<F-$ibA+l9f%vt|5TuC%{5usBoLT|quf7q|
zEgTlzkHh#V3L<aSv_`Vb`HE&UmmM<RYKN+OxylzB;=dQb7cTVHh0gw`vmCywDt!H2
F`U7Br!vO#Q
literal 0
HcmV?d00001
--
2.14.1
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [Qemu-devel] [PATCH v6 2/5] qmp: distinguish PC-DIMM and NVDIMM in MemoryDeviceInfoList
2018-03-11 3:02 ` [Qemu-devel] [PATCH v6 2/5] qmp: distinguish PC-DIMM and NVDIMM in MemoryDeviceInfoList Haozhong Zhang
@ 2018-03-12 17:02 ` Igor Mammedov
0 siblings, 0 replies; 7+ messages in thread
From: Igor Mammedov @ 2018-03-12 17:02 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 Sun, 11 Mar 2018 11:02:12 +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.
>
> 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 <haozhong.zhang@intel.com>
> Reviewed-by: Eric Blake <eblake@redhat.com>
Reviewed-by: Igor Mammedov <imammedo@redhat.com>
> ---
> 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 QDict *qdict)
> switch (value->type) {
> case MEMORY_DEVICE_INFO_KIND_DIMM:
> di = value->u.dimm.data;
> + break;
> +
> + case MEMORY_DEVICE_INFO_KIND_NVDIMM:
> + di = 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 : "");
> @@ -2434,9 +2445,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..51350d9c2d 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"
> @@ -250,6 +251,7 @@ MemoryDeviceInfoList *qmp_pc_dimm_device_list(void)
> MemoryDeviceInfoList *elem = g_new0(MemoryDeviceInfoList, 1);
> MemoryDeviceInfo *info = g_new0(MemoryDeviceInfo, 1);
> PCDIMMDeviceInfo *di = g_new0(PCDIMMDeviceInfo, 1);
> + bool is_nvdimm = object_dynamic_cast(obj, TYPE_NVDIMM);
> DeviceClass *dc = DEVICE_GET_CLASS(obj);
> DeviceState *dev = DEVICE(obj);
>
> @@ -265,7 +267,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 = di;
> + info->type = MEMORY_DEVICE_INFO_KIND_NVDIMM;
> + }
> elem->value = info;
> elem->next = 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[])
>
> 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 = 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/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'
> + }
> +}
>
> ##
> # @query-memory-devices:
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2018-03-12 17:02 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2018-03-11 3:02 [Qemu-devel] [PATCH v6 0/5] hw/acpi-build: build SRAT memory affinity structures for DIMM devices Haozhong Zhang
2018-03-11 3:02 ` [Qemu-devel] [PATCH v6 1/5] pc-dimm: make qmp_pc_dimm_device_list() sort devices by address Haozhong Zhang
2018-03-11 3:02 ` [Qemu-devel] [PATCH v6 2/5] qmp: distinguish PC-DIMM and NVDIMM in MemoryDeviceInfoList Haozhong Zhang
2018-03-12 17:02 ` Igor Mammedov
2018-03-11 3:02 ` [Qemu-devel] [PATCH v6 3/5] hw/acpi-build: build SRAT memory affinity structures for DIMM devices Haozhong Zhang
2018-03-11 3:02 ` [Qemu-devel] [PATCH v6 4/5] tests/bios-tables-test: add test cases for DIMM proximity Haozhong Zhang
2018-03-11 3:02 ` [Qemu-devel] [PATCH v6 5/5] test/acpi-test-data: add ACPI tables for dimmpxm test Haozhong Zhang
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).