On Wed, Jul 22, 2020 at 07:17:22PM +0300, Maxim Levitsky wrote: > Curently it is possible to hotplug a device and then immediatly > hotunplug it before the OS notices, and that will result > in missed unplug event since we can only send one attention button event. > > Moreover the device will stuck in unplugging state forever. > > Error out in such cases and rely on the caller (e.g libvirt) to retry > the unplug a bit later > > Signed-off-by: Maxim Levitsky <mlevi...@redhat.com> > --- > hw/pci/pcie.c | 11 +++++++++++ > 1 file changed, 11 insertions(+) > > diff --git a/hw/pci/pcie.c b/hw/pci/pcie.c > index 5b48bae0f6..9e836cf2f4 100644 > --- a/hw/pci/pcie.c > +++ b/hw/pci/pcie.c > @@ -402,6 +402,17 @@ static void pcie_cap_slot_plug_common(PCIDevice > *hotplug_dev, DeviceState *dev, > */ > error_setg_errno(errp, EBUSY, "slot is electromechanically locked"); > } > + > + if (sltsta & PCI_EXP_SLTSTA_ABP) { > + /* > + * Attention button is pressed, thus we can't send another > + * hotpplug event
typo > + */ > + error_setg_errno(errp, EBUSY, > + "attention button is already pressed, can't " > + "send another hotplug event"); > + } > + > } It would be neater if we could queue the event up in qemu. Alternatively - can we clean up the unhandled event so guest does not even notice the device briefly appeared? > > void pcie_cap_slot_pre_plug_cb(HotplugHandler *hotplug_dev, DeviceState *dev, > -- > 2.26.2