arm/virt: Add memory hot remove support
This adds support for memory(pc-dimm) hot remove on arm/virt that uses acpi ged device. NVDIMM hot removal is not yet supported. Signed-off-by: Shameer Kolothum <shameerali.kolothum.thodi@huawei.com> Message-id: 20200622124157.20360-1-shameerali.kolothum.thodi@huawei.com Reviewed-by: Eric Auger <eric.auger@redhat.com> Tested-by: Eric Auger <eric.auger@redhat.com> Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
parent
92a70997ad
commit
539533b85f
|
@ -193,6 +193,33 @@ static void acpi_ged_device_plug_cb(HotplugHandler *hotplug_dev,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void acpi_ged_unplug_request_cb(HotplugHandler *hotplug_dev,
|
||||||
|
DeviceState *dev, Error **errp)
|
||||||
|
{
|
||||||
|
AcpiGedState *s = ACPI_GED(hotplug_dev);
|
||||||
|
|
||||||
|
if ((object_dynamic_cast(OBJECT(dev), TYPE_PC_DIMM) &&
|
||||||
|
!(object_dynamic_cast(OBJECT(dev), TYPE_NVDIMM)))) {
|
||||||
|
acpi_memory_unplug_request_cb(hotplug_dev, &s->memhp_state, dev, errp);
|
||||||
|
} else {
|
||||||
|
error_setg(errp, "acpi: device unplug request for unsupported device"
|
||||||
|
" type: %s", object_get_typename(OBJECT(dev)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void acpi_ged_unplug_cb(HotplugHandler *hotplug_dev,
|
||||||
|
DeviceState *dev, Error **errp)
|
||||||
|
{
|
||||||
|
AcpiGedState *s = ACPI_GED(hotplug_dev);
|
||||||
|
|
||||||
|
if (object_dynamic_cast(OBJECT(dev), TYPE_PC_DIMM)) {
|
||||||
|
acpi_memory_unplug_cb(&s->memhp_state, dev, errp);
|
||||||
|
} else {
|
||||||
|
error_setg(errp, "acpi: device unplug for unsupported device"
|
||||||
|
" type: %s", object_get_typename(OBJECT(dev)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void acpi_ged_send_event(AcpiDeviceIf *adev, AcpiEventStatusBits ev)
|
static void acpi_ged_send_event(AcpiDeviceIf *adev, AcpiEventStatusBits ev)
|
||||||
{
|
{
|
||||||
AcpiGedState *s = ACPI_GED(adev);
|
AcpiGedState *s = ACPI_GED(adev);
|
||||||
|
@ -318,6 +345,8 @@ static void acpi_ged_class_init(ObjectClass *class, void *data)
|
||||||
dc->vmsd = &vmstate_acpi_ged;
|
dc->vmsd = &vmstate_acpi_ged;
|
||||||
|
|
||||||
hc->plug = acpi_ged_device_plug_cb;
|
hc->plug = acpi_ged_device_plug_cb;
|
||||||
|
hc->unplug_request = acpi_ged_unplug_request_cb;
|
||||||
|
hc->unplug = acpi_ged_unplug_cb;
|
||||||
|
|
||||||
adevc->send_event = acpi_ged_send_event;
|
adevc->send_event = acpi_ged_send_event;
|
||||||
}
|
}
|
||||||
|
|
|
@ -2177,11 +2177,68 @@ static void virt_machine_device_plug_cb(HotplugHandler *hotplug_dev,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void virt_dimm_unplug_request(HotplugHandler *hotplug_dev,
|
||||||
|
DeviceState *dev, Error **errp)
|
||||||
|
{
|
||||||
|
VirtMachineState *vms = VIRT_MACHINE(hotplug_dev);
|
||||||
|
Error *local_err = NULL;
|
||||||
|
|
||||||
|
if (!vms->acpi_dev) {
|
||||||
|
error_setg(&local_err,
|
||||||
|
"memory hotplug is not enabled: missing acpi-ged device");
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (object_dynamic_cast(OBJECT(dev), TYPE_NVDIMM)) {
|
||||||
|
error_setg(&local_err,
|
||||||
|
"nvdimm device hot unplug is not supported yet.");
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
hotplug_handler_unplug_request(HOTPLUG_HANDLER(vms->acpi_dev), dev,
|
||||||
|
&local_err);
|
||||||
|
out:
|
||||||
|
error_propagate(errp, local_err);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void virt_dimm_unplug(HotplugHandler *hotplug_dev,
|
||||||
|
DeviceState *dev, Error **errp)
|
||||||
|
{
|
||||||
|
VirtMachineState *vms = VIRT_MACHINE(hotplug_dev);
|
||||||
|
Error *local_err = NULL;
|
||||||
|
|
||||||
|
hotplug_handler_unplug(HOTPLUG_HANDLER(vms->acpi_dev), dev, &local_err);
|
||||||
|
if (local_err) {
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
pc_dimm_unplug(PC_DIMM(dev), MACHINE(vms));
|
||||||
|
qdev_unrealize(dev);
|
||||||
|
|
||||||
|
out:
|
||||||
|
error_propagate(errp, local_err);
|
||||||
|
}
|
||||||
|
|
||||||
static void virt_machine_device_unplug_request_cb(HotplugHandler *hotplug_dev,
|
static void virt_machine_device_unplug_request_cb(HotplugHandler *hotplug_dev,
|
||||||
DeviceState *dev, Error **errp)
|
DeviceState *dev, Error **errp)
|
||||||
{
|
{
|
||||||
error_setg(errp, "device unplug request for unsupported device"
|
if (object_dynamic_cast(OBJECT(dev), TYPE_PC_DIMM)) {
|
||||||
" type: %s", object_get_typename(OBJECT(dev)));
|
virt_dimm_unplug_request(hotplug_dev, dev, errp);
|
||||||
|
} else {
|
||||||
|
error_setg(errp, "device unplug request for unsupported device"
|
||||||
|
" type: %s", object_get_typename(OBJECT(dev)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void virt_machine_device_unplug_cb(HotplugHandler *hotplug_dev,
|
||||||
|
DeviceState *dev, Error **errp)
|
||||||
|
{
|
||||||
|
if (object_dynamic_cast(OBJECT(dev), TYPE_PC_DIMM)) {
|
||||||
|
virt_dimm_unplug(hotplug_dev, dev, errp);
|
||||||
|
} else {
|
||||||
|
error_setg(errp, "virt: device unplug for unsupported device"
|
||||||
|
" type: %s", object_get_typename(OBJECT(dev)));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static HotplugHandler *virt_machine_get_hotplug_handler(MachineState *machine,
|
static HotplugHandler *virt_machine_get_hotplug_handler(MachineState *machine,
|
||||||
|
@ -2262,6 +2319,7 @@ static void virt_machine_class_init(ObjectClass *oc, void *data)
|
||||||
hc->pre_plug = virt_machine_device_pre_plug_cb;
|
hc->pre_plug = virt_machine_device_pre_plug_cb;
|
||||||
hc->plug = virt_machine_device_plug_cb;
|
hc->plug = virt_machine_device_plug_cb;
|
||||||
hc->unplug_request = virt_machine_device_unplug_request_cb;
|
hc->unplug_request = virt_machine_device_unplug_request_cb;
|
||||||
|
hc->unplug = virt_machine_device_unplug_cb;
|
||||||
mc->numa_mem_supported = true;
|
mc->numa_mem_supported = true;
|
||||||
mc->nvdimm_supported = true;
|
mc->nvdimm_supported = true;
|
||||||
mc->auto_enable_numa_with_memhp = true;
|
mc->auto_enable_numa_with_memhp = true;
|
||||||
|
|
Loading…
Reference in New Issue