Patch "scsi: ufs: core: Fix device management cmd timeout flow" has been added to the 6.1-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    scsi: ufs: core: Fix device management cmd timeout flow

to the 6.1-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     scsi-ufs-core-fix-device-management-cmd-timeout-flow.patch
and it can be found in the queue-6.1 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit cac0e685e90d167296569ea748cc705a4d2a3ef4
Author: Mason Zhang <Mason.Zhang@xxxxxxxxxxxx>
Date:   Fri Dec 16 11:25:33 2022 +0800

    scsi: ufs: core: Fix device management cmd timeout flow
    
    [ Upstream commit 36822124f9de200cedc2f42516301b50d386a6cd ]
    
    In the UFS error handling flow, the host will send a device management cmd
    (NOP OUT) to the device for link recovery. If this cmd times out and
    clearing the doorbell fails, ufshcd_wait_for_dev_cmd() will do nothing and
    return. hba->dev_cmd.complete struct is not set to NULL.
    
    When this happens, if cmd has been completed by device, then we will call
    complete() in __ufshcd_transfer_req_compl(). Because the complete struct is
    allocated on the stack, the following crash will occur:
    
      ipanic_die+0x24/0x38 [mrdump]
      die+0x344/0x748
      arm64_notify_die+0x44/0x104
      do_debug_exception+0x104/0x1e0
      el1_dbg+0x38/0x54
      el1_sync_handler+0x40/0x88
      el1_sync+0x8c/0x140
      queued_spin_lock_slowpath+0x2e4/0x3c0
      __ufshcd_transfer_req_compl+0x3b0/0x1164
      ufshcd_trc_handler+0x15c/0x308
      ufshcd_host_reset_and_restore+0x54/0x260
      ufshcd_reset_and_restore+0x28c/0x57c
      ufshcd_err_handler+0xeb8/0x1b6c
      process_one_work+0x288/0x964
      worker_thread+0x4bc/0xc7c
      kthread+0x15c/0x264
      ret_from_fork+0x10/0x30
    
    Link: https://lore.kernel.org/r/20221216032532.1280-1-mason.zhang@xxxxxxxxxxxx
    Signed-off-by: Mason Zhang <Mason.Zhang@xxxxxxxxxxxx>
    Reviewed-by: Bart Van Assche <bvanassche@xxxxxxx>
    Signed-off-by: Martin K. Petersen <martin.petersen@xxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c
index e08ce7f2ff3af..edd34dac91b1d 100644
--- a/drivers/ufs/core/ufshcd.c
+++ b/drivers/ufs/core/ufshcd.c
@@ -3006,6 +3006,22 @@ static int ufshcd_wait_for_dev_cmd(struct ufs_hba *hba,
 		} else {
 			dev_err(hba->dev, "%s: failed to clear tag %d\n",
 				__func__, lrbp->task_tag);
+
+			spin_lock_irqsave(&hba->outstanding_lock, flags);
+			pending = test_bit(lrbp->task_tag,
+					   &hba->outstanding_reqs);
+			if (pending)
+				hba->dev_cmd.complete = NULL;
+			spin_unlock_irqrestore(&hba->outstanding_lock, flags);
+
+			if (!pending) {
+				/*
+				 * The completion handler ran while we tried to
+				 * clear the command.
+				 */
+				time_left = 1;
+				goto retry;
+			}
 		}
 	}
 



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux