[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PULL 08/22] spapr: Allow memory unplug to always succeed
From: |
David Gibson |
Subject: |
[PULL 08/22] spapr: Allow memory unplug to always succeed |
Date: |
Wed, 6 Jan 2021 14:38:02 +1100 |
From: Greg Kurz <groug@kaod.org>
It is currently impossible to hot-unplug a memory device between
machine reset and CAS.
(qemu) device_del dimm1
Error: Memory hot unplug not supported for this guest
This limitation was introduced in order to provide an explicit
error path for older guests that didn't support hot-plug event
sources (and thus memory hot-unplug).
The linux kernel has been supporting these since 4.11. All recent
enough guests are thus capable of handling the removal of a memory
device at all time, including during early boot.
Lift the limitation for the latest machine type. This means that
trying to unplug memory from a guest that doesn't support it will
likely just do nothing and the memory will only get removed at
next reboot. Such older guests can still get the existing behavior
by using an older machine type.
Signed-off-by: Greg Kurz <groug@kaod.org>
Message-Id: <160794035064.23292.17560963281911312439.stgit@bahia.lan>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
---
hw/ppc/spapr.c | 6 +++++-
hw/ppc/spapr_events.c | 3 ++-
include/hw/ppc/spapr.h | 1 +
3 files changed, 8 insertions(+), 2 deletions(-)
diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
index 68a3ceb927..9f89b1c298 100644
--- a/hw/ppc/spapr.c
+++ b/hw/ppc/spapr.c
@@ -4069,7 +4069,8 @@ static void
spapr_machine_device_unplug_request(HotplugHandler *hotplug_dev,
SpaprMachineClass *smc = SPAPR_MACHINE_CLASS(mc);
if (object_dynamic_cast(OBJECT(dev), TYPE_PC_DIMM)) {
- if (spapr_ovec_test(sms->ov5_cas, OV5_HP_EVT)) {
+ if (!smc->pre_6_0_memory_unplug ||
+ spapr_ovec_test(sms->ov5_cas, OV5_HP_EVT)) {
spapr_memory_unplug_request(hotplug_dev, dev, errp);
} else {
/* NOTE: this means there is a window after guest reset, prior to
@@ -4555,8 +4556,11 @@ DEFINE_SPAPR_MACHINE(6_0, "6.0", true);
*/
static void spapr_machine_5_2_class_options(MachineClass *mc)
{
+ SpaprMachineClass *smc = SPAPR_MACHINE_CLASS(mc);
+
spapr_machine_6_0_class_options(mc);
compat_props_add(mc->compat_props, hw_compat_5_2, hw_compat_5_2_len);
+ smc->pre_6_0_memory_unplug = true;
}
DEFINE_SPAPR_MACHINE(5_2, "5.2", false);
diff --git a/hw/ppc/spapr_events.c b/hw/ppc/spapr_events.c
index 3f37b49fd8..6aedd988b3 100644
--- a/hw/ppc/spapr_events.c
+++ b/hw/ppc/spapr_events.c
@@ -658,7 +658,8 @@ static void spapr_hotplug_req_event(uint8_t hp_id, uint8_t
hp_action,
/* we should not be using count_indexed value unless the guest
* supports dedicated hotplug event source
*/
- g_assert(spapr_ovec_test(spapr->ov5_cas, OV5_HP_EVT));
+ g_assert(!SPAPR_MACHINE_GET_CLASS(spapr)->pre_6_0_memory_unplug ||
+ spapr_ovec_test(spapr->ov5_cas, OV5_HP_EVT));
hp->drc_id.count_indexed.count =
cpu_to_be32(drc_id->count_indexed.count);
hp->drc_id.count_indexed.index =
diff --git a/include/hw/ppc/spapr.h b/include/hw/ppc/spapr.h
index e0f10f252c..06a5b4259f 100644
--- a/include/hw/ppc/spapr.h
+++ b/include/hw/ppc/spapr.h
@@ -139,6 +139,7 @@ struct SpaprMachineClass {
hwaddr rma_limit; /* clamp the RMA to this size */
bool pre_5_1_assoc_refpoints;
bool pre_5_2_numa_associativity;
+ bool pre_6_0_memory_unplug;
bool (*phb_placement)(SpaprMachineState *spapr, uint32_t index,
uint64_t *buid, hwaddr *pio,
--
2.29.2
- [PULL 01/22] hw/ppc/ppc4xx_devs: Make code style fixes to UIC code, (continued)
- [PULL 01/22] hw/ppc/ppc4xx_devs: Make code style fixes to UIC code, David Gibson, 2021/01/05
- [PULL 02/22] ppc: Convert PPC UIC to a QOM device, David Gibson, 2021/01/05
- [PULL 04/22] hw/ppc/ppc440_bamboo: Drop use of ppcuic_init(), David Gibson, 2021/01/05
- [PULL 06/22] spapr/xive: Make spapr_xive_pic_print_info() static, David Gibson, 2021/01/05
- [PULL 12/22] spapr: Introduce spapr_drc_reset_all(), David Gibson, 2021/01/05
- [PULL 11/22] spapr: Fix reset of transient DR connectors, David Gibson, 2021/01/05
- [PULL 10/22] spapr: Call spapr_drc_reset() for all DRCs at CAS, David Gibson, 2021/01/05
- [PULL 05/22] spapr: DRC lookup cannot fail, David Gibson, 2021/01/05
- [PULL 09/22] spapr: Fix buffer overflow in spapr_numa_associativity_init(), David Gibson, 2021/01/05
- [PULL 07/22] spapr: Fix DR properties of the root node, David Gibson, 2021/01/05
- [PULL 08/22] spapr: Allow memory unplug to always succeed,
David Gibson <=
- [PULL 13/22] spapr: Use spapr_drc_reset_all() at machine reset, David Gibson, 2021/01/05
- [PULL 15/22] ppc: Fix build with --without-default-devices, David Gibson, 2021/01/05
- [PULL 17/22] pnv: Fix reverse dependency on PCI express root ports, David Gibson, 2021/01/05
- [PULL 21/22] ppc440_pcix: Fix register write trace event, David Gibson, 2021/01/05
- [PULL 16/22] ppc: Simplify reverse dependencies of POWERNV and PSERIES on XICS and XIVE, David Gibson, 2021/01/05
- [PULL 14/22] spapr: Add drc_ prefix to the DRC realize and unrealize functions, David Gibson, 2021/01/05
- [PULL 19/22] sam460ex: Remove FDT_PPC dependency from KConfig, David Gibson, 2021/01/05
- [PULL 20/22] ppc440_pcix: Improve comment for IRQ mapping, David Gibson, 2021/01/05
- [PULL 18/22] ppc4xx: Move common dependency on serial to common option, David Gibson, 2021/01/05
- [PULL 22/22] ppc440_pcix: Fix up pci config access, David Gibson, 2021/01/05