On 14/08/2015 07:20, Bharata B Rao wrote: > On Thu, Aug 13, 2015 at 02:53:02PM +0200, Laurent Vivier wrote: >> When a device is hotplugged, attach() sets "configured" to >> false, waiting an action from the OS to configure it and then >> to call ibm,configure-connector. On ibm,configure-connector, >> the hypervisor sets "configured" to true. >> >> In case of coldplugged device, attach() sets "configured" to >> false, but firmware and OS never call the ibm,configure-connector >> in this case, so it remains set to false. >> >> It could be harmless, but when we unplug a device, hypervisor >> waits the device becomes configured because for it, a not configured >> device is a device being configured, so it waits the end of configuration >> to unplug it... and it never happens, so it is never unplugged. > > Not true for at least logical DR device like CPU. I am able to cleanly > unplug a cold plugged CPU in the patchset I posted at: > > https://lists.gnu.org/archive/html/qemu-ppc/2015-08/msg00041.html > > And this is how the state transitions work for cold plugged CPU devices: > > - Cold plugged CPU DRC is explicitly set with allocation_state=USABLE > and isolation_state=UNISOLATED. > - device_del results in drck->detach() that just returns by setting > drc->awaiting_release to true. > - Unplug notification is sent to guest. > - Guest comes back with set_indicator RTAS call for setting isolation_state > to ISOLATED. set_isolation_state() sets drc->configured to false. > - Guest comes back again with set_indicator RTAS call for setting allocation > state to UNUSABLE. set_allocation_state() finalizes the device removal by > calling drck->detach()
It doesn't work for PCI, because (QEMU 2.4.0): static int set_allocation_state(sPAPRDRConnector *drc, sPAPRDRAllocationState state) ... if (drc->type != SPAPR_DR_CONNECTOR_TYPE_PCI) { ... drck->detach(drc, DEVICE(drc->dev), drc->detach_cb, drc->detach_cb_opaque, NULL); ... } > - drck->detach() now calls drc->detach_cb() that truly releases the > CPU resource by getting rid of vCPU thread in QEMU. Laurent