mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-10 11:04:58 -06:00
spapr: reset DRCs after devices
A DRC with a pending unplug request releases its associated device at machine reset time. In the case of LMB, when all DRCs for a DIMM device have been reset, the DIMM gets unplugged, causing guest memory to disappear. This may be very confusing for anything still using this memory. This is exactly what happens with vhost backends, and QEMU aborts with: qemu-system-ppc64: used ring relocated for ring 2 qemu-system-ppc64: qemu/hw/virtio/vhost.c:649: vhost_commit: Assertion `r >= 0' failed. The issue is that each DRC registers a QEMU reset handler, and we don't control the order in which these handlers are called (ie, a LMB DRC will unplug a DIMM before the virtio device using the memory on this DIMM could stop its vhost backend). To avoid such situations, let's reset DRCs after all devices have been reset. Reported-by: Mallesh N. Koti <mallesh@linux.vnet.ibm.com> Signed-off-by: Greg Kurz <groug@kaod.org> Reviewed-by: Daniel Henrique Barboza <danielhb@linux.vnet.ibm.com> Reviewed-by: Michael Roth <mdroth@linux.vnet.ibm.com> Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
This commit is contained in:
parent
7abd43baec
commit
8251248394
2 changed files with 21 additions and 7 deletions
|
@ -455,11 +455,6 @@ void spapr_drc_reset(sPAPRDRConnector *drc)
|
|||
}
|
||||
}
|
||||
|
||||
static void drc_reset(void *opaque)
|
||||
{
|
||||
spapr_drc_reset(SPAPR_DR_CONNECTOR(opaque));
|
||||
}
|
||||
|
||||
bool spapr_drc_needed(void *opaque)
|
||||
{
|
||||
sPAPRDRConnector *drc = (sPAPRDRConnector *)opaque;
|
||||
|
@ -518,7 +513,6 @@ static void realize(DeviceState *d, Error **errp)
|
|||
}
|
||||
vmstate_register(DEVICE(drc), spapr_drc_index(drc), &vmstate_spapr_drc,
|
||||
drc);
|
||||
qemu_register_reset(drc_reset, drc);
|
||||
trace_spapr_drc_realize_complete(spapr_drc_index(drc));
|
||||
}
|
||||
|
||||
|
@ -529,7 +523,6 @@ static void unrealize(DeviceState *d, Error **errp)
|
|||
gchar *name;
|
||||
|
||||
trace_spapr_drc_unrealize(spapr_drc_index(drc));
|
||||
qemu_unregister_reset(drc_reset, drc);
|
||||
vmstate_unregister(DEVICE(drc), &vmstate_spapr_drc, drc);
|
||||
root_container = container_get(object_get_root(), DRC_CONTAINER_PATH);
|
||||
name = g_strdup_printf("%x", spapr_drc_index(drc));
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue