This series is an attempt to provide device memory hotplug support on ARM virt platform. This is based on Eric's recent works here[1] and carries some of the pc-dimm related patches dropped from his series. The kernel support for arm64 memory hot add was added recently by Robin and hence the guest kernel should be => 5.0-rc1. NVDIM support is not included currently as we still have an unresolved issue while hot adding NVDIMM[2]. However NVDIMM cold plug patches can be included, but not done for now, for keeping it simple. This makes use of GED device to sent hotplug ACPI events to the Guest. GED code is based on Nemu. Thanks to the efforts of Samuel and Sebastien to add the hardware-reduced support to Nemu using GED device[3]. (Please shout if I got the author/signed-off wrong for those patches or missed any names). This is sanity tested on a HiSilicon ARM64 platform and appreciate any further testing. Note: Attempted adding dimm_pxm test case to bios-tables-test for arm/virt. But noticed the issue decribed here[5]. This is under investigation now. upstream url: https://patchwork.kernel.org/cover/11150345/ Signed-off-by: Keqian Zhu <zhukeqian1@huawei.com>
131 lines
4.5 KiB
Diff
131 lines
4.5 KiB
Diff
From e14fadc66d488ad10a10a2076721b72cc239ded9 Mon Sep 17 00:00:00 2001
|
|
From: Eric Auger <eric.auger@redhat.com>
|
|
Date: Wed, 18 Sep 2019 14:06:26 +0100
|
|
Subject: [PATCH] hw/arm/virt: Add memory hotplug framework
|
|
|
|
This patch adds the memory hot-plug/hot-unplug infrastructure
|
|
in machvirt. The device memory is not yet exposed to the Guest
|
|
either through DT or ACPI and hence both cold/hot plug of memory
|
|
is explicitly disabled for now.
|
|
|
|
Signed-off-by: Eric Auger <eric.auger@redhat.com>
|
|
Signed-off-by: Kwangwoo Lee <kwangwoo.lee@sk.com>
|
|
Signed-off-by: Shameer Kolothum <shameerali.kolothum.thodi@huawei.com>
|
|
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
|
|
Reviewed-by: Igor Mammedov <imammedo@redhat.com>
|
|
Message-Id: <20190918130633.4872-5-shameerali.kolothum.thodi@huawei.com>
|
|
Acked-by: Peter Maydell <peter.maydell@linaro.org>
|
|
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
|
|
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
|
|
---
|
|
hw/arm/Kconfig | 2 ++
|
|
hw/arm/virt.c | 53 +++++++++++++++++++++++++++++++++++++++++++++++++-
|
|
2 files changed, 54 insertions(+), 1 deletion(-)
|
|
|
|
diff --git a/hw/arm/Kconfig b/hw/arm/Kconfig
|
|
index ab65ecd216..84961c17ab 100644
|
|
--- a/hw/arm/Kconfig
|
|
+++ b/hw/arm/Kconfig
|
|
@@ -20,6 +20,8 @@ config ARM_VIRT
|
|
select SMBIOS
|
|
select VIRTIO_MMIO
|
|
select ACPI_PCI
|
|
+ select MEM_DEVICE
|
|
+ select DIMM
|
|
|
|
config CHEETAH
|
|
bool
|
|
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
|
|
index 23d72aed97..c7c07fe3ac 100644
|
|
--- a/hw/arm/virt.c
|
|
+++ b/hw/arm/virt.c
|
|
@@ -65,6 +65,8 @@
|
|
#include "hw/arm/smmuv3.h"
|
|
#include "hw/acpi/acpi.h"
|
|
#include "target/arm/internals.h"
|
|
+#include "hw/mem/pc-dimm.h"
|
|
+#include "hw/mem/nvdimm.h"
|
|
|
|
#define DEFINE_VIRT_MACHINE_LATEST(major, minor, latest) \
|
|
static void virt_##major##_##minor##_class_init(ObjectClass *oc, \
|
|
@@ -1998,6 +2000,42 @@ static const CPUArchIdList *virt_possible_cpu_arch_ids(MachineState *ms)
|
|
return ms->possible_cpus;
|
|
}
|
|
|
|
+static void virt_memory_pre_plug(HotplugHandler *hotplug_dev, DeviceState *dev,
|
|
+ Error **errp)
|
|
+{
|
|
+
|
|
+ /*
|
|
+ * The device memory is not yet exposed to the Guest either through
|
|
+ * DT or ACPI and hence both cold/hot plug of memory is explicitly
|
|
+ * disabled for now.
|
|
+ */
|
|
+ if (object_dynamic_cast(OBJECT(dev), TYPE_PC_DIMM)) {
|
|
+ error_setg(errp, "memory cold/hot plug is not yet supported");
|
|
+ return;
|
|
+ }
|
|
+
|
|
+ pc_dimm_pre_plug(PC_DIMM(dev), MACHINE(hotplug_dev), NULL, errp);
|
|
+}
|
|
+
|
|
+static void virt_memory_plug(HotplugHandler *hotplug_dev,
|
|
+ DeviceState *dev, Error **errp)
|
|
+{
|
|
+ VirtMachineState *vms = VIRT_MACHINE(hotplug_dev);
|
|
+ Error *local_err = NULL;
|
|
+
|
|
+ pc_dimm_plug(PC_DIMM(dev), MACHINE(vms), &local_err);
|
|
+
|
|
+ error_propagate(errp, local_err);
|
|
+}
|
|
+
|
|
+static void virt_machine_device_pre_plug_cb(HotplugHandler *hotplug_dev,
|
|
+ DeviceState *dev, Error **errp)
|
|
+{
|
|
+ if (object_dynamic_cast(OBJECT(dev), TYPE_PC_DIMM)) {
|
|
+ virt_memory_pre_plug(hotplug_dev, dev, errp);
|
|
+ }
|
|
+}
|
|
+
|
|
static void virt_machine_device_plug_cb(HotplugHandler *hotplug_dev,
|
|
DeviceState *dev, Error **errp)
|
|
{
|
|
@@ -2009,12 +2047,23 @@ static void virt_machine_device_plug_cb(HotplugHandler *hotplug_dev,
|
|
SYS_BUS_DEVICE(dev));
|
|
}
|
|
}
|
|
+ if (object_dynamic_cast(OBJECT(dev), TYPE_PC_DIMM)) {
|
|
+ virt_memory_plug(hotplug_dev, dev, errp);
|
|
+ }
|
|
+}
|
|
+
|
|
+static void virt_machine_device_unplug_request_cb(HotplugHandler *hotplug_dev,
|
|
+ DeviceState *dev, Error **errp)
|
|
+{
|
|
+ error_setg(errp, "device unplug request for unsupported device"
|
|
+ " type: %s", object_get_typename(OBJECT(dev)));
|
|
}
|
|
|
|
static HotplugHandler *virt_machine_get_hotplug_handler(MachineState *machine,
|
|
DeviceState *dev)
|
|
{
|
|
- if (object_dynamic_cast(OBJECT(dev), TYPE_SYS_BUS_DEVICE)) {
|
|
+ if (object_dynamic_cast(OBJECT(dev), TYPE_SYS_BUS_DEVICE) ||
|
|
+ (object_dynamic_cast(OBJECT(dev), TYPE_PC_DIMM))) {
|
|
return HOTPLUG_HANDLER(machine);
|
|
}
|
|
|
|
@@ -2078,7 +2127,9 @@ static void virt_machine_class_init(ObjectClass *oc, void *data)
|
|
mc->kvm_type = virt_kvm_type;
|
|
assert(!mc->get_hotplug_handler);
|
|
mc->get_hotplug_handler = virt_machine_get_hotplug_handler;
|
|
+ hc->pre_plug = virt_machine_device_pre_plug_cb;
|
|
hc->plug = virt_machine_device_plug_cb;
|
|
+ hc->unplug_request = virt_machine_device_unplug_request_cb;
|
|
mc->numa_mem_supported = true;
|
|
}
|
|
|
|
--
|
|
2.19.1
|