summaryrefslogtreecommitdiffstats
path: root/hw/ppc
diff options
context:
space:
mode:
Diffstat (limited to 'hw/ppc')
-rw-r--r--hw/ppc/spapr.c13
-rw-r--r--hw/ppc/spapr_drc.c5
2 files changed, 13 insertions, 5 deletions
diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
index b579830832..d56418ca29 100644
--- a/hw/ppc/spapr.c
+++ b/hw/ppc/spapr.c
@@ -28,6 +28,7 @@
#include "qemu-common.h"
#include "qemu/datadir.h"
#include "qapi/error.h"
+#include "qapi/qapi-events-machine.h"
#include "qapi/visitor.h"
#include "sysemu/sysemu.h"
#include "sysemu/hostmem.h"
@@ -3575,14 +3576,14 @@ static SpaprDimmState *spapr_recover_pending_dimm_state(SpaprMachineState *ms,
return spapr_pending_dimm_unplugs_add(ms, avail_lmbs, dimm);
}
-void spapr_clear_pending_dimm_unplug_state(SpaprMachineState *spapr,
- DeviceState *dev)
+void spapr_memory_unplug_rollback(SpaprMachineState *spapr, DeviceState *dev)
{
SpaprDimmState *ds;
PCDIMMDevice *dimm;
SpaprDrc *drc;
uint32_t nr_lmbs;
uint64_t size, addr_start, addr;
+ g_autofree char *qapi_error = NULL;
int i;
if (!dev) {
@@ -3616,6 +3617,14 @@ void spapr_clear_pending_dimm_unplug_state(SpaprMachineState *spapr,
drc->unplug_requested = false;
addr += SPAPR_MEMORY_BLOCK_SIZE;
}
+
+ /*
+ * Tell QAPI that something happened and the memory
+ * hotunplug wasn't successful.
+ */
+ qapi_error = g_strdup_printf("Memory hotunplug rejected by the guest "
+ "for device %s", dev->id);
+ qapi_event_send_mem_unplug_error(dev->id, qapi_error);
}
/* Callback to be called during DRC release. */
diff --git a/hw/ppc/spapr_drc.c b/hw/ppc/spapr_drc.c
index 98b626acf9..8a71b03800 100644
--- a/hw/ppc/spapr_drc.c
+++ b/hw/ppc/spapr_drc.c
@@ -1231,12 +1231,11 @@ static void rtas_ibm_configure_connector(PowerPCCPU *cpu,
/*
* This indicates that the kernel is reconfiguring a LMB due to
- * a failed hotunplug. Clear the pending unplug state for the whole
- * DIMM.
+ * a failed hotunplug. Rollback the DIMM unplug process.
*/
if (spapr_drc_type(drc) == SPAPR_DR_CONNECTOR_TYPE_LMB &&
drc->unplug_requested) {
- spapr_clear_pending_dimm_unplug_state(spapr, drc->dev);
+ spapr_memory_unplug_rollback(spapr, drc->dev);
}
if (!drc->fdt) {