From: Kent Overstreet <koverstreet@google.com>
To: Boaz Harrosh <bharrosh@panasas.com>
Cc: linux-kernel@vger.kernel.org, linux-bcache@vger.kernel.org,
dm-devel@redhat.com, linux-fsdevel@vger.kernel.org,
tj@kernel.org, axboe@kernel.dk, agk@redhat.com, neilb@suse.de,
drbd-dev@lists.linbit.com, vgoyal@redhat.com,
mpatocka@redhat.com, sage@newdream.net, yehuda@hq.newdream.net
Subject: Re: [PATCH v2 11/14] block: Rework bio splitting
Date: Thu, 24 May 2012 14:27:23 -0700 [thread overview]
Message-ID: <20120524212723.GA22664@google.com> (raw)
In-Reply-To: <4FBE6823.50904@panasas.com>
On Thu, May 24, 2012 at 07:56:03PM +0300, Boaz Harrosh wrote:
> Again could you please take this bio_split and just put
> it down below the implementation of bio_pair_split. This way
> we can better review what the changes actually are. Now it
> is a complete mess in the diff, where the deleted lines of the
> bio_pair_release are in between the new lines of bio_split().
> Please ???
Ahh, I saw that comment but I missed what it was that you wanted me to
reorder. Will do.
>
> > +struct bio *bio_split(struct bio *bio, int sectors,
> > + gfp_t gfp, struct bio_set *bs)
> > {
>
>
>
>
> This is a freaking important and capable exported function.
> Could you please put some comment on what it does and what are
> it's limitation.
Yeah, I'll do that.
> For example the returned bio is the beginning of the chain
> and the original is the reminder, right?
Yes.
>
> > - if (atomic_dec_and_test(&bp->cnt)) {
> > - struct bio *master = bp->bio1.bi_private;
> > + unsigned idx, vcnt = 0, nbytes = sectors << 9;
> > + struct bio_vec *bv;
> > + struct bio *ret = NULL;
> > +
> > + BUG_ON(sectors <= 0);
> > +
> > + /*
> > + * If we're being called from underneath generic_make_request() and we
> > + * already allocated any bios from this bio set, we risk deadlock if we
> > + * use the mempool. So instead, we possibly fail and let the caller punt
> > + * to workqueue or somesuch and retry in a safe context.
> > + */
> > + if (current->bio_list)
> > + gfp &= ~__GFP_WAIT;
>
>
>
>
> Is this true also when @bio is not from @bs ?
Yes. Not masking out __GFP_WAIT would only be safe if you could
guarantee that you never tried to split a bio more than once (from the
same bio set), and IMO that'd be a terrible thing to rely on.
>
> Is it at all supported when they are not the same?
When what's not the same?
>
> Are kmalloc bios not split-able?
They are.
>
> Please put answer to these in above comment.
>
> In the split you have a single bio with or without bvects allocation
> should you not let the caller make sure not to set __GFP_WAIT.
>
> For me, inspecting current->bio_list is out of context and a complete
> hack. The caller should take care of it, which has more context.
I agree that it is hacky, but shifting the responsibility onto the
caller would IMO be much more likely to lead to buggy code in the
future (and those deadlocks are not going to be easy to track down).
It might be better to mask out __GFP_WAIT in bio_alloc_bioset(), I'm not
sure.
> For example I might want to use split from OSD code where I do
> not use an elevator at all, and current->bio_list could belong
> to a completely different device. (Maybe)
Doesn't matter. If you allocate a split, it won't free itself until the
IO is submitted and completes; current->bio_list != NULL the bio cannot
complete until you return.
> I don't see below any references taken by "ret" on @bio.
> What protects us from @bio not been freed before "ret" ?
>
> If it's the caller responsibility please say so in
> comment above
Yeah, caller responsibility. Will do.
>
> > + } else if (nbytes < bv->bv_len) {
> > + ret = bio_alloc_bioset(gfp, ++vcnt, bs);
> > + if (!ret)
> > + return NULL;
>
>
>
>
> We could in this case save and only allocate one more bio with a single
> bio_vec and chain it to the end.
I thought about that, but this works for now - my preferred solution is
to make bi_io_vec immutable (that'll require a bi_bvec_offset field in
struct bio, and the end result is we'd be able to split mid bvec and
share the bvec with both bios).
>
> And if you change it around, where the reminder is "ret" and the
> beginning of the chain is left @bio. you wouldn't even need the
> extra bio. (Trim the last and a single-bvec bio holds the reminder + remainder-chain)
Don't follow... If you're processing a bio starting from the smallest
sector though, you want the split to be the front of the bio otherwise
if you split multiple times you'll try to split a split, and deadlock.
next prev parent reply other threads:[~2012-05-24 21:27 UTC|newest]
Thread overview: 49+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-05-24 0:02 [PATCH v2 00/14] Block cleanups (for bcache) Kent Overstreet
2012-05-24 0:02 ` [PATCH v2 01/14] block: Generalized bio pool freeing Kent Overstreet
[not found] ` <1337817771-25038-2-git-send-email-koverstreet-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>
2012-05-24 16:09 ` Tejun Heo
[not found] ` <20120524160944.GB27983-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>
2012-05-24 16:19 ` Tejun Heo
2012-05-24 17:46 ` Vivek Goyal
[not found] ` <20120524174649.GC27550-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2012-05-24 18:06 ` Boaz Harrosh
2012-05-24 0:02 ` [PATCH v2 02/14] dm: kill dm_rq_bio_destructor Kent Overstreet
2012-05-24 0:19 ` [dm-devel] " Jun'ichi Nomura
[not found] ` <4FBD7E80.4020005-JhyGz2TFV9J8UrSeD/g0lQ@public.gmane.org>
2012-05-24 0:39 ` Kent Overstreet
[not found] ` <20120524003915.GA27443-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>
2012-05-24 1:16 ` Jun'ichi Nomura
[not found] ` <4FBD8BD9.8070708-JhyGz2TFV9J8UrSeD/g0lQ@public.gmane.org>
2012-05-24 1:39 ` Jun'ichi Nomura
2012-05-24 23:33 ` Kent Overstreet
[not found] ` <1337817771-25038-3-git-send-email-koverstreet-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>
2012-05-24 16:11 ` Tejun Heo
2012-05-24 0:02 ` [PATCH v2 03/14] block: Add bio_clone_bioset() Kent Overstreet
2012-05-24 16:38 ` Tejun Heo
[not found] ` <1337817771-25038-4-git-send-email-koverstreet-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>
2012-05-24 18:45 ` Vivek Goyal
[not found] ` <20120524184507.GD27550-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2012-05-24 23:35 ` Kent Overstreet
2012-05-24 0:02 ` [PATCH v2 04/14] block: Add bio_clone_kmalloc() Kent Overstreet
2012-05-24 18:59 ` Vivek Goyal
[not found] ` <20120524185919.GE27550-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2012-05-24 21:41 ` Yehuda Sadeh
2012-05-25 0:31 ` Kent Overstreet
[not found] ` <1337817771-25038-1-git-send-email-koverstreet-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>
2012-05-24 0:02 ` [PATCH v2 05/14] block: Only clone bio vecs that are in use Kent Overstreet
2012-05-24 0:02 ` [PATCH v2 08/14] block: Kill bi_destructor Kent Overstreet
2012-05-24 19:52 ` Vivek Goyal
2012-05-24 19:58 ` Vivek Goyal
2012-05-24 20:00 ` Kent Overstreet
[not found] ` <20120524195202.GG27550-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2012-05-25 6:43 ` Boaz Harrosh
2012-05-24 0:02 ` [PATCH v2 06/14] block: Add bio_reset() Kent Overstreet
2012-05-24 0:02 ` [PATCH v2 07/14] pktcdvd: Switch to bio_kmalloc() Kent Overstreet
[not found] ` <1337817771-25038-8-git-send-email-koverstreet-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>
2012-05-24 19:42 ` Vivek Goyal
2012-05-24 19:55 ` Kent Overstreet
2012-05-24 0:02 ` [PATCH v2 09/14] block: Add an explicit bio flag for bios that own their bvec Kent Overstreet
[not found] ` <1337817771-25038-10-git-send-email-koverstreet-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>
2012-05-24 16:57 ` Boaz Harrosh
[not found] ` <4FBE687E.1030605-C4P08NqkoRlBDgjK7y7TUQ@public.gmane.org>
2012-05-24 21:31 ` Kent Overstreet
[not found] ` <20120524213158.GB22664-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>
2012-05-25 16:49 ` Vivek Goyal
[not found] ` <20120525164914.GE3855-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2012-05-25 20:01 ` Kent Overstreet
2012-05-24 0:02 ` [PATCH v2 10/14] block: Rename bio_split() -> bio_pair_split() Kent Overstreet
2012-05-24 0:02 ` [PATCH v2 11/14] block: Rework bio splitting Kent Overstreet
2012-05-24 16:56 ` Boaz Harrosh
2012-05-24 21:27 ` Kent Overstreet [this message]
[not found] ` <4FBE6823.50904-C4P08NqkoRlBDgjK7y7TUQ@public.gmane.org>
2012-05-25 18:48 ` Vivek Goyal
2012-05-24 0:02 ` [PATCH v2 12/14] Closures Kent Overstreet
2012-05-24 0:47 ` Joe Perches
2012-05-24 1:16 ` Kent Overstreet
[not found] ` <20120524011654.GA28662-RcKxWJ4Cfj3IzGYXcIpNmNLIRw13R84JkQQo+JxHRPFibQn6LdNjmg@public.gmane.org>
2012-05-24 1:23 ` Joe Perches
[not found] ` <1337817771-25038-13-git-send-email-koverstreet-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>
2012-05-24 7:39 ` Leen Besselink
2012-05-25 22:54 ` Andi Kleen
2012-05-24 0:02 ` [PATCH v2 13/14] Make generic_make_request handle arbitrarily large bios Kent Overstreet
2012-05-24 0:02 ` [PATCH v2 14/14] Gut bio_add_page() Kent Overstreet
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=20120524212723.GA22664@google.com \
--to=koverstreet@google.com \
--cc=agk@redhat.com \
--cc=axboe@kernel.dk \
--cc=bharrosh@panasas.com \
--cc=dm-devel@redhat.com \
--cc=drbd-dev@lists.linbit.com \
--cc=linux-bcache@vger.kernel.org \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mpatocka@redhat.com \
--cc=neilb@suse.de \
--cc=sage@newdream.net \
--cc=tj@kernel.org \
--cc=vgoyal@redhat.com \
--cc=yehuda@hq.newdream.net \
/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).