[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PULL 20/20] spapr.c: send QAPI event when memory hotunplug fails
From: |
David Gibson |
Subject: |
[PULL 20/20] spapr.c: send QAPI event when memory hotunplug fails |
Date: |
Wed, 10 Mar 2021 15:10:02 +1100 |
From: Daniel Henrique Barboza <danielhb413@gmail.com>
Recent changes allowed the pSeries machine to rollback the hotunplug
process for the DIMM when the guest kernel signals, via a
reconfiguration of the DR connector, that it's not going to release the
LMBs.
Let's also warn QAPI listerners about it. One place to do it would be
right after the unplug state is cleaned up,
spapr_clear_pending_dimm_unplug_state(). This would mean that the
function is now doing more than cleaning up the pending dimm state
though.
This patch does the following changes in spapr.c:
- send a QAPI event to inform that we experienced a failure in the
hotunplug of the DIMM;
- rename spapr_clear_pending_dimm_unplug_state() to
spapr_memory_unplug_rollback(). This is a better fit for what the
function is now doing, and it makes callers care more about what the
function goal is and less about spapr.c internals such as clearing
the pending dimm unplug state.
Reviewed-by: Greg Kurz <groug@kaod.org>
Signed-off-by: Daniel Henrique Barboza <danielhb413@gmail.com>
Message-Id: <20210302141019.153729-3-danielhb413@gmail.com>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
---
hw/ppc/spapr.c | 13 +++++++++++--
hw/ppc/spapr_drc.c | 5 ++---
include/hw/ppc/spapr.h | 3 +--
3 files changed, 14 insertions(+), 7 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) {
diff --git a/include/hw/ppc/spapr.h b/include/hw/ppc/spapr.h
index d6edeaaaff..47cebaf3ac 100644
--- a/include/hw/ppc/spapr.h
+++ b/include/hw/ppc/spapr.h
@@ -847,8 +847,7 @@ int spapr_hpt_shift_for_ramsize(uint64_t ramsize);
int spapr_reallocate_hpt(SpaprMachineState *spapr, int shift, Error **errp);
void spapr_clear_pending_events(SpaprMachineState *spapr);
void spapr_clear_pending_hotplug_events(SpaprMachineState *spapr);
-void spapr_clear_pending_dimm_unplug_state(SpaprMachineState *spapr,
- DeviceState *dev);
+void spapr_memory_unplug_rollback(SpaprMachineState *spapr, DeviceState *dev);
int spapr_max_server_number(SpaprMachineState *spapr);
void spapr_store_hpte(PowerPCCPU *cpu, hwaddr ptex,
uint64_t pte0, uint64_t pte1);
--
2.29.2
- [PULL 14/20] hw/ppc: e500: Add missing <ranges> in the eTSEC node, (continued)
- [PULL 14/20] hw/ppc: e500: Add missing <ranges> in the eTSEC node, David Gibson, 2021/03/09
- [PULL 05/20] pseries: Update SLOF firmware image, David Gibson, 2021/03/09
- [PULL 17/20] qemu_timer.c: add timer_deadline_ms() helper, David Gibson, 2021/03/09
- [PULL 19/20] spapr.c: remove duplicated assert in spapr_memory_unplug_request(), David Gibson, 2021/03/09
- [PULL 03/20] hw/display/sm501: Inline template header into C file, David Gibson, 2021/03/09
- [PULL 06/20] spapr_drc.c: use spapr_drc_release() in isolate_physical/set_unusable, David Gibson, 2021/03/09
- [PULL 10/20] spapr_drc.c: introduce unplug_timeout_timer, David Gibson, 2021/03/09
- [PULL 12/20] spapr_drc.c: use DRC reconfiguration to cleanup DIMM unplug state, David Gibson, 2021/03/09
- [PULL 15/20] spapr.c: add 'unplug already in progress' message for PHB unplug, David Gibson, 2021/03/09
- [PULL 16/20] spapr_pci.c: add 'unplug already in progress' message for PCI unplug, David Gibson, 2021/03/09
- [PULL 20/20] spapr.c: send QAPI event when memory hotunplug fails,
David Gibson <=
- [PULL 18/20] target/ppc: fix icount support on Book-e vms accessing SPRs, David Gibson, 2021/03/09
- Re: [PULL 00/20] ppc-for-6.0 queue 20210310, Bin Meng, 2021/03/09
- Re: [PULL 00/20] ppc-for-6.0 queue 20210310, Ivan Warren, 2021/03/10