[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH 1/1] pci/pcie: refuse another hotplug/unplug event if attention b
From: |
Maxim Levitsky |
Subject: |
[PATCH 1/1] pci/pcie: refuse another hotplug/unplug event if attention button is pending |
Date: |
Wed, 22 Jul 2020 19:17:22 +0300 |
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 <mlevitsk@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
+ */
+ error_setg_errno(errp, EBUSY,
+ "attention button is already pressed, can't "
+ "send another hotplug event");
+ }
+
}
void pcie_cap_slot_pre_plug_cb(HotplugHandler *hotplug_dev, DeviceState *dev,
--
2.26.2