SCSI EH wakeup deadlock from deferred_qc
Igor Pylypiv <[email protected]> Wed, 8 Jul 2026 12:36:44 -0700
| Newsgroups | gmane.linux.ide |
|---|---|
| Message-ID | <[email protected]> |
Hi Damien, I've stumbled upon an issue where SCSI EH didn't run upon command timeout but ran ~10 or so seconds later. It seems like a recent regression from the introduction of deffered_qc. When an active command times out while a non-NCQ command is waiting in deferred_qc, SCSI EH fails to wake up. Recovery stalls until the deferred command's own timer expires. When an NCQ command times out, scsi_timeout() calls scsi_eh_scmd_add(), incrementing shost->host_failed (1). However, when scsi_eh_wakeup() checks whether to wake the EH thread, scsi_host_busy(shost) counts 2 active commands (1 timed-out + 1 in deferred_qc). Because busy (2) != host_failed (1), scsi_eh_wakeup() refuses to wake the EH thread, deadlocking error recovery until the deferred command times out on its own. Thanks, Igor