Skip to content

Commit

Permalink
scsi: mpt3sas: Fix deadlock while cancelling the running firmware event
Browse files Browse the repository at this point in the history
Do not cancel current running firmware event work if the event type is
different from MPT3SAS_REMOVE_UNRESPONDING_DEVICES.  Otherwise a deadlock
can be observed while cancelling the current firmware event work if a hard
reset operation is called as part of processing the current event.

Link: https://lore.kernel.org/r/20210518051625.1596742-2-suganath-prabu.subramani@broadcom.com
Signed-off-by: Suganath Prabu S <suganath-prabu.subramani@broadcom.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
  • Loading branch information
Suganath Prabu S authored and Martin K. Petersen committed Jun 1, 2021
1 parent ea2f0f7 commit e2fac6c
Showing 1 changed file with 22 additions and 0 deletions.
22 changes: 22 additions & 0 deletions drivers/scsi/mpt3sas/mpt3sas_scsih.c
Original file line number Diff line number Diff line change
Expand Up @@ -3697,6 +3697,28 @@ _scsih_fw_event_cleanup_queue(struct MPT3SAS_ADAPTER *ioc)
ioc->fw_events_cleanup = 1;
while ((fw_event = dequeue_next_fw_event(ioc)) ||
(fw_event = ioc->current_event)) {

/*
* Don't call cancel_work_sync() for current_event
* other than MPT3SAS_REMOVE_UNRESPONDING_DEVICES;
* otherwise we may observe deadlock if current
* hard reset issued as part of processing the current_event.
*
* Orginal logic of cleaning the current_event is added
* for handling the back to back host reset issued by the user.
* i.e. during back to back host reset, driver use to process
* the two instances of MPT3SAS_REMOVE_UNRESPONDING_DEVICES
* event back to back and this made the drives to unregister
* the devices from SML.
*/

if (fw_event == ioc->current_event &&
ioc->current_event->event !=
MPT3SAS_REMOVE_UNRESPONDING_DEVICES) {
ioc->current_event = NULL;
continue;
}

/*
* Wait on the fw_event to complete. If this returns 1, then
* the event was never executed, and we need a put for the
Expand Down

0 comments on commit e2fac6c

Please sign in to comment.