On Tue, Mar 12, 2019 at 03:05:48PM +0300, Sergey Miroshnichenko wrote: > During the safe removal procedure, a Data Link Layer State Changed event > may occur after pciehp_power_off_slot(), and it is handled when the slot is > already set to OFF_STATE. This results in re-enabling the device and makes > it impossible to actually safely remove it. > > Clear out the Presence Detect Changed and Data Link Layer State Changed > events when the disabled slot has settled down. > > It is still possible to re-enable the device if it remains in the slot > after pressing the Attention Button by pressing it again. > > Signed-off-by: Sergey Miroshnichenko <s.miroshnichenko@xxxxxxxxx> Reviewed-by: Lukas Wunner <lukas@xxxxxxxxx> Did this work correctly before v4.19 or is it a regression caused by d331710ea78f ("PCI: pciehp: Become resilient to missed events")? Either way, it seems reasonable to backport it to stable and v4.19 is the earliest that it should apply cleanly to, so: Cc: stable@xxxxxxxxxxxxxxx # v4.19+ Thanks a lot for catching this, I wasn't able to test the code paths which are only exercised if a power controller is present (because Thunderbolt doesn't have one). Lukas > --- > drivers/pci/hotplug/pciehp_ctrl.c | 4 ++++ > 1 file changed, 4 insertions(+) > > diff --git a/drivers/pci/hotplug/pciehp_ctrl.c b/drivers/pci/hotplug/pciehp_ctrl.c > index 3f3df4c29f6e..905282a8ddaa 100644 > --- a/drivers/pci/hotplug/pciehp_ctrl.c > +++ b/drivers/pci/hotplug/pciehp_ctrl.c > @@ -115,6 +115,10 @@ static void remove_board(struct controller *ctrl, bool safe_removal) > * removed from the slot/adapter. > */ > msleep(1000); > + > + /* Ignore link or presence changes caused by power off */ > + atomic_and(~(PCI_EXP_SLTSTA_DLLSC | PCI_EXP_SLTSTA_PDC), > + &ctrl->pending_events); > } > > /* turn off Green LED */ > -- > 2.20.1