From: Jens Axboe <jens.axboe@oracle.com>
To: Kiyoshi Ueda <k-ueda@ct.jp.nec.com>
Cc: dm-devel@redhat.com, mchristi@redhat.com,
linux-kernel@vger.kernel.org, agk@redhat.com
Subject: Re: [RFC PATCH 1/8] rqbased-dm: allow blk_get_request() to be called from interrupt context
Date: Wed, 20 Dec 2006 19:49:17 +0100 [thread overview]
Message-ID: <20061220184917.GJ10535@kernel.dk> (raw)
In-Reply-To: <20061220.125002.71083198.k-ueda@ct.jp.nec.com>
On Wed, Dec 20 2006, Kiyoshi Ueda wrote:
> Hi Jens,
>
> Thank you for the comment.
>
> On Wed, 20 Dec 2006 14:48:49 +0100, Jens Axboe <jens.axboe@oracle.com> wrote:
> > > static struct request *get_request(request_queue_t *q, int rw, struct bio *bio,
> > > - gfp_t gfp_mask)
> > > + gfp_t gfp_mask, unsigned long *flags)
> > > {
> > > struct request *rq = NULL;
> > > struct request_list *rl = &q->rq;
> > > @@ -2119,7 +2120,10 @@ static struct request *get_request(reque
> > > if (priv)
> > > rl->elvpriv++;
> > >
> > > - spin_unlock_irq(q->queue_lock);
> > > + if (flags)
> > > + spin_unlock_irqrestore(q->queue_lock, *flags);
> > > + else
> > > + spin_unlock_irq(q->queue_lock);
> >
> > Big NACK on this - it's not only really ugly, it's also buggy to pass
> > interrupt flags as function arguments. As you also mention in the 0/1
> > mail, this also breaks CFQ.
> >
> > Why do you need in-interrupt request allocation?
>
> Because I'd like to use blk_get_request() in q->request_fn()
> which can be called from interrupt context like below:
> scsi_io_completion -> scsi_end_request -> scsi_next_command
> -> scsi_run_queue -> blk_run_queue -> q->request_fn
>
> Generally, device-mapper (dm) clones an original I/O and dispatches
> the clones to underlying destination devices.
> In the request-based dm patch, the clone creation and the dispatch
> are done in q->request_fn(). To create the clone, blk_get_request()
> is used to get a request from underlying destination device's queue.
> By doing that in q->request_fn(), dm can deal with struct request
> after bios are merged by __make_request().
>
> Do you think creating another function like blk_get_request_nowait()
> is acceptable?
> Or request should not be allocated in q->request_fn() anyway?
You should not be allocating requests from that path, for a number of
reasons. The design isn't very nice either.
The easy way out would be to punt to a workqueue to handle the requests.
An alternative way would be to set aside some requests that you can get
at without allocation (maintain a little freelist of manually allocated
requests), and retrieve a free one from there when inside request_fn. If
you run out, just bail out of request_fn and make sure to reinvoke it
when some of your previously issued requests complete and are added back
to that freelist.
--
Jens Axboe
WARNING: multiple messages have this Message-ID (diff)
From: Jens Axboe <jens.axboe@oracle.com>
To: Kiyoshi Ueda <k-ueda@ct.jp.nec.com>
Cc: agk@redhat.com, mchristi@redhat.com,
linux-kernel@vger.kernel.org, dm-devel@redhat.com,
j-nomura@ce.jp.nec.com
Subject: Re: [RFC PATCH 1/8] rqbased-dm: allow blk_get_request() to be called from interrupt context
Date: Wed, 20 Dec 2006 19:49:17 +0100 [thread overview]
Message-ID: <20061220184917.GJ10535@kernel.dk> (raw)
In-Reply-To: <20061220.125002.71083198.k-ueda@ct.jp.nec.com>
On Wed, Dec 20 2006, Kiyoshi Ueda wrote:
> Hi Jens,
>
> Thank you for the comment.
>
> On Wed, 20 Dec 2006 14:48:49 +0100, Jens Axboe <jens.axboe@oracle.com> wrote:
> > > static struct request *get_request(request_queue_t *q, int rw, struct bio *bio,
> > > - gfp_t gfp_mask)
> > > + gfp_t gfp_mask, unsigned long *flags)
> > > {
> > > struct request *rq = NULL;
> > > struct request_list *rl = &q->rq;
> > > @@ -2119,7 +2120,10 @@ static struct request *get_request(reque
> > > if (priv)
> > > rl->elvpriv++;
> > >
> > > - spin_unlock_irq(q->queue_lock);
> > > + if (flags)
> > > + spin_unlock_irqrestore(q->queue_lock, *flags);
> > > + else
> > > + spin_unlock_irq(q->queue_lock);
> >
> > Big NACK on this - it's not only really ugly, it's also buggy to pass
> > interrupt flags as function arguments. As you also mention in the 0/1
> > mail, this also breaks CFQ.
> >
> > Why do you need in-interrupt request allocation?
>
> Because I'd like to use blk_get_request() in q->request_fn()
> which can be called from interrupt context like below:
> scsi_io_completion -> scsi_end_request -> scsi_next_command
> -> scsi_run_queue -> blk_run_queue -> q->request_fn
>
> Generally, device-mapper (dm) clones an original I/O and dispatches
> the clones to underlying destination devices.
> In the request-based dm patch, the clone creation and the dispatch
> are done in q->request_fn(). To create the clone, blk_get_request()
> is used to get a request from underlying destination device's queue.
> By doing that in q->request_fn(), dm can deal with struct request
> after bios are merged by __make_request().
>
> Do you think creating another function like blk_get_request_nowait()
> is acceptable?
> Or request should not be allocated in q->request_fn() anyway?
You should not be allocating requests from that path, for a number of
reasons. The design isn't very nice either.
The easy way out would be to punt to a workqueue to handle the requests.
An alternative way would be to set aside some requests that you can get
at without allocation (maintain a little freelist of manually allocated
requests), and retrieve a free one from there when inside request_fn. If
you run out, just bail out of request_fn and make sure to reinvoke it
when some of your previously issued requests complete and are added back
to that freelist.
--
Jens Axboe
next prev parent reply other threads:[~2006-12-20 18:49 UTC|newest]
Thread overview: 43+ messages / expand[flat|nested] mbox.gz Atom feed top
2006-12-19 22:11 [RFC PATCH 1/8] rqbased-dm: allow blk_get_request() to be called from interrupt context Kiyoshi Ueda
2006-12-19 22:11 ` Kiyoshi Ueda
2006-12-20 13:48 ` Jens Axboe
2006-12-20 13:48 ` Jens Axboe
2006-12-20 17:50 ` Kiyoshi Ueda
2006-12-20 17:50 ` Kiyoshi Ueda
2006-12-20 18:49 ` Jens Axboe [this message]
2006-12-20 18:49 ` Jens Axboe
2006-12-20 21:55 ` Kiyoshi Ueda
2006-12-20 21:55 ` Kiyoshi Ueda
2006-12-21 7:53 ` Jens Axboe
2006-12-21 7:53 ` Jens Axboe
2006-12-21 17:59 ` Mike Christie
2006-12-21 17:59 ` [dm-devel] " Mike Christie
2006-12-21 18:13 ` Mike Christie
2006-12-21 18:13 ` [dm-devel] " Mike Christie
2006-12-21 18:24 ` Jens Axboe
2006-12-21 18:24 ` [dm-devel] " Jens Axboe
2006-12-21 18:30 ` Mike Christie
2006-12-21 18:30 ` [dm-devel] " Mike Christie
2006-12-21 18:36 ` Mike Christie
2006-12-21 18:36 ` [dm-devel] " Mike Christie
2006-12-21 18:42 ` Jens Axboe
2006-12-21 18:42 ` [dm-devel] " Jens Axboe
2006-12-21 18:57 ` Mike Christie
2006-12-21 18:57 ` [dm-devel] " Mike Christie
2006-12-21 19:19 ` Jens Axboe
2006-12-21 19:19 ` [dm-devel] " Jens Axboe
2006-12-21 22:22 ` Mike Christie
2006-12-21 22:22 ` [dm-devel] " Mike Christie
2006-12-21 18:40 ` Jens Axboe
2006-12-21 18:40 ` [dm-devel] " Jens Axboe
2006-12-21 18:11 ` Kiyoshi Ueda
2006-12-21 18:11 ` Kiyoshi Ueda
2006-12-21 18:21 ` Jens Axboe
2006-12-21 18:21 ` Jens Axboe
2006-12-20 19:11 ` Chen, Kenneth W
2006-12-20 19:11 ` Chen, Kenneth W
2006-12-20 19:17 ` Jens Axboe
2006-12-20 19:17 ` Jens Axboe
2006-12-22 14:01 ` Christoph Hellwig
2006-12-22 14:01 ` Christoph Hellwig
2006-12-22 17:32 ` 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=20061220184917.GJ10535@kernel.dk \
--to=jens.axboe@oracle.com \
--cc=agk@redhat.com \
--cc=dm-devel@redhat.com \
--cc=k-ueda@ct.jp.nec.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mchristi@redhat.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.