From: Tejun Heo <tj@kernel.org>
To: koverstreet@google.com
Cc: linux-bcache@vger.kernel.org, linux-kernel@vger.kernel.org,
dm-devel@redhat.com, linux-fsdevel@vger.kernel.org,
axboe@kernel.dk, agk@redhat.com, neilb@suse.de
Subject: Re: [PATCH 12/13] Make generic_make_request handle arbitrarily large bios
Date: Fri, 18 May 2012 10:52:16 -0700 [thread overview]
Message-ID: <20120518175216.GL19388@google.com> (raw)
In-Reply-To: <1114e7019b0055fc09a54b59b36398d5c54f5e32.1337308722.git.koverstreet@google.com>
Hello, Kent.
On Thu, May 17, 2012 at 10:59:59PM -0400, koverstreet@google.com wrote:
> From: Kent Overstreet <koverstreet@google.com>
>
> The way the block layer is currently written, it goes to great lengths
> to avoid having to split bios; upper layer code (such as bio_add_page())
> checks what the underlying device can handle and tries to always create
> bios that don't need to be split.
>
> But this approach becomes unwieldy and eventually breaks down with
> stacked devices and devices with dynamic limits, and it adds a lot of
> complexity. If the block layer could split bios as needed, we could
> eliminate a lot of complexity elsewhere - particularly in stacked
> drivers. Code that creates bios can then create whatever size bios are
> convenient, and more importantly stacked drivers don't have to deal with
> both their own bio size limitations and the limitations of the
> (potentially multiple) devices underneath them.
I generally like the idea. Device limit directly being propagated to
high level users is cumbersome. Somebody has to be splitting anyway
and doing it at top makes things, including limit propagation through
stacked drivers, unnecessarily complicated. Jens, what are your
thoughts?
> +static void bio_submit_split_done(struct closure *cl)
> +{
> + struct bio_split_hook *s = container_of(cl, struct bio_split_hook, cl);
> +
> + s->bio->bi_end_io = s->bi_end_io;
> + s->bio->bi_private = s->bi_private;
> + bio_endio(s->bio, 0);
I'd rather you didn't indent assignments.
> + closure_debug_destroy(&s->cl);
> + mempool_free(s, s->q->bio_split_hook);
> +}
...
> +static int bio_submit_split(struct bio *bio)
bool?
> +{
> + struct bio_split_hook *s;
> + struct request_queue *q = bdev_get_queue(bio->bi_bdev);
> +
> + if (!bio_has_data(bio) ||
> + !q ||
> + !q->bio_split_hook ||
> + bio_sectors(bio) <= bio_max_sectors(bio))
Style issues.
> + return 0;
> +
> + s = mempool_alloc(q->bio_split_hook, GFP_NOIO);
> +
> + closure_init(&s->cl, NULL);
Please use workqueue with open coded sequencer or maybe implement bio
sequencer which can be used by other stacking drivers too.
> + s->bio = bio;
> + s->q = q;
> + s->bi_end_io = bio->bi_end_io;
> + s->bi_private = bio->bi_private;
> +
> + bio_get(bio);
> + bio->bi_end_io = bio_submit_split_endio;
> + bio->bi_private = &s->cl;
Maybe it's okay but I *hope* bi_private override weren't necessary -
it's way too subtle. If there's no other way and this is gonna be an
integral part of block layer, just add a field to bio.
> +unsigned __bio_max_sectors(struct bio *bio, struct block_device *bdev,
> + sector_t sector)
> +{
> + unsigned ret = bio_sectors(bio);
> + struct request_queue *q = bdev_get_queue(bdev);
> + struct bio_vec *bv, *end = bio_iovec(bio) +
> + min_t(int, bio_segments(bio), queue_max_segments(q));
> +
> + struct bvec_merge_data bvm = {
> + .bi_bdev = bdev,
> + .bi_sector = sector,
> + .bi_size = 0,
> + .bi_rw = bio->bi_rw,
> + };
> +
> + if (bio_segments(bio) > queue_max_segments(q) ||
> + q->merge_bvec_fn) {
> + ret = 0;
> +
> + for (bv = bio_iovec(bio); bv < end; bv++) {
> + if (q->merge_bvec_fn &&
> + q->merge_bvec_fn(q, &bvm, bv) < (int) bv->bv_len)
> + break;
> +
> + ret += bv->bv_len >> 9;
> + bvm.bi_size += bv->bv_len;
> + }
> +
> + if (ret >= (BIO_MAX_PAGES * PAGE_SIZE) >> 9)
> + return (BIO_MAX_PAGES * PAGE_SIZE) >> 9;
> + }
> +
> + ret = min(ret, queue_max_sectors(q));
> +
> + WARN_ON(!ret);
> + ret = max_t(int, ret, bio_iovec(bio)->bv_len >> 9);
> +
> + return ret;
> +}
> +EXPORT_SYMBOL_GPL(__bio_max_sectors);
Does this by any chance allow killing ->merge_bvec_fn()? That would
be *awesome*.
Thanks.
--
tejun
next prev parent reply other threads:[~2012-05-18 17:52 UTC|newest]
Thread overview: 48+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-05-18 2:59 [PATCH 00/13] Block cleanups (for bcache) koverstreet
2012-05-18 2:59 ` [PATCH 01/13] block: Generalized bio pool freeing koverstreet
[not found] ` <ea774fea2a27c9f1028a12ce31a7ee5e5517bef4.1337308722.git.koverstreet-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>
2012-05-18 15:55 ` Tejun Heo
[not found] ` <20120518155538.GA19388-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>
2012-05-18 16:14 ` [dm-devel] " Alasdair G Kergon
2012-05-18 2:59 ` [PATCH 02/13] dm: kill dm_rq_bio_destructor koverstreet
2012-05-18 15:57 ` Tejun Heo
[not found] ` <20120518155729.GB19388-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>
2012-05-18 16:43 ` [dm-devel] " Alasdair G Kergon
[not found] ` <20120518164319.GJ29330-FDJ95KluN3Z0klwcnFlA1dvLeJWuRmrY@public.gmane.org>
2012-05-18 18:50 ` Kent Overstreet
[not found] ` <20120518185027.GA9673-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>
2012-05-22 4:29 ` Jun'ichi Nomura
2012-05-18 2:59 ` [PATCH 03/13] block: Add bio_clone_bioset() koverstreet
2012-05-18 16:05 ` Tejun Heo
2012-05-18 20:31 ` Kent Overstreet
[not found] ` <eb6a7d3fe7ae203202bc365d7274ee531631a9ca.1337308722.git.koverstreet-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>
2012-05-18 16:11 ` [dm-devel] " Vivek Goyal
2012-05-18 18:55 ` Kent Overstreet
2012-05-18 2:59 ` [PATCH 04/13] block: Add bio_clone_kmalloc() koverstreet
[not found] ` <1c7c2d4b89bc3d0e907608cec37bcf0ee50f4c0e.1337308722.git.koverstreet-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>
2012-05-18 16:09 ` Tejun Heo
[not found] ` <20120518160903.GD19388-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>
2012-05-18 20:39 ` Kent Overstreet
2012-05-18 16:45 ` Boaz Harrosh
2012-05-18 2:59 ` [PATCH 05/13] block: Only clone bio vecs that are in use koverstreet
2012-05-18 16:13 ` Tejun Heo
2012-05-18 21:14 ` Kent Overstreet
2012-05-18 2:59 ` [PATCH 06/13] block: Add bio_reset() koverstreet
2012-05-18 16:16 ` Tejun Heo
[not found] ` <20120518161608.GF19388-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>
2012-05-18 21:48 ` Kent Overstreet
2012-05-18 2:59 ` [PATCH 07/13] pktcdvd: Switch to bio_kmalloc() koverstreet
[not found] ` <04a4d6c2c8b6f0097e3594c6e0932093afffc1da.1337308722.git.koverstreet-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>
2012-05-18 16:18 ` Tejun Heo
2012-05-18 2:59 ` [PATCH 08/13] block: Kill bi_destructor koverstreet
[not found] ` <de05855cf0fa4800cfab7e8340f106dccc7a75a1.1337308722.git.koverstreet-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>
2012-05-18 16:21 ` Tejun Heo
[not found] ` <20120518162142.GH19388-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>
2012-05-18 22:21 ` Kent Overstreet
2012-05-18 2:59 ` [PATCH 09/13] block: Add an explicit bio flag for bios that own their bvec koverstreet
[not found] ` <363875943e9d0e13bee6ed28239280543e6e5055.1337308722.git.koverstreet-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>
2012-05-18 16:30 ` Tejun Heo
2012-05-18 21:49 ` Kent Overstreet
2012-05-18 17:07 ` Boaz Harrosh
2012-05-18 2:59 ` [PATCH 10/13] block: Rework bio splitting koverstreet
[not found] ` <ac4c1cbd10934fdc3a4af74d4cb5ec370f9139d5.1337308722.git.koverstreet-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>
2012-05-18 17:07 ` Tejun Heo
2012-05-18 17:46 ` Boaz Harrosh
[not found] ` <cover.1337308722.git.koverstreet-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>
2012-05-18 2:59 ` [PATCH 11/13] Closures koverstreet-hpIqsD4AKlfQT0dZR+AlfA
[not found] ` <a184989cfbf92297d4cca2f823e5ac24ec8fe1e3.1337308722.git.koverstreet-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>
2012-05-18 17:08 ` Tejun Heo
2012-05-18 2:59 ` [PATCH 12/13] Make generic_make_request handle arbitrarily large bios koverstreet
2012-05-18 8:05 ` NeilBrown
[not found] ` <20120518180550.0a6cdc34-wvvUuzkyo1EYVZTmpyfIwg@public.gmane.org>
2012-05-18 8:14 ` Kent Overstreet
[not found] ` <20120518081444.GA27205-RcKxWJ4Cfj3IzGYXcIpNmNLIRw13R84JkQQo+JxHRPFibQn6LdNjmg@public.gmane.org>
2012-05-21 17:17 ` [dm-devel] " Vivek Goyal
2012-05-21 17:55 ` Kent Overstreet
2012-05-21 18:32 ` Vivek Goyal
2012-05-18 17:52 ` Tejun Heo [this message]
2012-05-19 0:59 ` Alasdair G Kergon
[not found] ` <1114e7019b0055fc09a54b59b36398d5c54f5e32.1337308722.git.koverstreet-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>
2012-05-18 22:48 ` Mikulas Patocka
2012-05-18 3:00 ` [PATCH 13/13] Gut bio_add_page() koverstreet
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=20120518175216.GL19388@google.com \
--to=tj@kernel.org \
--cc=agk@redhat.com \
--cc=axboe@kernel.dk \
--cc=dm-devel@redhat.com \
--cc=koverstreet@google.com \
--cc=linux-bcache@vger.kernel.org \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=neilb@suse.de \
/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).