From: James Bottomley <James.Bottomley@HansenPartnership.com>
To: Jens Axboe <jens.axboe@oracle.com>, Mike Christie <michaelc@cs.wisc.edu>
Cc: Mike Anderson <andmike@linux.vnet.ibm.com>,
linux-scsi <linux-scsi@vger.kernel.org>
Subject: Re: Block timeouts seem not to be working
Date: Fri, 12 Sep 2008 16:46:51 -0500 [thread overview]
Message-ID: <1221256012.3319.21.camel@localhost.localdomain> (raw)
In-Reply-To: <20080911183509.GX20055@kernel.dk>
On Thu, 2008-09-11 at 20:35 +0200, Jens Axboe wrote:
> On Thu, Sep 11 2008, James Bottomley wrote:
> > I just noticed this with a rather finickey SAS system I have. It's got
> > a SATA DVD attached over an expander. Periodically the DVD just hangs
> > up, so we wait for the timeout and then send a phy reset which clears
> > it.
> >
> > What I'm seeing with the new block timer code is that the timer never
> > expires. I can dig some more into this, but if you wanted to test it as
> > well, the timer code is easy to excite. Just throw away one command in
> > every 128 or so in the queuecommand routine of your favourite HBA
> > driver.
>
> James, I've seen a few oddities as well, I'll be beating on it tomorrow
> again to shake out the last bug(s).
Actually, turns out it's nothing to do with block timeouts, it's a
target reset bug.
This loop:
for (id = 0; id <= shost->max_id; id++) {
Never terminates if shost->max_id is set to ~0, like aic94xx does.
It's also pretty inefficient since you mostly have compact target
numbers, but the max_id can be very high. The best way would be to sort
the recovery list by target id and skip them if they're equal, but even
a worst case O(N^2) traversal is probably OK here.
James
---
diff --git a/drivers/scsi/scsi_error.c b/drivers/scsi/scsi_error.c
index ad019ec..94ed262 100644
--- a/drivers/scsi/scsi_error.c
+++ b/drivers/scsi/scsi_error.c
@@ -1065,10 +1065,10 @@ static int scsi_eh_target_reset(struct Scsi_Host *shost,
struct list_head *done_q)
{
struct scsi_cmnd *scmd, *tgtr_scmd, *next;
- unsigned int id;
+ unsigned int id = 0;
int rtn;
- for (id = 0; id <= shost->max_id; id++) {
+ do {
tgtr_scmd = NULL;
list_for_each_entry(scmd, work_q, eh_entry) {
if (id == scmd_id(scmd)) {
@@ -1076,8 +1076,18 @@ static int scsi_eh_target_reset(struct Scsi_Host *shost,
break;
}
}
+ if (!tgtr_scmd) {
+ /* not one exactly equal; find the next highest */
+ list_for_each_entry(scmd, work_q, eh_entry) {
+ if (scmd_id(scmd) > id &&
+ (!tgtr_scmd ||
+ scmd_id(tgtr_scmd) > scmd_id(scmd)))
+ tgtr_scmd = scmd;
+ }
+ }
if (!tgtr_scmd)
- continue;
+ /* no more commands, that's it */
+ break;
SCSI_LOG_ERROR_RECOVERY(3, printk("%s: Sending target reset "
"to target %d\n",
@@ -1096,7 +1106,8 @@ static int scsi_eh_target_reset(struct Scsi_Host *shost,
" failed target: "
"%d\n",
current->comm, id));
- }
+ id++;
+ } while(id != 0);
return list_empty(work_q);
}
next prev parent reply other threads:[~2008-09-12 21:46 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-09-11 15:05 Block timeouts seem not to be working James Bottomley
2008-09-11 15:42 ` Mike Anderson
2008-09-11 18:35 ` Jens Axboe
2008-09-12 21:46 ` James Bottomley [this message]
2008-09-15 20:01 ` Mike Christie
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=1221256012.3319.21.camel@localhost.localdomain \
--to=james.bottomley@hansenpartnership.com \
--cc=andmike@linux.vnet.ibm.com \
--cc=jens.axboe@oracle.com \
--cc=linux-scsi@vger.kernel.org \
--cc=michaelc@cs.wisc.edu \
/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.