From: Hannes Reinecke <hare@suse.de>
To: "Martin K. Petersen" <martin.petersen@oracle.com>
Cc: Christoph Hellwig <hch@lst.de>,
James Bottomley <james.bottomley@hansenpartnership.com>,
linux-scsi@vger.kernel.org, Hannes Reinecke <hare@suse.de>
Subject: [PATCH 06/10] scsi_error: iterate over list of failed commands in scsi_eh_bus_reset()
Date: Mon, 23 Oct 2023 11:28:33 +0200 [thread overview]
Message-ID: <20231023092837.33786-7-hare@suse.de> (raw)
In-Reply-To: <20231023092837.33786-1-hare@suse.de>
Iterating over all possible bus number in scsi_eh_bus_reset() is
inefficient as not all busses may be affected during SCSI EH.
So rewrite the loop in scsi_eh_bus_reset() to match the loop
in scsi_eh_target_reset() and only loop over failed commands.
Signed-off-by: Hannes Reinecke <hare@suse.de>
Reviewed-by: Christoph Hellwig <hch@lst.de>
---
drivers/scsi/scsi_error.c | 62 ++++++++++++++++-----------------------
1 file changed, 25 insertions(+), 37 deletions(-)
diff --git a/drivers/scsi/scsi_error.c b/drivers/scsi/scsi_error.c
index 42e12756d6f4..7c9c376affda 100644
--- a/drivers/scsi/scsi_error.c
+++ b/drivers/scsi/scsi_error.c
@@ -1694,21 +1694,20 @@ static int scsi_eh_bus_reset(struct Scsi_Host *shost,
struct list_head *work_q,
struct list_head *done_q)
{
- struct scsi_cmnd *scmd, *chan_scmd, *next;
+ LIST_HEAD(tmp_list);
LIST_HEAD(check_list);
- unsigned int channel;
- enum scsi_disposition rtn;
- /*
- * we really want to loop over the various channels, and do this on
- * a channel by channel basis. we should also check to see if any
- * of the failed commands are on soft_reset devices, and if so, skip
- * the reset.
- */
+ list_splice_init(work_q, &tmp_list);
+
+ while (!list_empty(&tmp_list)) {
+ struct scsi_cmnd *next, *scmd;
+ enum scsi_disposition rtn;
+ unsigned int channel;
- for (channel = 0; channel <= shost->max_channel; channel++) {
if (scsi_host_eh_past_deadline(shost)) {
+ /* push back on work queue for further processing */
list_splice_init(&check_list, work_q);
+ list_splice_init(&tmp_list, work_q);
SCSI_LOG_ERROR_RECOVERY(3,
shost_printk(KERN_INFO, shost,
"%s: skip BRST, past eh deadline\n",
@@ -1716,43 +1715,32 @@ static int scsi_eh_bus_reset(struct Scsi_Host *shost,
return list_empty(work_q);
}
- chan_scmd = NULL;
- list_for_each_entry(scmd, work_q, eh_entry) {
- if (channel == scmd_channel(scmd)) {
- chan_scmd = scmd;
- break;
- /*
- * FIXME add back in some support for
- * soft_reset devices.
- */
- }
- }
+ scmd = list_first_entry(&tmp_list, struct scsi_cmnd, eh_entry);
+ channel = scmd_channel(scmd);
- if (!chan_scmd)
- continue;
SCSI_LOG_ERROR_RECOVERY(3,
shost_printk(KERN_INFO, shost,
"%s: Sending BRST chan: %d\n",
current->comm, channel));
- rtn = scsi_try_bus_reset(chan_scmd);
- if (rtn == SUCCESS || rtn == FAST_IO_FAIL) {
- list_for_each_entry_safe(scmd, next, work_q, eh_entry) {
- if (channel == scmd_channel(scmd)) {
- if (rtn == FAST_IO_FAIL) {
- set_host_byte(scmd,
- DID_TRANSPORT_FAILFAST);
- scsi_eh_finish_cmd(scmd, done_q);
- } else
- list_move_tail(&scmd->eh_entry,
- &check_list);
- }
- }
- } else {
+ rtn = scsi_try_bus_reset(scmd);
+ if (rtn != SUCCESS && rtn != FAST_IO_FAIL) {
SCSI_LOG_ERROR_RECOVERY(3,
shost_printk(KERN_INFO, shost,
"%s: BRST failed chan: %d\n",
current->comm, channel));
}
+ list_for_each_entry_safe(scmd, next, work_q, eh_entry) {
+ if (scmd_channel(scmd) != channel)
+ continue;
+
+ if (rtn == SUCCESS)
+ list_move_tail(&scmd->eh_entry, &check_list);
+ else if (rtn == FAST_IO_FAIL) {
+ set_host_byte(scmd, DID_TRANSPORT_FAILFAST);
+ scsi_eh_finish_cmd(scmd, done_q);
+ } else
+ list_move_tail(&scmd->eh_entry, work_q);
+ }
}
return scsi_eh_test_devices(&check_list, work_q, done_q, 0);
}
--
2.35.3
next prev parent reply other threads:[~2023-10-23 9:28 UTC|newest]
Thread overview: 36+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-10-23 9:28 [PATCHv8 00/10] scsi: EH rework, main part Hannes Reinecke
2023-10-23 9:28 ` [PATCH 01/10] scsi: Use Scsi_Host as argument for eh_host_reset_handler Hannes Reinecke
2023-10-25 11:40 ` Benjamin Block
2023-10-23 9:28 ` [PATCH 02/10] scsi: Use Scsi_Host and channel number as argument for eh_bus_reset_handler() Hannes Reinecke
2023-10-25 13:33 ` Benjamin Block
2023-10-25 13:36 ` Hannes Reinecke
2023-10-25 15:15 ` Benjamin Block
2023-10-23 9:28 ` [PATCH 03/10] scsi: Use scsi_target as argument for eh_target_reset_handler() Hannes Reinecke
2023-10-25 15:11 ` Benjamin Block
2023-10-25 15:35 ` Hannes Reinecke
2023-10-25 15:49 ` Benjamin Block
2023-10-23 9:28 ` [PATCH 04/10] scsi: Use scsi_device as argument to eh_device_reset_handler() Hannes Reinecke
2023-10-26 12:24 ` Benjamin Block
2023-10-26 12:39 ` Hannes Reinecke
2023-10-26 12:44 ` Benjamin Block
2023-10-23 9:28 ` [PATCH 05/10] scsi: set host byte after EH completed Hannes Reinecke
2023-10-26 12:58 ` Benjamin Block
2023-10-23 9:28 ` Hannes Reinecke [this message]
2023-10-26 13:19 ` [PATCH 06/10] scsi_error: iterate over list of failed commands in scsi_eh_bus_reset() Benjamin Block
2023-10-23 9:28 ` [PATCH 07/10] scsi: Do not allocate scsi command in scsi_ioctl_reset() Hannes Reinecke
2023-10-26 13:47 ` Benjamin Block
2023-10-23 9:28 ` [PATCH 08/10] scsi_error: iterate over list of failed commands in scsi_eh_bus_device_reset() Hannes Reinecke
2023-10-26 13:54 ` Benjamin Block
2023-10-23 9:28 ` [PATCH 09/10] scsi_error: map FAST_IO_FAIL to -EAGAIN in SCSI EH Hannes Reinecke
2023-10-26 14:08 ` Benjamin Block
2023-10-26 16:50 ` Mike Christie
2023-10-27 5:05 ` Hannes Reinecke
2023-10-23 9:28 ` [PATCH 10/10] scsi: remove SUBMITTED_BY_SCSI_RESET_IOCTL Hannes Reinecke
2023-10-26 14:12 ` Benjamin Block
2023-10-24 17:30 ` [PATCHv8 00/10] scsi: EH rework, main part Benjamin Block
2023-10-24 17:40 ` Hannes Reinecke
2023-10-24 17:57 ` Benjamin Block
2024-03-06 13:40 ` Wenchao Hao
2024-11-05 9:10 ` Niklas Cassel
2024-11-05 15:22 ` Hannes Reinecke
2024-11-05 15:47 ` Niklas Cassel
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20231023092837.33786-7-hare@suse.de \
--to=hare@suse.de \
--cc=hch@lst.de \
--cc=james.bottomley@hansenpartnership.com \
--cc=linux-scsi@vger.kernel.org \
--cc=martin.petersen@oracle.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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.