• Can Guo's avatar
    scsi: ufs: Fix a race condition between ufshcd_abort() and eh_work() · 7a7e66c6
    Can Guo authored
    In current task abort routine, if task abort happens to the device W-LUN,
    the code directly jumps to ufshcd_eh_host_reset_handler() to perform a full
    reset and restore then returns FAIL or SUCCESS. Commands sent to the device
    W-LUN are most likely the SSU cmds sent during UFS PM operations. If such
    SSU cmd enters task abort routine when ufshcd_eh_host_reset_handler()
    flushes eh_work, it will get stuck there since err_handler is serialized
    with PM operations.
    
    In order to unblock above call path, we merely clean up the lrb taken by
    this cmd, queue the eh_work and return SUCCESS. Once the cmd is aborted,
    the PM operation which sends out the cmd just errors out, then err_handler
    shall be able to proceed with the full reset and restore.
    
    In this scenario, the cmd is aborted even before it is actually cleared by
    HW, set the lrb->in_use flag to prevent subsequent cmds, including SCSI
    cmds and dev cmds, from taking the lrb released from abort. The flag shall
    evetually be cleared in __ufshcd_transfer_req_compl() invoked by the full
    reset and restore from err_handler.
    
    [mkp: conflict with event logging series]
    
    Link: https://lore.kernel.org/r/1606910644-21185-3-git-send-email-cang@codeaurora.orgReviewed-by: default avatarAsutosh Das <asutoshd@codeaurora.org>
    Reviewed-by: default avatarStanley Chu <stanley.chu@mediatek.com>
    Signed-off-by: default avatarCan Guo <cang@codeaurora.org>
    Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
    7a7e66c6
ufshcd.h 37.5 KB