]> git.baikalelectronics.ru Git - kernel.git/commitdiff
scsi: ufs: Fix ufshcd_hold() caused scheduling while atomic
authorCan Guo <cang@codeaurora.org>
Tue, 11 Feb 2020 03:40:48 +0000 (19:40 -0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 21 Apr 2020 07:04:51 +0000 (09:04 +0200)
commit 0cb2e6bf8770ba2623369352ef92535aeb77ac22 upstream.

The async version of ufshcd_hold(async == true), which is only called in
queuecommand path as for now, is expected to work in atomic context, thus
it should not sleep or schedule out. When it runs into the condition that
clocks are ON but link is still in hibern8 state, it should bail out
without flushing the clock ungate work.

Fixes: f3378aa1959e ("scsi: ufshcd: Fix race between clk scaling and ungate work")
Link: https://lore.kernel.org/r/1581392451-28743-6-git-send-email-cang@codeaurora.org
Reviewed-by: Hongwu Su <hongwus@codeaurora.org>
Reviewed-by: Asutosh Das <asutoshd@codeaurora.org>
Reviewed-by: Bean Huo <beanhuo@micron.com>
Reviewed-by: Stanley Chu <stanley.chu@mediatek.com>
Signed-off-by: Can Guo <cang@codeaurora.org>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/scsi/ufs/ufshcd.c

index a6863b51a1d04a4acf4474f33afe343efb6aaf47..13ab1494c384cf92a5b2966c85cfd1b9dec0dbca 100644 (file)
@@ -1539,6 +1539,11 @@ start:
                 */
                if (ufshcd_can_hibern8_during_gating(hba) &&
                    ufshcd_is_link_hibern8(hba)) {
+                       if (async) {
+                               rc = -EAGAIN;
+                               hba->clk_gating.active_reqs--;
+                               break;
+                       }
                        spin_unlock_irqrestore(hba->host->host_lock, flags);
                        flush_work(&hba->clk_gating.ungate_work);
                        spin_lock_irqsave(hba->host->host_lock, flags);