BACKPORT: FROMLIST: scsi: ufs: Fix a deadlock in the error handler
The following deadlock has been observed on a test setup: * All tags allocated. * The SCSI error handler calls ufshcd_eh_host_reset_handler() * ufshcd_eh_host_reset_handler() queues work that calls ufshcd_err_handler() * ufshcd_err_handler() locks up as follows: Workqueue: ufs_eh_wq_0 ufshcd_err_handler.cfi_jt Call trace: __switch_to+0x298/0x5d8 __schedule+0x6cc/0xa94 schedule+0x12c/0x298 blk_mq_get_tag+0x210/0x480 __blk_mq_alloc_request+0x1c8/0x284 blk_get_request+0x74/0x134 ufshcd_exec_dev_cmd+0x68/0x640 ufshcd_verify_dev_init+0x68/0x35c ufshcd_probe_hba+0x12c/0x1cb8 ufshcd_host_reset_and_restore+0x88/0x254 ufshcd_reset_and_restore+0xd0/0x354 ufshcd_err_handler+0x408/0xc58 process_one_work+0x24c/0x66c worker_thread+0x3e8/0xa4c kthread+0x150/0x1b4 ret_from_fork+0x10/0x30 Fix this lockup by making ufshcd_exec_dev_cmd() allocate a reserved request. This patch is closely related to the upstream patch with the same title. Bug: 205080886 Link: https://lore.kernel.org/linux-scsi/700f0463-23a9-8465-f712-1188cb884dea@acm.org/T/#u Change-Id: I9e9ba3f45ba23ecf576380aa19701d3437af6cdd Signed-off-by: Bart Van Assche <bvanassche@google.com>
This commit is contained in:
@@ -2932,12 +2932,7 @@ static int ufshcd_exec_dev_cmd(struct ufs_hba *hba,
|
|||||||
|
|
||||||
down_read(&hba->clk_scaling_lock);
|
down_read(&hba->clk_scaling_lock);
|
||||||
|
|
||||||
/*
|
req = blk_mq_alloc_request(q, REQ_OP_DRV_OUT, BLK_MQ_REQ_RESERVED);
|
||||||
* Get free slot, sleep if slots are unavailable.
|
|
||||||
* Even though we use wait_event() which sleeps indefinitely,
|
|
||||||
* the maximum wait time is bounded by SCSI request timeout.
|
|
||||||
*/
|
|
||||||
req = blk_get_request(q, REQ_OP_DRV_OUT, 0);
|
|
||||||
if (IS_ERR(req)) {
|
if (IS_ERR(req)) {
|
||||||
err = PTR_ERR(req);
|
err = PTR_ERR(req);
|
||||||
goto out_unlock;
|
goto out_unlock;
|
||||||
|
Reference in New Issue
Block a user