From: "Jun'ichi Nomura" <j-nomura@ce.jp.nec.com>
To: Kent Overstreet <koverstreet@google.com>
Cc: device-mapper development <dm-devel@redhat.com>,
axboe@kernel.dk, linux-kernel@vger.kernel.org, tj@kernel.org,
linux-bcache@vger.kernel.org, mpatocka@redhat.com,
agk@redhat.com, bharrosh@panasas.com,
linux-fsdevel@vger.kernel.org, yehuda@hq.newdream.net,
drbd-dev@lists.linbit.com, vgoyal@redhat.com, sage@newdream.net
Subject: Re: [dm-devel] [PATCH v2 02/14] dm: kill dm_rq_bio_destructor
Date: Thu, 24 May 2012 10:39:22 +0900 [thread overview]
Message-ID: <4FBD914A.5040406@ce.jp.nec.com> (raw)
In-Reply-To: <4FBD8BD9.8070708@ce.jp.nec.com>
On 05/24/12 10:16, Jun'ichi Nomura wrote:
> On 05/24/12 09:39, Kent Overstreet wrote:
>> On Thu, May 24, 2012 at 09:19:12AM +0900, Jun'ichi Nomura wrote:
>>> The destructor may also be called from blk_rq_unprep_clone(),
>>> which just puts bio.
>>> So this patch will introduce a memory leak.
>>
>> Well, keeping around bi_destructor solely for that reason would be
>> pretty lousy. Can you come up with a better solution?
>
> I don't have good one but here are some ideas:
> a) Do bio_endio() rather than bio_put() in blk_rq_unprep_clone()
> and let bi_end_io reap additional data.
> It looks ugly.
> b) Separate the constructor from blk_rq_prep_clone().
> dm has to do rq_for_each_bio loop again for constructor.
> Possible performance impact.
> c) Open code blk_rq_prep/unprep_clone() in dm.
> It exposes unnecessary block-internals to dm.
> d) Pass destructor function to blk_rq_prep/unprep_clone()
> for them to callback.
>
> Umm, is "d)" better?
I mean the patch like this:
Index: linux-3.4/block/blk-core.c
===================================================================
--- linux-3.4.orig/block/blk-core.c 2012-05-21 07:29:13.000000000 +0900
+++ linux-3.4/block/blk-core.c 2012-05-24 11:15:40.562817784 +0900
@@ -2596,17 +2596,20 @@
/**
* blk_rq_unprep_clone - Helper function to free all bios in a cloned request
* @rq: the clone request to be cleaned up
+ * @bio_dtr: cleanup function to be called for each clone bio.
*
* Description:
* Free all bios in @rq for a cloned request.
*/
-void blk_rq_unprep_clone(struct request *rq)
+void blk_rq_unprep_clone(struct request *rq, void (*bio_dtr)(struct bio *))
{
struct bio *bio;
while ((bio = rq->bio) != NULL) {
rq->bio = bio->bi_next;
+ if (bio_dtr)
+ bio_dtr(bio);
bio_put(bio);
}
}
@@ -2636,6 +2639,7 @@
* @gfp_mask: memory allocation mask for bio
* @bio_ctr: setup function to be called for each clone bio.
* Returns %0 for success, non %0 for failure.
+ * @bio_dtr: cleanup function to be called for each clone bio.
* @data: private data to be passed to @bio_ctr
*
* Description:
@@ -2650,7 +2654,7 @@
int blk_rq_prep_clone(struct request *rq, struct request *rq_src,
struct bio_set *bs, gfp_t gfp_mask,
int (*bio_ctr)(struct bio *, struct bio *, void *),
- void *data)
+ void (*bio_dtr)(struct bio *), void *data)
{
struct bio *bio, *bio_src;
@@ -2687,7 +2691,7 @@
free_and_out:
if (bio)
bio_free(bio, bs);
- blk_rq_unprep_clone(rq);
+ blk_rq_unprep_clone(rq, bio_dtr);
return -ENOMEM;
}
Index: linux-3.4/drivers/md/dm.c
===================================================================
--- linux-3.4.orig/drivers/md/dm.c 2012-05-24 11:12:52.000000000 +0900
+++ linux-3.4/drivers/md/dm.c 2012-05-24 11:24:06.325803254 +0900
@@ -701,6 +701,7 @@
struct bio *bio = info->orig;
unsigned int nr_bytes = info->orig->bi_size;
+ free_bio_info(info);
bio_put(clone);
if (tio->error)
@@ -763,11 +764,12 @@
dm_put(md);
}
+static void dm_rq_bio_destructor(struct bio *bio);
static void free_rq_clone(struct request *clone)
{
struct dm_rq_target_io *tio = clone->end_io_data;
- blk_rq_unprep_clone(clone);
+ blk_rq_unprep_clone(clone, dm_rq_bio_destructor);
free_rq_tio(tio);
}
@@ -1461,10 +1463,8 @@
static void dm_rq_bio_destructor(struct bio *bio)
{
struct dm_rq_clone_bio_info *info = bio->bi_private;
- struct mapped_device *md = info->tio->md;
free_bio_info(info);
- bio_free(bio, md->bs);
}
static int dm_rq_bio_constructor(struct bio *bio, struct bio *bio_orig,
@@ -1481,7 +1481,6 @@
info->tio = tio;
bio->bi_end_io = end_clone_bio;
bio->bi_private = info;
- bio->bi_destructor = dm_rq_bio_destructor;
return 0;
}
@@ -1492,7 +1491,7 @@
int r;
r = blk_rq_prep_clone(clone, rq, tio->md->bs, GFP_ATOMIC,
- dm_rq_bio_constructor, tio);
+ dm_rq_bio_constructor, dm_rq_bio_destructor, tio);
if (r)
return r;
Index: linux-3.4/include/linux/blkdev.h
===================================================================
--- linux-3.4.orig/include/linux/blkdev.h 2012-05-21 07:29:13.000000000 +0900
+++ linux-3.4/include/linux/blkdev.h 2012-05-24 11:20:53.455808958 +0900
@@ -678,8 +678,8 @@
extern int blk_rq_prep_clone(struct request *rq, struct request *rq_src,
struct bio_set *bs, gfp_t gfp_mask,
int (*bio_ctr)(struct bio *, struct bio *, void *),
- void *data);
-extern void blk_rq_unprep_clone(struct request *rq);
+ void (*bio_dtr)(struct bio *), void *data);
+extern void blk_rq_unprep_clone(struct request *rq, void (*bio_dtr)(struct bio *));
extern int blk_insert_cloned_request(struct request_queue *q,
struct request *rq);
extern void blk_delay_queue(struct request_queue *, unsigned long);
next prev parent reply other threads:[~2012-05-24 1:42 UTC|newest]
Thread overview: 48+ 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
2012-05-24 16:09 ` Tejun Heo
2012-05-24 16:19 ` Tejun Heo
2012-05-24 17:46 ` Vivek Goyal
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
2012-05-24 0:39 ` Kent Overstreet
2012-05-24 1:16 ` Jun'ichi Nomura
2012-05-24 1:39 ` Jun'ichi Nomura [this message]
2012-05-24 23:33 ` Kent Overstreet
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
2012-05-24 18:45 ` Vivek Goyal
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
2012-05-24 21:41 ` Yehuda Sadeh
2012-05-25 0:31 ` Kent Overstreet
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 06/14] block: Add bio_reset() Kent Overstreet
2012-05-24 0:02 ` [PATCH v2 07/14] pktcdvd: Switch to bio_kmalloc() Kent Overstreet
2012-05-24 19:42 ` Vivek Goyal
2012-05-24 19:55 ` 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 ` [dm-devel] " Vivek Goyal
2012-05-24 20:00 ` Kent Overstreet
2012-05-25 6:43 ` Boaz Harrosh
2012-05-24 0:02 ` [PATCH v2 09/14] block: Add an explicit bio flag for bios that own their bvec Kent Overstreet
2012-05-24 16:57 ` Boaz Harrosh
2012-05-24 21:31 ` Kent Overstreet
2012-05-25 16:49 ` Vivek Goyal
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
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
2012-05-24 1:23 ` Joe Perches
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=4FBD914A.5040406@ce.jp.nec.com \
--to=j-nomura@ce.jp.nec.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=koverstreet@google.com \
--cc=linux-bcache@vger.kernel.org \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mpatocka@redhat.com \
--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