From: Tejun Heo <tj-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
To: Kent Overstreet <koverstreet-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>
Cc: linux-bcache-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
dm-devel-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org,
agk-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org
Subject: Re: [Bcache v13 01/16] Only clone bio vecs that are in use
Date: Tue, 15 May 2012 09:19:04 -0700 [thread overview]
Message-ID: <20120515161904.GA17216@google.com> (raw)
In-Reply-To: <cb817596299fecd01ea36e4a80203f23165bda75.1336619038.git.koverstreet-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>
Hello, Kent.
On Wed, May 09, 2012 at 11:08:13PM -0400, Kent Overstreet wrote:
> Bcache creates large bios internally, and then splits them according to
> the requirements of the underlying device. If the underlying device then
> needs to clone the bio, the clone will fail if the original bio had more
> than 256 segments - even if bi_vcnt - bi_idx was smaller.
I think this is a useful change outside the context of bcache. How
about generalizing the description a bit and send it to Jens w/ block:
tag?
> @@ -1078,28 +1078,22 @@ static struct bio *split_bvec(struct bio *bio, sector_t sector,
> * Creates a bio that consists of range of complete bvecs.
> */
> static struct bio *clone_bio(struct bio *bio, sector_t sector,
> - unsigned short idx, unsigned short bv_count,
> + unsigned short bv_count,
> unsigned int len, struct bio_set *bs)
> {
> struct bio *clone;
>
> - clone = bio_alloc_bioset(GFP_NOIO, bio->bi_max_vecs, bs);
> - __bio_clone(clone, bio);
> - clone->bi_destructor = dm_bio_destructor;
> + clone = bio_clone_bioset(bio, GFP_NOIO, bs);
> clone->bi_sector = sector;
> - clone->bi_idx = idx;
> - clone->bi_vcnt = idx + bv_count;
> + clone->bi_vcnt = bv_count;
> clone->bi_size = to_bytes(len);
> clone->bi_flags &= ~(1 << BIO_SEG_VALID);
> -
> - if (bio_integrity(bio)) {
> - bio_integrity_clone(clone, bio, GFP_NOIO, bs);
> -
> +#if 0
> + if (bio_integrity(bio))
> if (idx != bio->bi_idx || clone->bi_size < bio->bi_size)
> bio_integrity_trim(clone,
> bio_sector_offset(bio, idx, 0), len);
> - }
> -
> +#endif
> return clone;
> }
Hmmm... I wish these changes are done in separate steps. ie.
1. Add void *bi_destructor_data to bio so that BIO_HAS_POOL trickery,
which BTW is broken - this patch doesn't build, isn't necessary and
destructors can be consolidated - bio_alloc_bioset() can set
bi_destructor() and bi_destructor_data automatically so that only
the ones which want to override the default allocation need to
bother.
2. Introduce bio_clone_bioset() without the allocation change and
convert md (and whoever applicable).
3. Change the behavior such that only bio_segments() is copied.
> diff --git a/drivers/md/md.c b/drivers/md/md.c
> index ce88755..961c995 100644
> --- a/drivers/md/md.c
> +++ b/drivers/md/md.c
> @@ -194,7 +194,8 @@ struct bio *bio_clone_mddev(struct bio *bio, gfp_t gfp_mask,
> if (!mddev || !mddev->bio_set)
> return bio_clone(bio, gfp_mask);
>
> - b = bio_alloc_bioset(gfp_mask, bio->bi_max_vecs,
> + b = bio_alloc_bioset(gfp_mask,
> + bio_segments(bio),
> mddev->bio_set);
Line broken unnecessarily?
> @@ -53,6 +53,7 @@ static struct biovec_slab bvec_slabs[BIOVEC_NR_POOLS] __read_mostly = {
> * IO code that does not need private memory pools.
> */
> struct bio_set *fs_bio_set;
> +EXPORT_SYMBOL(fs_bio_set);
Is making bio_clone() an inline function really worth it?
> @@ -341,8 +337,10 @@ struct bio *bio_alloc(gfp_t gfp_mask, unsigned int nr_iovecs)
> {
> struct bio *bio = bio_alloc_bioset(gfp_mask, nr_iovecs, fs_bio_set);
>
> - if (bio)
> - bio->bi_destructor = bio_fs_destructor;
> + if (bio) {
> + bio->bi_flags |= 1 << BIO_HAS_POOL;
> + bio->bi_destructor = (void *) fs_bio_set;
> + }
Wrote above but it looks like the patch is missing some part of
BIO_HAS_POOL handling. Doesn't build. Also, it's a pretty ugly hack.
> /**
> - * __bio_clone - clone a bio
> - * @bio: destination bio
> - * @bio_src: bio to clone
> + * __bio_clone - clone a bio
> + * @bio: destination bio
> + * @bio_src: bio to clone
> *
> * Clone a &bio. Caller will own the returned bio, but not
> * the actual data it points to. Reference count of returned
> - * bio will be one.
> + * bio will be one.
Whilespace cleanup? I'm okay with doing these as part of larger
changes but would appreciate if these were noted in the commit message
in the form of "while at it, blah blah...".
> */
> void __bio_clone(struct bio *bio, struct bio *bio_src)
> {
> - memcpy(bio->bi_io_vec, bio_src->bi_io_vec,
> - bio_src->bi_max_vecs * sizeof(struct bio_vec));
> + memcpy(bio->bi_io_vec,
> + bio_iovec(bio_src),
> + bio_segments(bio_src) * sizeof(struct bio_vec));
Unnecessary line break?
> -struct bio *bio_clone(struct bio *bio, gfp_t gfp_mask)
> +struct bio *bio_clone_bioset(struct bio *bio, gfp_t gfp_mask,
> + struct bio_set *bs)
> {
> - struct bio *b = bio_alloc_bioset(gfp_mask, bio->bi_max_vecs, fs_bio_set);
> -
> + struct bio *b = bio_alloc_bioset(gfp_mask, bio_segments(bio), bs);
Blank line between var decls and body please.
> if (!b)
> return NULL;
>
> - b->bi_destructor = bio_fs_destructor;
> __bio_clone(b, bio);
> + b->bi_flags |= 1 << BIO_HAS_POOL;
No indenting of assignments please. There are some exceptions when
there are a lot of assignments and not aligning makes it very
difficult to read but I don't think that applies here.
> + b->bi_destructor = (void *) bs;
>
> if (bio_integrity(bio)) {
> int ret;
>
> - ret = bio_integrity_clone(b, bio, gfp_mask, fs_bio_set);
> + ret = bio_integrity_clone(b, bio, gfp_mask, bs);
You'll probably need to update bio_integrity about the same way. It
does about the same thing as bio alloc path.
Thanks.
--
tejun
next prev parent reply other threads:[~2012-05-15 16:19 UTC|newest]
Thread overview: 87+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-05-10 3:07 [Bcache v13 00/16] Kent Overstreet
2012-05-10 3:09 ` [Bcache v13 05/16] Export get_random_int() Kent Overstreet
[not found] ` <5278ad493eb3ad441b2091b4c119d741e47f5c97.1336619038.git.koverstreet-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>
2012-05-15 16:44 ` Tejun Heo
2012-05-10 3:09 ` [Bcache v13 07/16] Closures Kent Overstreet
[not found] ` <82f00ebb4ee0404788c5bd7fbfa1fe4969f28ba1.1336619038.git.koverstreet-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>
2012-05-15 22:41 ` Tejun Heo
[not found] ` <20120515224137.GA15386-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>
2012-05-18 6:29 ` Kent Overstreet
[not found] ` <20120518062948.GA21163-RcKxWJ4Cfj3IzGYXcIpNmNLIRw13R84JkQQo+JxHRPFibQn6LdNjmg@public.gmane.org>
2012-05-18 10:02 ` Alan Cox
2012-05-21 19:40 ` Kent Overstreet
2012-05-10 3:10 ` [Bcache v13 08/16] bcache: Documentation, and changes to generic code Kent Overstreet
2012-05-10 3:10 ` [Bcache v13 09/16] Bcache: generic utility code Kent Overstreet
[not found] ` <c3f0ca2a499f532253d4c16a30837d43e237266a.1336619038.git.koverstreet-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>
2012-05-10 19:35 ` Dan Williams
2012-05-10 21:42 ` Kent Overstreet
2012-05-22 21:17 ` Tejun Heo
2012-05-23 3:12 ` Kent Overstreet
[not found] ` <20120523031214.GA607-RcKxWJ4Cfj3IzGYXcIpNmNLIRw13R84JkQQo+JxHRPFibQn6LdNjmg@public.gmane.org>
2012-05-23 3:36 ` Joe Perches
2012-05-23 4:50 ` [PATCH] Add human-readable units modifier to vsnprintf() Kent Overstreet
[not found] ` <20120523045023.GE607-RcKxWJ4Cfj3IzGYXcIpNmNLIRw13R84JkQQo+JxHRPFibQn6LdNjmg@public.gmane.org>
2012-05-23 5:10 ` Joe Perches
2012-05-23 5:22 ` Kent Overstreet
[not found] ` <20120523052236.GA14312-RcKxWJ4Cfj3IzGYXcIpNmNLIRw13R84JkQQo+JxHRPFibQn6LdNjmg@public.gmane.org>
2012-05-23 5:42 ` Joe Perches
2012-05-23 6:04 ` Kent Overstreet
[not found] ` <20120523060435.GD14312-RcKxWJ4Cfj3IzGYXcIpNmNLIRw13R84JkQQo+JxHRPFibQn6LdNjmg@public.gmane.org>
2012-05-23 6:12 ` Joe Perches
2012-05-23 5:08 ` [Bcache v13 09/16] Bcache: generic utility code Tejun Heo
[not found] ` <20120523050808.GA29976-RcKxWJ4Cfj1J2suj2OqeGauc2jM2gXBXkQQo+JxHRPFibQn6LdNjmg@public.gmane.org>
2012-05-23 5:54 ` Kent Overstreet
[not found] ` <20120523055402.GC14312-RcKxWJ4Cfj3IzGYXcIpNmNLIRw13R84JkQQo+JxHRPFibQn6LdNjmg@public.gmane.org>
2012-05-23 16:51 ` Tejun Heo
[not found] ` <20120522211706.GH14339-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>
2012-05-23 15:15 ` [dm-devel] " Vivek Goyal
[not found] ` <20120523151538.GJ14943-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2012-05-23 15:33 ` Kent Overstreet
2012-05-22 21:19 ` Tejun Heo
2012-05-10 3:10 ` [Bcache v13 10/16] bcache: Superblock/initialization/sysfs code Kent Overstreet
2012-05-10 3:10 ` [Bcache v13 11/16] bcache: Core btree code Kent Overstreet
[not found] ` <7f1de39b6d7040b3fe271500776f4b985b21ea82.1336619038.git.koverstreet-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>
2012-05-22 22:12 ` Tejun Heo
[not found] ` <20120522221259.GJ14339-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>
2012-05-23 3:45 ` Kent Overstreet
[not found] ` <20120523034546.GB607-RcKxWJ4Cfj3IzGYXcIpNmNLIRw13R84JkQQo+JxHRPFibQn6LdNjmg@public.gmane.org>
2012-05-23 5:20 ` Tejun Heo
2012-05-23 5:34 ` Kent Overstreet
[not found] ` <20120523053403.GB14312-RcKxWJ4Cfj3IzGYXcIpNmNLIRw13R84JkQQo+JxHRPFibQn6LdNjmg@public.gmane.org>
2012-05-23 17:24 ` Tejun Heo
2012-05-22 22:40 ` Tejun Heo
2012-05-30 7:47 ` Tejun Heo
[not found] ` <20120530074708.GA32121-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>
2012-05-31 1:09 ` Kent Overstreet
2012-05-10 3:11 ` [Bcache v13 12/16] bcache: Bset code (lookups within a btree node) Kent Overstreet
[not found] ` <5b5998d7d09ec36377acdb5d15665d1e4e818521.1336619038.git.koverstreet-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>
2012-05-22 22:39 ` Tejun Heo
[not found] ` <20120522223932.GK14339-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>
2012-05-23 4:21 ` Kent Overstreet
[not found] ` <20120523042114.GC607-RcKxWJ4Cfj3IzGYXcIpNmNLIRw13R84JkQQo+JxHRPFibQn6LdNjmg@public.gmane.org>
2012-05-23 17:55 ` Tejun Heo
[not found] ` <20120523175544.GC18143-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>
2012-05-23 20:49 ` Tejun Heo
[not found] ` <20120523204914.GC3933-Gd/HAXX7CRxy/B6EtB590w@public.gmane.org>
2012-05-24 18:11 ` Tejun Heo
2012-05-10 3:11 ` [Bcache v13 13/16] bcache: Journalling Kent Overstreet
2012-05-10 3:11 ` [Bcache v13 14/16] bcache: Request, io and allocation code Kent Overstreet
[not found] ` <9ea33658f2a71b3b9bd2ec10bee959bef146f23c.1336619038.git.koverstreet-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>
2012-05-22 22:42 ` Tejun Heo
[not found] ` <20120522224255.GM14339-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>
2012-05-23 1:44 ` Kent Overstreet
2012-05-23 4:24 ` Kent Overstreet
2012-05-22 22:44 ` Tejun Heo
2012-05-30 7:23 ` Tejun Heo
[not found] ` <20120530072358.GB4854-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>
2012-05-31 0:52 ` Kent Overstreet
[not found] ` <20120531005224.GA5645-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>
2012-05-31 2:43 ` Tejun Heo
2012-05-31 5:13 ` Kent Overstreet
[not found] ` <20120531051321.GA12602-RcKxWJ4Cfj3IzGYXcIpNmNLIRw13R84JkQQo+JxHRPFibQn6LdNjmg@public.gmane.org>
2012-05-31 6:45 ` Tejun Heo
[not found] ` <20120531064515.GA18984-9pTldWuhBndy/B6EtB590w@public.gmane.org>
2012-06-01 2:37 ` Tejun Heo
2012-05-31 2:45 ` Tejun Heo
2012-05-30 7:32 ` Tejun Heo
2012-05-10 3:11 ` [Bcache v13 15/16] bcache: Writeback Kent Overstreet
2012-05-10 13:54 ` [Bcache v13 00/16] Vivek Goyal
2012-05-10 15:03 ` [dm-devel] " Vivek Goyal
[not found] ` <20120510150353.GI23768-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2012-05-10 15:34 ` Kent Overstreet
[not found] ` <1188908028.170.1336674698865.JavaMail.mail@webmail09>
2012-05-10 18:49 ` [Bcache v13 11/16] bcache: Core btree code Joe Perches
2012-05-10 21:48 ` Kent Overstreet
[not found] ` <cover.1336619038.git.koverstreet-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>
2012-05-10 3:08 ` [Bcache v13 01/16] Only clone bio vecs that are in use Kent Overstreet
[not found] ` <cb817596299fecd01ea36e4a80203f23165bda75.1336619038.git.koverstreet-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>
2012-05-10 21:35 ` [dm-devel] " Vivek Goyal
[not found] ` <20120510213556.GO23768-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2012-05-10 21:42 ` Kent Overstreet
[not found] ` <CAH+dOxJ2Vi=8Oq1zDZLmqD9-a_wgM=co3+xemw4XBoiDkh_4zg-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2012-05-11 13:29 ` Jeff Moyer
2012-05-11 20:29 ` Kent Overstreet
2012-05-15 16:19 ` Tejun Heo [this message]
2012-05-10 3:08 ` [Bcache v13 02/16] Bio pool freeing Kent Overstreet
[not found] ` <ba8ce9fcca87f192ff5f5d3a436eb8f4d0bcb006.1336619038.git.koverstreet-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>
2012-05-10 21:32 ` [dm-devel] " Vivek Goyal
2012-05-10 21:39 ` Kent Overstreet
[not found] ` <CAH+dOxL7QwcyUm46cK-pF1qK+kHYC=67iAaQDDwUF2ssJwergA-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2012-05-10 21:52 ` Vivek Goyal
[not found] ` <20120510215208.GC2613-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2012-05-10 21:53 ` Kent Overstreet
2012-05-15 16:24 ` Tejun Heo
2012-05-15 16:25 ` Tejun Heo
2012-05-10 3:08 ` [Bcache v13 03/16] Revert "rw_semaphore: remove up/down_read_non_owner" Kent Overstreet
[not found] ` <3f51ec3e69b8f471e2d1cc539f01504e2b903fed.1336619038.git.koverstreet-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>
2012-05-15 16:37 ` Tejun Heo
2012-05-15 16:38 ` Tejun Heo
2012-05-10 3:09 ` [Bcache v13 04/16] Fix ratelimit macro to compile in c99 mode Kent Overstreet
[not found] ` <d7cfd6b70316efc3fe2ce575203d906a610e3670.1336619038.git.koverstreet-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>
2012-05-15 16:43 ` Tejun Heo
2012-05-10 3:09 ` [Bcache v13 06/16] Export blk_fill_rwbs() Kent Overstreet
2012-05-10 3:11 ` [Bcache v13 16/16] bcache: Debug and tracing code Kent Overstreet
2012-05-10 18:34 ` [Bcache v13 00/16] Dan Williams
2012-05-18 10:06 ` Arnd Bergmann
2012-05-30 8:29 ` Tejun Heo
2012-05-30 8:54 ` Zhi Yong Wu
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=20120515161904.GA17216@google.com \
--to=tj-dgejt+ai2ygdnm+yrofe0a@public.gmane.org \
--cc=agk-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org \
--cc=dm-devel-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org \
--cc=koverstreet-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org \
--cc=linux-bcache-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.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).