From: Jens Axboe <jens.axboe@oracle.com>
To: Kiyoshi Ueda <k-ueda@ct.jp.nec.com>
Cc: bharrosh@panasas.com, agk@redhat.com,
James.Bottomley@HansenPartnership.com,
linux-kernel@vger.kernel.org, linux-scsi@vger.kernel.org,
dm-devel@redhat.com, j-nomura@ce.jp.nec.com
Subject: Re: [PATCH 02/13] block: add request submission interface
Date: Tue, 16 Sep 2008 19:02:20 +0200 [thread overview]
Message-ID: <20080916170219.GW20055@kernel.dk> (raw)
In-Reply-To: <20080916.120656.78704115.k-ueda@ct.jp.nec.com>
On Tue, Sep 16 2008, Kiyoshi Ueda wrote:
> Hi Boaz, Jens,
>
> On Sun, 14 Sep 2008 16:10:58 +0300, Boaz Harrosh wrote:
> > Kiyoshi Ueda wrote:
> > > This patch adds blk_submit_request(), a generic request submission
> > > interface for request stacking drivers.
> > > Request-based dm will use it to submit their clones to underlying
> > > devices.
> > >
> > > blk_rq_check_limits() is also added because it is possible that
> > > the lower queue has stronger limitations than the upper queue
> > > if multiple drivers are stacking at request-level.
> > > Not only for blk_submit_request()'s internal use, the function
> > > will be used by request-based dm when the queue limitation is
> > > modified (e.g. by replacing dm's table).
> > >
> > >
> > > Signed-off-by: Kiyoshi Ueda <k-ueda@ct.jp.nec.com>
> > > Signed-off-by: Jun'ichi Nomura <j-nomura@ce.jp.nec.com>
> > > Cc: Jens Axboe <jens.axboe@oracle.com>
> > > ---
> > > block/blk-core.c | 81 +++++++++++++++++++++++++++++++++++++++++++++++++
> > > include/linux/blkdev.h | 2 +
> > > 2 files changed, 83 insertions(+)
> > >
> > > Index: 2.6.27-rc6/block/blk-core.c
> > > ===================================================================
> > > --- 2.6.27-rc6.orig/block/blk-core.c
> > > +++ 2.6.27-rc6/block/blk-core.c
> > > @@ -1517,6 +1517,87 @@ void submit_bio(int rw, struct bio *bio)
> > > EXPORT_SYMBOL(submit_bio);
> > >
> > > /**
> > > + * blk_rq_check_limits - Helper function to check a request for the queue limit
> > > + * @q: the queue
> > > + * @rq: the request being checked
> > > + *
> > > + * Description:
> > > + * @rq may have been made based on weaker limitations of upper-level queues
> > > + * in request stacking drivers, and it may violate the limitation of @q.
> > > + * Since the block layer and the underlying device driver trust @rq
> > > + * after it is inserted to @q, it should be checked against @q before
> > > + * the insertion using this generic function.
> > > + *
> > > + * This function should also be useful for request stacking drivers
> > > + * in some cases below, so export this fuction.
> > > + * Request stacking drivers like request-based dm may change the queue
> > > + * limits while requests are in the queue (e.g. dm's table swapping).
> > > + * Such request stacking drivers should check those requests agaist
> > > + * the new queue limits again when they dispatch those requests,
> > > + * although such checkings are also done against the old queue limits
> > > + * when submitting requests.
> > > + */
> > > +int blk_rq_check_limits(struct request_queue *q, struct request *rq)
> > > +{
> > > + if (rq->nr_sectors > q->max_sectors ||
> > > + rq->data_len > q->max_hw_sectors << 9) {
> > > + printk(KERN_ERR "%s: over max size limit.\n", __func__);
> > > + return -EIO;
> > > + }
> > > +
> > > + /*
> > > + * queue's settings related to segment counting like q->bounce_pfn
> > > + * may differ from that of other stacking queues.
> > > + * Recalculate it to check the request correctly on this queue's
> > > + * limitation.
> > > + */
> > > + blk_recalc_rq_segments(rq);
> > > + if (rq->nr_phys_segments > q->max_phys_segments ||
> > > + rq->nr_hw_segments > q->max_hw_segments) {
> > > + printk(KERN_ERR "%s: over max segments limit.\n", __func__);
> > > + return -EIO;
> > > + }
> > > +
> > > + return 0;
> > > +}
> > > +EXPORT_SYMBOL_GPL(blk_rq_check_limits);
> > > +
> > > +/**
> > > + * blk_submit_request - Helper for stacking drivers to submit a request
> > > + * @q: the queue to submit the request
> > > + * @rq: the request being queued
> > > + */
> > > +int blk_submit_request(struct request_queue *q, struct request *rq)
> > > +{
> > > + unsigned long flags;
> > > +
> > > + if (blk_rq_check_limits(q, rq))
> > > + return -EIO;
> > > +
> > > +#ifdef CONFIG_FAIL_MAKE_REQUEST
> > > + if (rq->rq_disk && rq->rq_disk->flags & GENHD_FL_FAIL &&
> > > + should_fail(&fail_make_request, blk_rq_bytes(rq)))
> > > + return -EIO;
> > > +#endif
> > > +
> > > + spin_lock_irqsave(q->queue_lock, flags);
> > > +
> > > + /*
> > > + * Submitting request must be dequeued before calling this function
> > > + * because it will be linked to another request_queue
> > > + */
> > > + BUG_ON(blk_queued_rq(rq));
> > > +
> > > + drive_stat_acct(rq, 1);
> > > + __elv_add_request(q, rq, ELEVATOR_INSERT_BACK, 0);
> > > +
> > > + spin_unlock_irqrestore(q->queue_lock, flags);
> > > +
> > > + return 0;
> > > +}
> > > +EXPORT_SYMBOL_GPL(blk_submit_request);
> > > +
> >
> > This looks awfully similar to blk_execute_rq_nowait With an Added
> > blk_rq_check_limits, minus the __generic_unplug_device() and
> > q->request_fn(q) calls. Perhaps the common code could be re factored
> > out?
>
> They might look simlar but don't have much in common actually.
> I could refactor them like the attached patch, but I'm not sure
> this is a correct way and this is cleaner than the current code.
> (e.g. blk_execute_rq_nowait() can't be called with irqs-disabled,
> but blk_insert_request() and my blk_submit_request() can be called
> with irqs-disabled.)
>
> So I'd leave them as it is unless you or others strongly prefer
> the attached patch...
> Anyway, I would like to leave the refactoring as a separate patch,
> since it's not so straightforward.
If it wasn't for the _irq vs _irqsave, I would apply it. But I agree,
your current approach is fine.
--
Jens Axboe
next prev parent reply other threads:[~2008-09-16 17:02 UTC|newest]
Thread overview: 47+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-09-12 14:38 [PATCH 00/13] request-based dm-multipath Kiyoshi Ueda
2008-09-12 14:38 ` Kiyoshi Ueda
2008-09-12 14:40 ` [PATCH 01/13] block: add request update interface Kiyoshi Ueda
2008-09-12 14:40 ` Kiyoshi Ueda
2008-09-12 14:41 ` [PATCH 02/13] block: add request submission interface Kiyoshi Ueda
2008-09-12 14:41 ` Kiyoshi Ueda
2008-09-14 13:10 ` Boaz Harrosh
2008-09-16 16:06 ` Kiyoshi Ueda
2008-09-16 16:06 ` Kiyoshi Ueda
2008-09-16 17:02 ` Jens Axboe [this message]
2008-09-16 18:12 ` Kiyoshi Ueda
2008-09-16 18:12 ` Kiyoshi Ueda
2008-09-12 14:42 ` [PATCH 03/13] mm: lld busy status exporting interface Kiyoshi Ueda
2008-09-12 14:42 ` Kiyoshi Ueda
2008-09-12 14:43 ` [PATCH 04/13] scsi: exports busy status Kiyoshi Ueda
2008-09-12 14:43 ` Kiyoshi Ueda
2008-09-12 14:43 ` [PATCH 05/13] block: add a queue flag for request stacking support Kiyoshi Ueda
2008-09-12 14:43 ` Kiyoshi Ueda
2008-09-12 14:44 ` [PATCH 06/13] dm: remove unused DM_WQ_FLUSH_ALL Kiyoshi Ueda
2008-09-12 14:44 ` Kiyoshi Ueda
2008-09-12 14:44 ` [PATCH 07/13] dm: tidy local_init Kiyoshi Ueda
2008-09-12 14:44 ` Kiyoshi Ueda
2008-09-12 14:45 ` [PATCH 08/13] dm: add kmem_cache for request-based dm Kiyoshi Ueda
2008-09-12 14:45 ` Kiyoshi Ueda
2008-09-12 14:45 ` [PATCH 09/13] dm: add target interfaces " Kiyoshi Ueda
2008-09-12 14:45 ` Kiyoshi Ueda
2008-09-12 14:46 ` [PATCH 10/13] dm: add core functions " Kiyoshi Ueda
2008-09-12 14:46 ` Kiyoshi Ueda
2008-10-24 7:44 ` [dm-devel] " Nikanth K
2008-10-28 16:00 ` Kiyoshi Ueda
2008-10-28 16:00 ` [dm-devel] " Kiyoshi Ueda
[not found] ` <490FB852.3FEE.00C5.1@novell.com>
2008-11-04 5:33 ` [PATCH 10/13] dm: add core functions forrequest-based dm Nikanth Karthikesan
2008-11-04 15:01 ` [PATCH 10/13] dm: add core functions for request-based dm Kiyoshi Ueda
2008-11-04 15:01 ` [dm-devel] " Kiyoshi Ueda
2008-09-12 14:46 ` [PATCH 11/13] dm: enable " Kiyoshi Ueda
2008-09-12 14:46 ` Kiyoshi Ueda
2008-10-24 7:52 ` [dm-devel] " Nikanth K
2008-10-28 16:02 ` Kiyoshi Ueda
2008-10-28 16:02 ` [dm-devel] " Kiyoshi Ueda
2008-09-12 14:46 ` [PATCH 12/13] dm: reject I/O violating new queue limits Kiyoshi Ueda
2008-09-12 14:46 ` Kiyoshi Ueda
2008-09-12 14:47 ` [PATCH 13/13] dm-mpath: convert to request-based Kiyoshi Ueda
2008-09-12 14:47 ` Kiyoshi Ueda
2008-10-24 7:55 ` [dm-devel] " Nikanth K
2008-10-28 16:03 ` Kiyoshi Ueda
2008-10-28 16:03 ` [dm-devel] " Kiyoshi Ueda
2008-09-14 13:17 ` [PATCH 00/13] request-based dm-multipath 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=20080916170219.GW20055@kernel.dk \
--to=jens.axboe@oracle.com \
--cc=James.Bottomley@HansenPartnership.com \
--cc=agk@redhat.com \
--cc=bharrosh@panasas.com \
--cc=dm-devel@redhat.com \
--cc=j-nomura@ce.jp.nec.com \
--cc=k-ueda@ct.jp.nec.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-scsi@vger.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 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.