From: Jens Axboe <jens.axboe@oracle.com>
To: Tejun Heo <tj@kernel.org>
Cc: James Bottomley <James.Bottomley@HansenPartnership.com>,
linux-scsi <linux-scsi@vger.kernel.org>,
Linux Kernel <linux-kernel@vger.kernel.org>,
IDE/ATA development list <linux-ide@vger.kernel.org>
Subject: Re: [PATCH] block: add timer on blkdev_dequeue_request() not elv_next_request()
Date: Thu, 30 Oct 2008 08:29:56 +0100 [thread overview]
Message-ID: <20081030072956.GL31673@kernel.dk> (raw)
In-Reply-To: <490927CD.2010205@kernel.org>
On Thu, Oct 30 2008, Tejun Heo wrote:
> Block queue supports two usage models - one where block driver peeks
> at the front of queue using elv_next_request(), processes it and
> finishes it and the other where block driver peeks at the front of
> queue, dequeue the request using blkdev_dequeue_request() and finishes
> it. The latter is more flexible as it allows the driver to process
> multiple commands concurrently.
>
> These two inconsistent usage models affect the block layer
> implementation confusing. For some, elv_next_request() is considered
> the issue point while others consider blkdev_dequeue_request() the
> issue point.
>
> Till now the inconsistency mostly affect only accounting, so it didn't
> really break anything seriously; however, with block layer timeout,
> this inconsistency hits hard. Block layer considers
> elv_next_request() the issue point and adds timer but SCSI layer
> thinks it was just peeking and when the request can't process the
> command right away, it's just left there without further processing.
> This makes the request dangling on the timer list and, when the timer
> goes off, the request which the SCSI layer and below think is still on
> the block queue ends up in the EH queue, causing various problems - EH
> hang (failed count goes over busy count and EH never wakes up),
> WARN_ON() and oopses as low level driver trying to handle the unknown
> command, etc. depending on the timing.
>
> As SCSI midlayer is the only user of block layer timer at the moment,
> moving blk_add_timer() to elv_dequeue_request() fixes the problem;
> however, this two usage models definitely need to be cleaned up in the
> future.
>
> Signed-off-by: Tejun Heo <tj@kernel.org>
> ---
> block/elevator.c | 12 ++++++------
> 1 file changed, 6 insertions(+), 6 deletions(-)
>
> Index: work/block/elevator.c
> ===================================================================
> --- work.orig/block/elevator.c
> +++ work/block/elevator.c
> @@ -773,12 +773,6 @@ struct request *elv_next_request(struct
> */
> rq->cmd_flags |= REQ_STARTED;
> blk_add_trace_rq(q, rq, BLK_TA_ISSUE);
> -
> - /*
> - * We are now handing the request to the hardware,
> - * add the timeout handler
> - */
> - blk_add_timer(rq);
> }
>
> if (!q->boundary_rq || q->boundary_rq == rq) {
> @@ -850,6 +844,12 @@ void elv_dequeue_request(struct request_
> */
> if (blk_account_rq(rq))
> q->in_flight++;
> +
> + /*
> + * We are now handing the request to the hardware, add the
> + * timeout handler.
> + */
> + blk_add_timer(rq);
> }
> EXPORT_SYMBOL(elv_dequeue_request);
That's actually a pretty dumb error, I'm surprised it hasn't reared its
ugly face in more ways. Presumably because the timeout is usually so
long, that we'll get to actually issuing and completing it within the
normal timeout anyway.
Thanks, applied!
--
Jens Axboe
next prev parent reply other threads:[~2008-10-30 7:31 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-10-30 3:19 [PATCH] block: add timer on blkdev_dequeue_request() not elv_next_request() Tejun Heo
2008-10-30 7:29 ` Jens Axboe [this message]
2008-10-30 7:55 ` Tejun Heo
2008-10-30 7:58 ` Jens Axboe
2008-10-30 9:27 ` Mike Anderson
2008-10-30 9:34 ` Tejun Heo
2008-10-30 9:51 ` Tejun Heo
2008-10-30 11:14 ` Jens Axboe
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=20081030072956.GL31673@kernel.dk \
--to=jens.axboe@oracle.com \
--cc=James.Bottomley@HansenPartnership.com \
--cc=linux-ide@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-scsi@vger.kernel.org \
--cc=tj@kernel.org \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).