* [PATCH v5 0/2] Two fixes for task management request implementation
@ 2021-04-01 7:39 Can Guo
2021-04-01 7:39 ` [PATCH v5 1/2] scsi: ufs: Fix task management request completion timeout Can Guo
` (2 more replies)
0 siblings, 3 replies; 5+ messages in thread
From: Can Guo @ 2021-04-01 7:39 UTC (permalink / raw)
To: asutoshd, nguyenb, hongwus, linux-scsi, kernel-team, cang
These fixes are based on Jaegeuk's change - https://git.kernel.org/mkp/scsi/c/eeb1b55b6e25
Change since v4:
- Incorporated Daejun's comments
Change since v3:
- Deleted the 2nd change
- Incorporated Bart's comments
Change since v2:
- Split one change into 3 changes
Change since v1:
- Typo fixed
Can Guo (2):
scsi: ufs: Fix task management request completion timeout
scsi: ufs: Fix wrong Task Tag used in task management request UPIUs
drivers/scsi/ufs/ufshcd.c | 31 ++++++++++++++-----------------
1 file changed, 14 insertions(+), 17 deletions(-)
--
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, a Linux Foundation Collaborative Project.
^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH v5 1/2] scsi: ufs: Fix task management request completion timeout
2021-04-01 7:39 [PATCH v5 0/2] Two fixes for task management request implementation Can Guo
@ 2021-04-01 7:39 ` Can Guo
2021-04-02 0:09 ` Bart Van Assche
2021-04-01 7:39 ` [PATCH v5 2/2] scsi: ufs: Fix wrong Task Tag used in task management request UPIUs Can Guo
2021-04-02 3:54 ` [PATCH v5 0/2] Two fixes for task management request implementation Martin K. Petersen
2 siblings, 1 reply; 5+ messages in thread
From: Can Guo @ 2021-04-01 7:39 UTC (permalink / raw)
To: asutoshd, nguyenb, hongwus, linux-scsi, kernel-team, cang
Cc: Alim Akhtar, Avri Altman, James E.J. Bottomley,
Martin K. Petersen, Stanley Chu, Bean Huo, Jaegeuk Kim,
Bart Van Assche, open list
ufshcd_tmc_handler() calls blk_mq_tagset_busy_iter(fn = ufshcd_compl_tm()),
but since blk_mq_tagset_busy_iter() only iterates over all reserved tags
and requests which are not in IDLE state, ufshcd_compl_tm() never gets a
chance to run. Thus, TMR always ends up with completion timeout. Fix it by
calling blk_mq_start_request() in __ufshcd_issue_tm_cmd().
Fixes: 69a6c269c097 ("scsi: ufs: Use blk_{get,put}_request() to allocate and free TMFs")
Signed-off-by: Can Guo <cang@codeaurora.org>
---
drivers/scsi/ufs/ufshcd.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c
index b49555fa..d4f8cb2 100644
--- a/drivers/scsi/ufs/ufshcd.c
+++ b/drivers/scsi/ufs/ufshcd.c
@@ -6464,6 +6464,7 @@ static int __ufshcd_issue_tm_cmd(struct ufs_hba *hba,
spin_lock_irqsave(host->host_lock, flags);
task_tag = hba->nutrs + free_slot;
+ blk_mq_start_request(req);
treq->req_header.dword_0 |= cpu_to_be32(task_tag);
--
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, a Linux Foundation Collaborative Project.
^ permalink raw reply related [flat|nested] 5+ messages in thread
* [PATCH v5 2/2] scsi: ufs: Fix wrong Task Tag used in task management request UPIUs
2021-04-01 7:39 [PATCH v5 0/2] Two fixes for task management request implementation Can Guo
2021-04-01 7:39 ` [PATCH v5 1/2] scsi: ufs: Fix task management request completion timeout Can Guo
@ 2021-04-01 7:39 ` Can Guo
2021-04-02 3:54 ` [PATCH v5 0/2] Two fixes for task management request implementation Martin K. Petersen
2 siblings, 0 replies; 5+ messages in thread
From: Can Guo @ 2021-04-01 7:39 UTC (permalink / raw)
To: asutoshd, nguyenb, hongwus, linux-scsi, kernel-team, cang
Cc: Alim Akhtar, Avri Altman, James E.J. Bottomley,
Martin K. Petersen, Stanley Chu, Bean Huo, Jaegeuk Kim,
Sujit Reddy Thumma, Vinayak Holikatti, Yaniv Gardi, open list
In __ufshcd_issue_tm_cmd(), it is not right to use hba->nutrs + req->tag as
the Task Tag in one TMR UPIU. Directly use req->tag as the Task Tag.
Fixes: e293313262d3 ("scsi: ufs: Fix broken task management command implementation")
Reviewed-by: Bart Van Assche <bvanassche@acm.org>
Signed-off-by: Can Guo <cang@codeaurora.org>
---
drivers/scsi/ufs/ufshcd.c | 30 +++++++++++++-----------------
1 file changed, 13 insertions(+), 17 deletions(-)
diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c
index d4f8cb2..ce5f3fea 100644
--- a/drivers/scsi/ufs/ufshcd.c
+++ b/drivers/scsi/ufs/ufshcd.c
@@ -6446,38 +6446,34 @@ static int __ufshcd_issue_tm_cmd(struct ufs_hba *hba,
DECLARE_COMPLETION_ONSTACK(wait);
struct request *req;
unsigned long flags;
- int free_slot, task_tag, err;
+ int task_tag, err;
/*
- * Get free slot, sleep if slots are unavailable.
- * Even though we use wait_event() which sleeps indefinitely,
- * the maximum wait time is bounded by %TM_CMD_TIMEOUT.
+ * blk_get_request() is used here only to get a free tag.
*/
req = blk_get_request(q, REQ_OP_DRV_OUT, 0);
if (IS_ERR(req))
return PTR_ERR(req);
req->end_io_data = &wait;
- free_slot = req->tag;
- WARN_ON_ONCE(free_slot < 0 || free_slot >= hba->nutmrs);
ufshcd_hold(hba, false);
spin_lock_irqsave(host->host_lock, flags);
- task_tag = hba->nutrs + free_slot;
blk_mq_start_request(req);
+ task_tag = req->tag;
treq->req_header.dword_0 |= cpu_to_be32(task_tag);
- memcpy(hba->utmrdl_base_addr + free_slot, treq, sizeof(*treq));
- ufshcd_vops_setup_task_mgmt(hba, free_slot, tm_function);
+ memcpy(hba->utmrdl_base_addr + task_tag, treq, sizeof(*treq));
+ ufshcd_vops_setup_task_mgmt(hba, task_tag, tm_function);
/* send command to the controller */
- __set_bit(free_slot, &hba->outstanding_tasks);
+ __set_bit(task_tag, &hba->outstanding_tasks);
/* Make sure descriptors are ready before ringing the task doorbell */
wmb();
- ufshcd_writel(hba, 1 << free_slot, REG_UTP_TASK_REQ_DOOR_BELL);
+ ufshcd_writel(hba, 1 << task_tag, REG_UTP_TASK_REQ_DOOR_BELL);
/* Make sure that doorbell is committed immediately */
wmb();
@@ -6497,24 +6493,24 @@ static int __ufshcd_issue_tm_cmd(struct ufs_hba *hba,
ufshcd_add_tm_upiu_trace(hba, task_tag, UFS_TM_ERR);
dev_err(hba->dev, "%s: task management cmd 0x%.2x timed-out\n",
__func__, tm_function);
- if (ufshcd_clear_tm_cmd(hba, free_slot))
- dev_WARN(hba->dev, "%s: unable clear tm cmd (slot %d) after timeout\n",
- __func__, free_slot);
+ if (ufshcd_clear_tm_cmd(hba, task_tag))
+ dev_WARN(hba->dev, "%s: unable to clear tm cmd (slot %d) after timeout\n",
+ __func__, task_tag);
err = -ETIMEDOUT;
} else {
err = 0;
- memcpy(treq, hba->utmrdl_base_addr + free_slot, sizeof(*treq));
+ memcpy(treq, hba->utmrdl_base_addr + task_tag, sizeof(*treq));
ufshcd_add_tm_upiu_trace(hba, task_tag, UFS_TM_COMP);
}
spin_lock_irqsave(hba->host->host_lock, flags);
- __clear_bit(free_slot, &hba->outstanding_tasks);
+ __clear_bit(task_tag, &hba->outstanding_tasks);
spin_unlock_irqrestore(hba->host->host_lock, flags);
+ ufshcd_release(hba);
blk_put_request(req);
- ufshcd_release(hba);
return err;
}
--
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, a Linux Foundation Collaborative Project.
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH v5 1/2] scsi: ufs: Fix task management request completion timeout
2021-04-01 7:39 ` [PATCH v5 1/2] scsi: ufs: Fix task management request completion timeout Can Guo
@ 2021-04-02 0:09 ` Bart Van Assche
0 siblings, 0 replies; 5+ messages in thread
From: Bart Van Assche @ 2021-04-02 0:09 UTC (permalink / raw)
To: Can Guo, asutoshd, nguyenb, hongwus, linux-scsi, kernel-team
Cc: Alim Akhtar, Avri Altman, James E.J. Bottomley,
Martin K. Petersen, Stanley Chu, Bean Huo, Jaegeuk Kim, open list
On 4/1/21 12:39 AM, Can Guo wrote:
> ufshcd_tmc_handler() calls blk_mq_tagset_busy_iter(fn = ufshcd_compl_tm()),
> but since blk_mq_tagset_busy_iter() only iterates over all reserved tags
> and requests which are not in IDLE state, ufshcd_compl_tm() never gets a
> chance to run. Thus, TMR always ends up with completion timeout. Fix it by
> calling blk_mq_start_request() in __ufshcd_issue_tm_cmd().
Reviewed-by: Bart Van Assche <bvanassche@acm.org>
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH v5 0/2] Two fixes for task management request implementation
2021-04-01 7:39 [PATCH v5 0/2] Two fixes for task management request implementation Can Guo
2021-04-01 7:39 ` [PATCH v5 1/2] scsi: ufs: Fix task management request completion timeout Can Guo
2021-04-01 7:39 ` [PATCH v5 2/2] scsi: ufs: Fix wrong Task Tag used in task management request UPIUs Can Guo
@ 2021-04-02 3:54 ` Martin K. Petersen
2 siblings, 0 replies; 5+ messages in thread
From: Martin K. Petersen @ 2021-04-02 3:54 UTC (permalink / raw)
To: hongwus, linux-scsi, nguyenb, asutoshd, kernel-team, Can Guo
Cc: Martin K . Petersen
On Thu, 1 Apr 2021 00:39:07 -0700, Can Guo wrote:
> These fixes are based on Jaegeuk's change - https://git.kernel.org/mkp/scsi/c/eeb1b55b6e25
>
> Change since v4:
> - Incorporated Daejun's comments
>
> Change since v3:
> - Deleted the 2nd change
> - Incorporated Bart's comments
>
> [...]
Applied to 5.12/scsi-fixes, thanks!
[1/2] scsi: ufs: Fix task management request completion timeout
https://git.kernel.org/mkp/scsi/c/1235fc569e0b
[2/2] scsi: ufs: Fix wrong Task Tag used in task management request UPIUs
https://git.kernel.org/mkp/scsi/c/4b42d557a8ad
--
Martin K. Petersen Oracle Linux Engineering
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2021-04-02 3:55 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2021-04-01 7:39 [PATCH v5 0/2] Two fixes for task management request implementation Can Guo
2021-04-01 7:39 ` [PATCH v5 1/2] scsi: ufs: Fix task management request completion timeout Can Guo
2021-04-02 0:09 ` Bart Van Assche
2021-04-01 7:39 ` [PATCH v5 2/2] scsi: ufs: Fix wrong Task Tag used in task management request UPIUs Can Guo
2021-04-02 3:54 ` [PATCH v5 0/2] Two fixes for task management request implementation Martin K. Petersen
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.