Once we have other memory devices that are not ACPI devices (e.g. virtio based), we cannot indicate them via ACPI. So let's skip these devices.
Signed-off-by: David Hildenbrand <da...@redhat.com> --- hw/i386/acpi-build.c | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c index e1ee8ae9e0..2278522b87 100644 --- a/hw/i386/acpi-build.c +++ b/hw/i386/acpi-build.c @@ -2266,7 +2266,6 @@ static void build_srat_hotpluggable_memory(GArray *table_data, uint64_t base, for (cur = base, info = info_list; cur < end; cur += size, info = info->next) { - numamem = acpi_data_push(table_data, sizeof *numamem); if (!info) { /* @@ -2278,19 +2277,30 @@ static void build_srat_hotpluggable_memory(GArray *table_data, uint64_t base, * Memory devices may override proximity set by this entry, * providing _PXM method if necessary. */ + numamem = acpi_data_push(table_data, sizeof *numamem); build_srat_memory(numamem, end - 1, 1, default_node, MEM_AFFINITY_HOTPLUGGABLE | MEM_AFFINITY_ENABLED); break; } mi = info->value; + if (mi->type != MEMORY_DEVICE_INFO_KIND_DIMM && + mi->type != MEMORY_DEVICE_INFO_KIND_NVDIMM) { + /* + * Don't indicate memory devices that are not proper ACPI devices, + * merge them with the empty ranges. + */ + size = 0; + continue; + } + is_nvdimm = (mi->type == MEMORY_DEVICE_INFO_KIND_NVDIMM); di = !is_nvdimm ? mi->u.dimm.data : mi->u.nvdimm.data; if (cur < di->addr) { + numamem = acpi_data_push(table_data, sizeof *numamem); 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; @@ -2303,6 +2313,7 @@ static void build_srat_hotpluggable_memory(GArray *table_data, uint64_t base, flags |= MEM_AFFINITY_NON_VOLATILE; } + numamem = acpi_data_push(table_data, sizeof *numamem); build_srat_memory(numamem, di->addr, size, di->node, flags); } -- 2.17.1