qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: "Michael S. Tsirkin" <mst@redhat.com>
To: qemu-devel@nongnu.org
Cc: Peter Maydell <peter.maydell@linaro.org>,
	Xiao Guangrong <xiaoguangrong.eric@gmail.com>,
	Jingqi Liu <jingqi.liu@intel.com>,
	Eduardo Habkost <ehabkost@redhat.com>,
	Shannon Zhao <shannon.zhaosl@gmail.com>,
	Paolo Bonzini <pbonzini@redhat.com>,
	Vishal Verma <vishal.l.verma@intel.com>,
	Igor Mammedov <imammedo@redhat.com>,
	qemu-arm@nongnu.org, Richard Henderson <rth@twiddle.net>
Subject: [PULL 03/56] hw/acpi/nvdimm: add a helper to augment SRAT generation
Date: Wed, 10 Jun 2020 00:26:38 -0400	[thread overview]
Message-ID: <20200610042613.1459309-4-mst@redhat.com> (raw)
In-Reply-To: <20200610042613.1459309-1-mst@redhat.com>

From: Vishal Verma <vishal.l.verma@intel.com>

NVDIMMs can belong to their own proximity domains, as described by the
NFIT. In such cases, the SRAT needs to have Memory Affinity structures
in the SRAT for these NVDIMMs, otherwise Linux doesn't populate node
data structures properly during NUMA initialization. See the following
for an example failure case.

https://lore.kernel.org/linux-nvdimm/20200416225438.15208-1-vishal.l.verma@intel.com/

Introduce a new helper, nvdimm_build_srat(), and call it for both the
i386 and arm versions of 'build_srat()' to augment the SRAT with
memory affinity information for NVDIMMs.

The relevant command line options to exercise this are below. Nodes 0-1
contain CPUs and regular memory, and nodes 2-3 are the NVDIMM address
space.

    -object memory-backend-ram,id=mem0,size=2048M
    -numa node,nodeid=0,memdev=mem0,
    -numa cpu,node-id=0,socket-id=0
    -object memory-backend-ram,id=mem1,size=2048M
    -numa node,nodeid=1,memdev=mem1,
    -numa cpu,node-id=1,socket-id=1
    -numa node,nodeid=2,
    -object memory-backend-file,id=nvmem0,share,mem-path=nvdimm-0,size=16384M,align=1G
    -device nvdimm,memdev=nvmem0,id=nv0,label-size=2M,node=2
    -numa node,nodeid=3,
    -object memory-backend-file,id=nvmem1,share,mem-path=nvdimm-1,size=16384M,align=1G
    -device nvdimm,memdev=nvmem1,id=nv1,label-size=2M,node=3

Cc: Jingqi Liu <jingqi.liu@intel.com>
Cc: Michael S. Tsirkin <mst@redhat.com>
Reviewed-by: Jingqi Liu <jingqi.liu@intel.com>
Reviewed-by: Igor Mammedov <imammedo@redhat.com>
Signed-off-by: Vishal Verma <vishal.l.verma@intel.com>
Message-Id: <20200606000911.9896-3-vishal.l.verma@intel.com>
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
---
 include/hw/mem/nvdimm.h  |  1 +
 hw/acpi/nvdimm.c         | 23 +++++++++++++++++++++++
 hw/arm/virt-acpi-build.c |  4 ++++
 hw/i386/acpi-build.c     |  5 +++++
 4 files changed, 33 insertions(+)

diff --git a/include/hw/mem/nvdimm.h b/include/hw/mem/nvdimm.h
index a3c08955e8..b67a1aedf6 100644
--- a/include/hw/mem/nvdimm.h
+++ b/include/hw/mem/nvdimm.h
@@ -155,6 +155,7 @@ typedef struct NVDIMMState NVDIMMState;
 void nvdimm_init_acpi_state(NVDIMMState *state, MemoryRegion *io,
                             struct AcpiGenericAddress dsm_io,
                             FWCfgState *fw_cfg, Object *owner);
+void nvdimm_build_srat(GArray *table_data);
 void nvdimm_build_acpi(GArray *table_offsets, GArray *table_data,
                        BIOSLinker *linker, NVDIMMState *state,
                        uint32_t ram_slots);
diff --git a/hw/acpi/nvdimm.c b/hw/acpi/nvdimm.c
index 9316d12b70..8f7cc16add 100644
--- a/hw/acpi/nvdimm.c
+++ b/hw/acpi/nvdimm.c
@@ -28,6 +28,7 @@
 
 #include "qemu/osdep.h"
 #include "qemu/uuid.h"
+#include "qapi/error.h"
 #include "hw/acpi/acpi.h"
 #include "hw/acpi/aml-build.h"
 #include "hw/acpi/bios-linker-loader.h"
@@ -1334,6 +1335,28 @@ static void nvdimm_build_ssdt(GArray *table_offsets, GArray *table_data,
     free_aml_allocator();
 }
 
+void nvdimm_build_srat(GArray *table_data)
+{
+    GSList *device_list = nvdimm_get_device_list();
+
+    for (; device_list; device_list = device_list->next) {
+        AcpiSratMemoryAffinity *numamem = NULL;
+        DeviceState *dev = device_list->data;
+        Object *obj = OBJECT(dev);
+        uint64_t addr, size;
+        int node;
+
+        node = object_property_get_int(obj, PC_DIMM_NODE_PROP, &error_abort);
+        addr = object_property_get_uint(obj, PC_DIMM_ADDR_PROP, &error_abort);
+        size = object_property_get_uint(obj, PC_DIMM_SIZE_PROP, &error_abort);
+
+        numamem = acpi_data_push(table_data, sizeof *numamem);
+        build_srat_memory(numamem, addr, size, node,
+                          MEM_AFFINITY_ENABLED | MEM_AFFINITY_NON_VOLATILE);
+    }
+    g_slist_free(device_list);
+}
+
 void nvdimm_build_acpi(GArray *table_offsets, GArray *table_data,
                        BIOSLinker *linker, NVDIMMState *state,
                        uint32_t ram_slots)
diff --git a/hw/arm/virt-acpi-build.c b/hw/arm/virt-acpi-build.c
index 1b0a584c7b..2cbccd5fe2 100644
--- a/hw/arm/virt-acpi-build.c
+++ b/hw/arm/virt-acpi-build.c
@@ -539,6 +539,10 @@ build_srat(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
         }
     }
 
+    if (ms->nvdimms_state->is_enabled) {
+        nvdimm_build_srat(table_data);
+    }
+
     if (ms->device_memory) {
         numamem = acpi_data_push(table_data, sizeof *numamem);
         build_srat_memory(numamem, ms->device_memory->base,
diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c
index 2e15f6848e..d996525e2c 100644
--- a/hw/i386/acpi-build.c
+++ b/hw/i386/acpi-build.c
@@ -2428,6 +2428,11 @@ build_srat(GArray *table_data, BIOSLinker *linker, MachineState *machine)
                               MEM_AFFINITY_ENABLED);
         }
     }
+
+    if (machine->nvdimms_state->is_enabled) {
+        nvdimm_build_srat(table_data);
+    }
+
     slots = (table_data->len - numa_start) / sizeof *numamem;
     for (; slots < pcms->numa_nodes + 2; slots++) {
         numamem = acpi_data_push(table_data, sizeof *numamem);
-- 
MST



  parent reply	other threads:[~2020-06-10  5:02 UTC|newest]

Thread overview: 60+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-06-10  4:26 [PULL 00/56] virtio,acpi,pci: features, fixes, cleanups, tests Michael S. Tsirkin
2020-06-10  4:26 ` [PULL 01/56] msix: allow qword MSI-X table accesses Michael S. Tsirkin
2020-06-10  4:26 ` [PULL 02/56] diffs-allowed: add the SRAT AML to diffs-allowed Michael S. Tsirkin
2020-06-10  4:26 ` Michael S. Tsirkin [this message]
2020-06-10  4:26 ` [PULL 04/56] tests/acpi: update expected SRAT files Michael S. Tsirkin
2020-06-10  4:26 ` [PULL 05/56] qtest: allow DSDT acpi table changes Michael S. Tsirkin
2020-06-10  4:26 ` [PULL 06/56] acpi: move aml builder code for rtc device Michael S. Tsirkin
2020-06-10  4:26 ` [PULL 07/56] acpi: rtc: use a single crs range Michael S. Tsirkin
2020-06-10  4:26 ` [PULL 08/56] acpi: serial: don't use _STA method Michael S. Tsirkin
2020-06-10  4:26 ` [PULL 09/56] acpi: move aml builder code for serial device Michael S. Tsirkin
2020-06-10  4:26 ` [PULL 10/56] acpi: parallel: don't use _STA method Michael S. Tsirkin
2020-06-10  4:26 ` [PULL 11/56] acpi: move aml builder code for parallel device Michael S. Tsirkin
2020-06-10  4:26 ` [PULL 12/56] tests/acpi: update DSDT expected files Michael S. Tsirkin
2020-06-10  4:27 ` [PULL 13/56] acpi: tpm: Do not build TCPA table for TPM 2 Michael S. Tsirkin
2020-06-10  4:27 ` [PULL 14/56] acpi: Convert build_tpm2() to build_append* API Michael S. Tsirkin
2020-06-10  4:27 ` [PULL 15/56] acpi: Move build_tpm2() in the generic part Michael S. Tsirkin
2020-06-10  4:27 ` [PULL 16/56] arm/acpi: TPM2 ACPI table support Michael S. Tsirkin
2020-06-10  4:27 ` [PULL 17/56] test/tpm-emu: include sockets and channel headers in tpm-emu header Michael S. Tsirkin
2020-06-10  4:27 ` [PULL 18/56] tests/acpi: Add void tables for Q35/TPM-TIS bios-tables-test Michael S. Tsirkin
2020-06-10  4:27 ` [PULL 19/56] tests: tpm-emu: Remove assert on TPM2_ST_NO_SESSIONS Michael S. Tsirkin
2020-06-10  4:27 ` [PULL 20/56] bios-tables-test: Add Q35/TPM-TIS test Michael S. Tsirkin
2020-06-10  4:27 ` [PULL 21/56] bios-tables-test: Generate reference tables for Q35/TPM-TIS Michael S. Tsirkin
2020-06-10  4:27 ` [PULL 22/56] virtio-balloon: fix free page hinting without an iothread Michael S. Tsirkin
2020-06-10  4:27 ` [PULL 23/56] virtio-balloon: fix free page hinting check on unrealize Michael S. Tsirkin
2020-06-10  4:27 ` [PULL 24/56] virtio-balloon: unref the iothread when unrealizing Michael S. Tsirkin
2020-06-10  4:27 ` [PULL 25/56] virtio-balloon: Implement support for page poison reporting feature Michael S. Tsirkin
2020-06-10  4:27 ` [PULL 26/56] virtio-balloon: Provide an interface for free page reporting Michael S. Tsirkin
2020-06-10  4:27 ` [PULL 27/56] MAINTAINERS: Fix the classification of bios-tables-test-allowed-diff.h Michael S. Tsirkin
2020-06-10  4:27 ` [PULL 28/56] hw/pci/pcie: Move hot plug capability check to pre_plug callback Michael S. Tsirkin
2020-06-10  4:27 ` [PULL 29/56] pci: assert configuration access is within bounds Michael S. Tsirkin
2020-06-10  4:27 ` [PULL 30/56] hw/pci-host/prep: Correct RAVEN bus bridge memory region size Michael S. Tsirkin
2020-06-10  4:27 ` [PULL 31/56] hw/pci/pci_bridge: Correct pci_bridge_io " Michael S. Tsirkin
2020-06-10  4:27 ` [PULL 32/56] hw/pci/pci_bridge: Use the IEC binary prefix definitions Michael S. Tsirkin
2020-06-10  4:27 ` [PULL 33/56] hw/pci-host: " Michael S. Tsirkin
2020-06-10  4:27 ` [PULL 34/56] char-socket: return -1 in case of disconnect during tcp_chr_write Michael S. Tsirkin
2020-06-10  4:27 ` [PULL 35/56] vhost-user-blk: delay vhost_user_blk_disconnect Michael S. Tsirkin
2020-06-10  4:27 ` [PULL 36/56] Add helper to populate vhost-user message regions Michael S. Tsirkin
2020-06-10  4:27 ` [PULL 37/56] Add vhost-user helper to get MemoryRegion data Michael S. Tsirkin
2020-06-10  4:27 ` [PULL 38/56] Add VHOST_USER_PROTOCOL_F_CONFIGURE_MEM_SLOTS Michael S. Tsirkin
2020-06-10  4:27 ` [PULL 39/56] Transmit vhost-user memory regions individually Michael S. Tsirkin
2020-06-10  4:28 ` [PULL 40/56] Lift max memory slots limit imposed by vhost-user Michael S. Tsirkin
2020-06-10  4:28 ` [PULL 41/56] Refactor out libvhost-user fault generation logic Michael S. Tsirkin
2020-06-10  4:28 ` [PULL 42/56] Support ram slot configuration in libvhost-user Michael S. Tsirkin
2020-06-10  4:28 ` [PULL 43/56] Support adding individual regions " Michael S. Tsirkin
2020-06-10  4:28 ` [PULL 44/56] Support individual region unmap " Michael S. Tsirkin
2020-06-10  4:28 ` [PULL 45/56] Lift max ram slots limit " Michael S. Tsirkin
2020-06-10  4:28 ` [PULL 46/56] libvhost-user: advertise vring features Michael S. Tsirkin
2020-06-10  4:28 ` [PULL 47/56] hw/pci: Fix crash when running QEMU with "-nic model=rocker" Michael S. Tsirkin
2020-06-10  4:28 ` [PULL 48/56] vhost-vsock: add vhost-vsock-common abstraction Michael S. Tsirkin
2020-06-10  4:28 ` [PULL 49/56] virtio: add vhost-user-vsock base device Michael S. Tsirkin
2020-06-10  4:28 ` [PULL 50/56] virtio: add vhost-user-vsock-pci device Michael S. Tsirkin
2020-06-10  4:28 ` [PULL 51/56] acpi: make build_madt() more generic Michael S. Tsirkin
2020-06-10  4:28 ` [PULL 52/56] acpi: create acpi-common.c and move madt code Michael S. Tsirkin
2020-06-10  4:28 ` [PULL 53/56] acpi: madt: skip pci override on pci-less systems Michael S. Tsirkin
2020-06-10  4:28 ` [PULL 54/56] acpi: fadt: add hw-reduced sleep register support Michael S. Tsirkin
2020-06-10  4:28 ` [PULL 55/56] acpi: ged: rename event memory region Michael S. Tsirkin
2020-06-10  4:28 ` [PULL 56/56] Fix parameter type in vhost migration log path Michael S. Tsirkin
2020-06-10  5:30 ` [PULL 00/56] virtio,acpi,pci: features, fixes, cleanups, tests no-reply
2020-06-11 18:13 ` Peter Maydell
2020-06-12 16:12   ` Michael S. Tsirkin

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20200610042613.1459309-4-mst@redhat.com \
    --to=mst@redhat.com \
    --cc=ehabkost@redhat.com \
    --cc=imammedo@redhat.com \
    --cc=jingqi.liu@intel.com \
    --cc=pbonzini@redhat.com \
    --cc=peter.maydell@linaro.org \
    --cc=qemu-arm@nongnu.org \
    --cc=qemu-devel@nongnu.org \
    --cc=rth@twiddle.net \
    --cc=shannon.zhaosl@gmail.com \
    --cc=vishal.l.verma@intel.com \
    --cc=xiaoguangrong.eric@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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).