• Adrian Hunter's avatar
    scsi: ufs: core: Fix task management completion · f5ef336f
    Adrian Hunter authored
    The UFS driver uses blk_mq_tagset_busy_iter() when identifying task
    management requests to complete, however blk_mq_tagset_busy_iter() doesn't
    work.
    
    blk_mq_tagset_busy_iter() only iterates requests dispatched by the block
    layer. That appears as if it might have started since commit 37f4a24c
    ("blk-mq: centralise related handling into blk_mq_get_driver_tag") which
    removed 'data->hctx->tags->rqs[rq->tag] = rq' from blk_mq_rq_ctx_init()
    which gets called:
    
    	blk_get_request
    		blk_mq_alloc_request
    			__blk_mq_alloc_request
    				blk_mq_rq_ctx_init
    
    Since UFS task management requests are not dispatched by the block layer,
    hctx->tags->rqs[rq->tag] remains NULL, and since blk_mq_tagset_busy_iter()
    relies on finding requests using hctx->tags->rqs[rq->tag], UFS task
    management requests are never found by blk_mq_tagset_busy_iter().
    
    By using blk_mq_tagset_busy_iter(), the UFS driver was relying on internal
    details of the block layer, which was fragile and subsequently got
    broken. Fix by removing the use of blk_mq_tagset_busy_iter() and having the
    driver keep track of task management requests.
    
    Link: https://lore.kernel.org/r/20210922091059.4040-1-adrian.hunter@intel.com
    Fixes: 1235fc56 ("scsi: ufs: core: Fix task management request completion timeout")
    Fixes: 69a6c269 ("scsi: ufs: Use blk_{get,put}_request() to allocate and free TMFs")
    Cc: stable@vger.kernel.org
    Tested-by: default avatarBart Van Assche <bvanassche@acm.org>
    Reviewed-by: default avatarBart Van Assche <bvanassche@acm.org>
    Signed-off-by: default avatarAdrian Hunter <adrian.hunter@intel.com>
    Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
    f5ef336f
ufshcd.c 263 KB