[PATCH v2 2/2] ufs: core: requeue MCQ abort request
Bart Van Assche
bvanassche at acm.org
Thu Sep 5 14:16:40 PDT 2024
On 9/1/24 7:18 PM, peter.wang at mediatek.com wrote:
> diff --git a/drivers/ufs/core/ufs-mcq.c b/drivers/ufs/core/ufs-mcq.c
> index afd9541f4bd8..abdc55a8b960 100644
> --- a/drivers/ufs/core/ufs-mcq.c
> +++ b/drivers/ufs/core/ufs-mcq.c
> @@ -642,6 +642,7 @@ static bool ufshcd_mcq_sqe_search(struct ufs_hba *hba,
> match = le64_to_cpu(utrd->command_desc_base_addr) & CQE_UCD_BA;
> if (addr == match) {
> ufshcd_mcq_nullify_sqe(utrd);
> + lrbp->host_initiate_abort = true;
> ret = true;
> goto out;
> }
I think this is wrong. The above code is only executed if the SCSI core
decides to abort a SCSI command. It is up to the SCSI core to decide
whether or not to retry an aborted command.
> - /* Release cmd in MCQ mode if abort succeeds */
> - if (hba->mcq_enabled && (*ret == 0)) {
> - hwq = ufshcd_mcq_req_to_hwq(hba, scsi_cmd_to_rq(lrbp->cmd));
> - if (!hwq)
> - return 0;
> - spin_lock_irqsave(&hwq->cq_lock, flags);
> - if (ufshcd_cmd_inflight(lrbp->cmd))
> - ufshcd_release_scsi_cmd(hba, lrbp);
> - spin_unlock_irqrestore(&hwq->cq_lock, flags);
> - }
> + /* Host will post to CQ with OCS_ABORTED after SQ cleanup */
> + if (hba->mcq_enabled && (*ret == 0))
> + lrbp->host_initiate_abort = true;
I think this code is racy because the UFS host controller may have
posted a completion before the "lrbp->host_initiate_abort = true"
assignment is executed.
> + * @host_initiate_abort: Abort flag initiated by host
What is "Abort flag"? Please consider renaming "host_initiate_abort"
into "abort_initiated_by_err_handler" since I think that aborted
commands should only be retried if these have been aborted by
ufshcd_err_handler().
Thanks,
Bart.
More information about the Linux-mediatek
mailing list