spapr: Handle pending hot plug/unplug requests at CAS
commitad334d89a695460ca1387d96bb8ab7aef0909df4
authorGreg Kurz <groug@kaod.org>
Mon, 24 Feb 2020 19:23:43 +0000 (24 20:23 +0100)
committerDavid Gibson <david@gibson.dropbear.id.au>
Mon, 16 Mar 2020 22:41:14 +0000 (17 09:41 +1100)
tree7149771b5857753be74ce98f1f142951f5d00b9b
parentf350d78f102faef84910733b6c45e2c72a05d86a
spapr: Handle pending hot plug/unplug requests at CAS

If a hot plug or unplug request is pending at CAS, we currently trigger
a CAS reboot, which severely increases the guest boot time. This is
because SLOF doesn't handle hot plug events and we had no way to fix
the FDT that gets presented to the guest.

We can do better thanks to recent changes in QEMU and SLOF:

- we now return a full FDT to SLOF during CAS

- SLOF was fixed to correctly detect any device that was either added or
  removed since boot time and to update its internal DT accordingly.

The right solution is to process all pending hot plug/unplug requests
during CAS: convert hot plugged devices to cold plugged devices and
remove the hot unplugged ones, which is exactly what spapr_drc_reset()
does. Also clear all hot plug events that are currently queued since
they're no longer relevant.

Note that SLOF cannot currently populate hot plugged PCI bridges or PHBs
at CAS. Until this limitation is lifted, SLOF will reset the machine when
this scenario occurs : this will allow the FDT to be fully processed when
SLOF is started again (ie. the same effect as the CAS reboot that would
occur anyway without this patch).

Signed-off-by: Greg Kurz <groug@kaod.org>
Message-Id: <158257222352.4102917.8984214333937947307.stgit@bahia.lan>
Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
hw/ppc/spapr_events.c
hw/ppc/spapr_hcall.c
include/hw/ppc/spapr.h