From: Jens Axboe <jens.axboe@oracle.com>
To: linux-scsi@vger.kernel.org
Cc: malahal@us.ibm.com
Subject: Re: [RFC] [PATCH 1/1] blk request timeout handler patches
Date: Tue, 9 Oct 2007 11:14:51 +0200 [thread overview]
Message-ID: <20071009091451.GD5241@kernel.dk> (raw)
In-Reply-To: <20071009053610.GA17794@us.ibm.com>
On Mon, Oct 08 2007, malahal@us.ibm.com wrote:
> Thank you Randy, Jens for your suggestions. I folded the second patch as
> it is just a clean up. Here is the fixed one patch version.
>
> Signed-off-by: Mike Christie <michaelc@cs.wisc.edu>
> Signed-off-by: Malahal Naineni <malahal@us.ibm.com>
>
> Thanks, Malahal.
>
> diff -r 2cd6b249e335 block/ll_rw_blk.c
> --- a/block/ll_rw_blk.c Thu Sep 27 09:56:25 2007 -0700
> +++ b/block/ll_rw_blk.c Mon Oct 08 18:30:34 2007 -0700
> @@ -181,6 +181,18 @@ void blk_queue_softirq_done(struct reque
>
> EXPORT_SYMBOL(blk_queue_softirq_done);
>
> +void blk_queue_rq_timeout(struct request_queue *q, unsigned int timeout)
> +{
> + q->rq_timeout = timeout;
> +}
> +EXPORT_SYMBOL_GPL(blk_queue_rq_timeout);
> +
> +void blk_queue_rq_timed_out(struct request_queue *q, rq_timed_out_fn *fn)
> +{
> + q->rq_timed_out_fn = fn;
> +}
> +EXPORT_SYMBOL_GPL(blk_queue_rq_timed_out);
> +
> /**
> * blk_queue_make_request - define an alternate make_request function for a device
> * @q: the request queue for the device to be affected
> @@ -243,7 +255,9 @@ static void rq_init(struct request_queue
> {
> INIT_LIST_HEAD(&rq->queuelist);
> INIT_LIST_HEAD(&rq->donelist);
> -
> + init_timer(&rq->timer);
> +
> + rq->timeout = 0;
> rq->errors = 0;
> rq->bio = rq->biotail = NULL;
> INIT_HLIST_NODE(&rq->hash);
> @@ -2305,6 +2319,7 @@ EXPORT_SYMBOL(blk_start_queueing);
> */
> void blk_requeue_request(struct request_queue *q, struct request *rq)
> {
> + blk_delete_timer(rq);
> blk_add_trace_rq(q, rq, BLK_TA_REQUEUE);
>
> if (blk_rq_tagged(rq))
> @@ -3647,8 +3662,103 @@ static struct notifier_block blk_cpu_not
> };
>
> /**
> + * blk_delete_timer - Delete/cancel timer for a given function.
> + * @req: request that we are canceling timer for
> + *
> + * Return value:
> + * 1 if we were able to detach the timer. 0 if we blew it, and the
> + * timer function has already started to run.
> + */
> +int blk_delete_timer(struct request *req)
> +{
> + if (!req->q->rq_timed_out_fn)
> + return 1;
> +
> + return del_timer(&req->timer);
> +}
> +EXPORT_SYMBOL_GPL(blk_delete_timer);
> +
> +static void blk_rq_timed_out(unsigned long data)
> +{
> + struct request *req = (struct request *)data;
> + struct request_queue *q = req->q;
> +
> + switch (q->rq_timed_out_fn(req)) {
> + case BLK_EH_HANDLED:
> + __blk_complete_request(req);
> + return;
> + case BLK_EH_RESET_TIMER:
> + blk_add_timer(req);
> + return;
> + case BLK_EH_NOT_HANDLED:
> + /*
> + * LLD handles this for now but in the future
> + * we can send a request msg to abort the command
> + * and we can move more of the generic scsi eh code to
> + * the blk layer.
> + */
> + return;
> + }
> +}
> +
> +/**
> + * blk_abort_req -- Request request recovery for the specified command
> + * @req: pointer to the request of interest
> + *
> + * This function requests that the block layer start recovery for the
> + * request by deleting the timer and calling the q's timeout function.
> + * LLDDs who implement their own error recovery MAY ignore the timeout
> + * event if they generated blk_abort_req.
> + */
> +void blk_abort_req(struct request *req)
> +{
> + if (!blk_delete_timer(req))
> + return;
> + blk_rq_timed_out(req);
You didn't do as I described. Did you try to compile this? It'll throw a
warning because of the pointer -> unsigned long cast. You need an extra
function to convert this cleanly. A cast would do of course, but I think
the extra function is a lot cleaner.
--
Jens Axboe
next prev parent reply other threads:[~2007-10-09 9:14 UTC|newest]
Thread overview: 26+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-10-04 18:12 [RFC] [PATCH 0/2] blk request timeout handler patches malahal
2007-10-04 18:17 ` [RFC] [PATCH 1/2] " malahal
2007-10-04 18:52 ` Randy Dunlap
2007-10-04 20:40 ` Salyzyn, Mark
2007-10-05 12:49 ` Jens Axboe
2007-10-08 6:54 ` malahal
2007-10-08 7:04 ` Jens Axboe
2007-10-09 5:36 ` [RFC] [PATCH 1/1] " malahal
2007-10-09 9:14 ` Jens Axboe [this message]
2007-10-09 14:26 ` malahal
2007-10-09 12:00 ` Matthew Wilcox
2007-10-09 12:15 ` Jens Axboe
2007-10-09 15:56 ` James Bottomley
2007-10-09 17:23 ` malahal
2007-10-10 12:25 ` Jens Axboe
2007-10-10 16:58 ` malahal
2007-10-10 17:04 ` Jens Axboe
2007-10-11 18:01 ` malahal
2007-10-11 18:24 ` Jens Axboe
2007-10-11 18:33 ` Jens Axboe
2007-10-23 1:45 ` malahal
2007-10-23 6:30 ` malahal
2007-10-23 11:59 ` Jens Axboe
2007-10-05 12:50 ` [RFC] [PATCH 1/2] " Jens Axboe
2007-10-04 18:20 ` [RFC] [PATCH 2/2] " malahal
2007-10-04 18:32 ` Randy Dunlap
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=20071009091451.GD5241@kernel.dk \
--to=jens.axboe@oracle.com \
--cc=linux-scsi@vger.kernel.org \
--cc=malahal@us.ibm.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.