diff mbox series

scsi: core: move scsi_host_busy() out of host lock if it is for per-command

Message ID 20240203024521.2006455-1-ming.lei@redhat.com (mailing list archive)
State Accepted
Headers show
Series scsi: core: move scsi_host_busy() out of host lock if it is for per-command | expand

Commit Message

Ming Lei Feb. 3, 2024, 2:45 a.m. UTC
Commit 4373534a9850 ("scsi: core: Move scsi_host_busy() out of host lock for
waking up EH handler") is for fixing hard lockup issue triggered by EH.

The core idea is to move scsi_host_busy() out of host lock if it is
called for per-command. However, the patch is merged as wrong and
doesn't move scsi_host_busy() out of host lock, so fix it.

Fixes: 4373534a9850 ("scsi: core: Move scsi_host_busy() out of host lock for waking up EH handler")
Cc: Sathya Prakash Veerichetty <safhya.prakash@broadcom.com>
Cc: Bart Van Assche <bvanassche@acm.org>
Cc: Ewan D. Milne <emilne@redhat.com>
Signed-off-by: Ming Lei <ming.lei@redhat.com>
---
 drivers/scsi/scsi_error.c | 3 ++-
 drivers/scsi/scsi_lib.c   | 4 +++-
 2 files changed, 5 insertions(+), 2 deletions(-)

Comments

Bart Van Assche Feb. 3, 2024, 3:51 a.m. UTC | #1
On 2/2/24 18:45, Ming Lei wrote:
> Commit 4373534a9850 ("scsi: core: Move scsi_host_busy() out of host lock for
> waking up EH handler") is for fixing hard lockup issue triggered by EH.
> 
> The core idea is to move scsi_host_busy() out of host lock if it is
> called for per-command. However, the patch is merged as wrong and
                                                 ^^^^^^^^^^^^^^^
I'm not sure what this means?

> doesn't move scsi_host_busy() out of host lock, so fix it.

Anyway:

Reviewed-by: Bart Van Assche <bvanassche@acm.org>
Martin K. Petersen Feb. 6, 2024, 2:08 a.m. UTC | #2
On Sat, 03 Feb 2024 10:45:21 +0800, Ming Lei wrote:

> Commit 4373534a9850 ("scsi: core: Move scsi_host_busy() out of host lock for
> waking up EH handler") is for fixing hard lockup issue triggered by EH.
> 
> The core idea is to move scsi_host_busy() out of host lock if it is
> called for per-command. However, the patch is merged as wrong and
> doesn't move scsi_host_busy() out of host lock, so fix it.
> 
> [...]

Applied to 6.8/scsi-fixes, thanks!

[1/1] scsi: core: move scsi_host_busy() out of host lock if it is for per-command
      https://git.kernel.org/mkp/scsi/c/4e6c90119907
diff mbox series

Patch

diff --git a/drivers/scsi/scsi_error.c b/drivers/scsi/scsi_error.c
index 4f455884fdc4..612489afe8d2 100644
--- a/drivers/scsi/scsi_error.c
+++ b/drivers/scsi/scsi_error.c
@@ -282,11 +282,12 @@  static void scsi_eh_inc_host_failed(struct rcu_head *head)
 {
 	struct scsi_cmnd *scmd = container_of(head, typeof(*scmd), rcu);
 	struct Scsi_Host *shost = scmd->device->host;
+	unsigned int busy = scsi_host_busy(shost);
 	unsigned long flags;
 
 	spin_lock_irqsave(shost->host_lock, flags);
 	shost->host_failed++;
-	scsi_eh_wakeup(shost, scsi_host_busy(shost));
+	scsi_eh_wakeup(shost, busy);
 	spin_unlock_irqrestore(shost->host_lock, flags);
 }
 
diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c
index 1fb80eae9a63..df5ac03d5d6c 100644
--- a/drivers/scsi/scsi_lib.c
+++ b/drivers/scsi/scsi_lib.c
@@ -278,9 +278,11 @@  static void scsi_dec_host_busy(struct Scsi_Host *shost, struct scsi_cmnd *cmd)
 	rcu_read_lock();
 	__clear_bit(SCMD_STATE_INFLIGHT, &cmd->state);
 	if (unlikely(scsi_host_in_recovery(shost))) {
+		unsigned int busy = scsi_host_busy(shost);
+
 		spin_lock_irqsave(shost->host_lock, flags);
 		if (shost->host_failed || shost->host_eh_scheduled)
-			scsi_eh_wakeup(shost, scsi_host_busy(shost));
+			scsi_eh_wakeup(shost, busy);
 		spin_unlock_irqrestore(shost->host_lock, flags);
 	}
 	rcu_read_unlock();