Abort thread wakeups, on some wqe types, are not happening. The thread wakeup logic is dependent upon the LPFC_DRIVER_ABORTED flag. However, on these wqes, the completion handler running prior to the io completion routine ends up clearing the flag. Rework the wakeup logic to look at a non-null waitq element which must be set if the abort thread is waiting. This is reverting the change in the indicated patch.
Unified · Split
| @@ -3878,10 +3878,9 @@ lpfc_scsi_cmd_iocb_cmpl(struct lpfc_hba *phba, struct lpfc_iocbq *pIocbIn, · 3877 unmodified lines | ||
| 3878 | 3878 | * wake up the thread. |
| 3879 | 3879 | */ |
| 3880 | 3880 | spin_lock(&lpfc_cmd->buf_lock); |
| 3881 | − if (unlikely(lpfc_cmd->cur_iocbq.iocb_flag & LPFC_DRIVER_ABORTED)) { | |
| 3882 | − lpfc_cmd->cur_iocbq.iocb_flag &= ~LPFC_DRIVER_ABORTED; | |
| 3883 | − if (lpfc_cmd->waitq) | |
| 3884 | − wake_up(lpfc_cmd->waitq); | |
| 3881 | + lpfc_cmd->cur_iocbq.iocb_flag &= ~LPFC_DRIVER_ABORTED; | |
| 3882 | + if (lpfc_cmd->waitq) { | |
| 3883 | + wake_up(lpfc_cmd->waitq); | |
| 3885 | 3884 | lpfc_cmd->waitq = NULL; |
| 3886 | 3885 | } |
| 3887 | 3886 | spin_unlock(&lpfc_cmd->buf_lock); |