From: NeilBrown <neilb@suse.com> To: Jens Axboe <axboe@kernel.dk> Cc: linux-block@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Ilya Dryomov <idryomov@gmail.com>, Sage Weil <sage@redhat.com>, Alex Elder <elder@kernel.org>, ceph-devel@vger.kernel.org Subject: [PATCH 05/11] rbd: use bio_clone_fast() instead of bio_clone() Date: Thu, 20 Apr 2017 15:38:49 +1000 [thread overview] Message-ID: <149266672920.27388.16945242936892893803.stgit@noble> (raw) In-Reply-To: <149266645258.27388.14083229348123176454.stgit@noble> bio_clone() makes a copy of the bi_io_vec, but rbd never changes that, so there is no need for a copy. bio_clone_fast() can be used instead, which avoids making the copy. This requires that we provide a bio_set. bio_clone() uses fs_bio_set, but it isn't, in general, safe to use the same bio_set at different levels of the stack, as that can lead to deadlocks. As filesystems use fs_bio_set, block devices shouldn't. As rbd never stacks, it is safe to have a single global bio_set for all rbd devices to use. So allocate that when the module is initialised, and use it with bio_clone_fast(). Signed-off-by: NeilBrown <neilb@suse.com> --- drivers/block/rbd.c | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c index 089ac4179919..48eecffc612e 100644 --- a/drivers/block/rbd.c +++ b/drivers/block/rbd.c @@ -441,6 +441,8 @@ static DEFINE_SPINLOCK(rbd_client_list_lock); static struct kmem_cache *rbd_img_request_cache; static struct kmem_cache *rbd_obj_request_cache; +static struct bio_set *rbd_bio_clone; + static int rbd_major; static DEFINE_IDA(rbd_dev_id_ida); @@ -1362,7 +1364,7 @@ static struct bio *bio_clone_range(struct bio *bio_src, { struct bio *bio; - bio = bio_clone(bio_src, gfpmask); + bio = bio_clone_fast(bio_src, gfpmask, rbd_bio_clone); if (!bio) return NULL; /* ENOMEM */ @@ -6342,8 +6344,16 @@ static int rbd_slab_init(void) if (!rbd_obj_request_cache) goto out_err; + rbd_assert(!rbd_bio_clone); + rbd_bio_clone = bioset_create(BIO_POOL_SIZE, 0); + if (!rbd_bio_clone) + goto out_err_clone; + return 0; +out_err_clone: + kmem_cache_destroy(rbd_obj_request_cache); + rbd_obj_request_cache = NULL; out_err: kmem_cache_destroy(rbd_img_request_cache); rbd_img_request_cache = NULL; @@ -6359,6 +6369,10 @@ static void rbd_slab_exit(void) rbd_assert(rbd_img_request_cache); kmem_cache_destroy(rbd_img_request_cache); rbd_img_request_cache = NULL; + + rbd_assert(rbd_bio_clone); + bioset_free(rbd_bio_clone); + rbd_bio_clone = NULL; } static int __init rbd_init(void)
WARNING: multiple messages have this Message-ID (diff)
From: NeilBrown <neilb@suse.com> To: Jens Axboe <axboe@kernel.dk> Cc: linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, Ilya Dryomov <idryomov@gmail.com>, Sage Weil <sage@redhat.com>, Alex Elder <elder@kernel.org>, ceph-devel@vger.kernel.org Subject: [PATCH 05/11] rbd: use bio_clone_fast() instead of bio_clone() Date: Thu, 20 Apr 2017 15:38:49 +1000 [thread overview] Message-ID: <149266672920.27388.16945242936892893803.stgit@noble> (raw) In-Reply-To: <149266645258.27388.14083229348123176454.stgit@noble> bio_clone() makes a copy of the bi_io_vec, but rbd never changes that, so there is no need for a copy. bio_clone_fast() can be used instead, which avoids making the copy. This requires that we provide a bio_set. bio_clone() uses fs_bio_set, but it isn't, in general, safe to use the same bio_set at different levels of the stack, as that can lead to deadlocks. As filesystems use fs_bio_set, block devices shouldn't. As rbd never stacks, it is safe to have a single global bio_set for all rbd devices to use. So allocate that when the module is initialised, and use it with bio_clone_fast(). Signed-off-by: NeilBrown <neilb@suse.com> --- drivers/block/rbd.c | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/drivers/block/rbd.c b/drivers/block/rbd.c index 089ac4179919..48eecffc612e 100644 --- a/drivers/block/rbd.c +++ b/drivers/block/rbd.c @@ -441,6 +441,8 @@ static DEFINE_SPINLOCK(rbd_client_list_lock); static struct kmem_cache *rbd_img_request_cache; static struct kmem_cache *rbd_obj_request_cache; +static struct bio_set *rbd_bio_clone; + static int rbd_major; static DEFINE_IDA(rbd_dev_id_ida); @@ -1362,7 +1364,7 @@ static struct bio *bio_clone_range(struct bio *bio_src, { struct bio *bio; - bio = bio_clone(bio_src, gfpmask); + bio = bio_clone_fast(bio_src, gfpmask, rbd_bio_clone); if (!bio) return NULL; /* ENOMEM */ @@ -6342,8 +6344,16 @@ static int rbd_slab_init(void) if (!rbd_obj_request_cache) goto out_err; + rbd_assert(!rbd_bio_clone); + rbd_bio_clone = bioset_create(BIO_POOL_SIZE, 0); + if (!rbd_bio_clone) + goto out_err_clone; + return 0; +out_err_clone: + kmem_cache_destroy(rbd_obj_request_cache); + rbd_obj_request_cache = NULL; out_err: kmem_cache_destroy(rbd_img_request_cache); rbd_img_request_cache = NULL; @@ -6359,6 +6369,10 @@ static void rbd_slab_exit(void) rbd_assert(rbd_img_request_cache); kmem_cache_destroy(rbd_img_request_cache); rbd_img_request_cache = NULL; + + rbd_assert(rbd_bio_clone); + bioset_free(rbd_bio_clone); + rbd_bio_clone = NULL; } static int __init rbd_init(void)
next prev parent reply other threads:[~2017-04-20 5:38 UTC|newest] Thread overview: 50+ messages / expand[flat|nested] mbox.gz Atom feed top 2017-04-20 5:38 [PATCH 00/10] block: assorted cleanup for bio splitting and cloning NeilBrown 2017-04-20 5:38 ` NeilBrown 2017-04-20 5:38 ` [PATCH 00/11] " NeilBrown 2017-04-20 5:38 ` [PATCH 01/11] blk: remove bio_set arg from blk_queue_split() NeilBrown 2017-04-21 11:21 ` Christoph Hellwig 2017-04-21 15:14 ` Ming Lei 2017-04-22 9:16 ` Javier González 2017-04-24 2:32 ` NeilBrown 2017-04-20 5:38 ` [PATCH 02/11] blk: make the bioset rescue_workqueue optional NeilBrown 2017-04-21 11:24 ` Christoph Hellwig 2017-04-24 1:51 ` NeilBrown 2017-04-24 15:10 ` Christoph Hellwig 2017-05-01 5:00 ` NeilBrown 2017-05-01 14:02 ` Jens Axboe 2017-05-02 3:33 ` NeilBrown 2017-04-20 5:38 ` [PATCH 07/11] pktcdvd: use bio_clone_fast() instead of bio_clone() NeilBrown 2017-04-21 11:29 ` Christoph Hellwig 2017-04-20 5:38 ` NeilBrown [this message] 2017-04-20 5:38 ` [PATCH 05/11] rbd: " NeilBrown 2017-04-21 11:31 ` Christoph Hellwig 2017-04-20 5:38 ` [PATCH 03/11] blk: use non-rescuing bioset for q->bio_split NeilBrown 2017-04-21 11:25 ` Christoph Hellwig 2017-04-20 5:38 ` [PATCH 04/11] block: Improvements to bounce-buffer handling NeilBrown 2017-04-21 11:28 ` Christoph Hellwig 2017-04-21 15:39 ` Ming Lei 2017-04-20 5:38 ` [PATCH 06/11] drbd: use bio_clone_fast() instead of bio_clone() NeilBrown 2017-04-21 11:30 ` Christoph Hellwig 2017-04-20 5:38 ` [PATCH 09/11] bcache: use kmalloc to allocate bio in bch_data_verify() NeilBrown 2017-04-20 5:38 ` NeilBrown 2017-04-21 11:31 ` Christoph Hellwig 2017-04-21 11:32 ` Kent Overstreet 2017-04-21 15:41 ` Ming Lei 2017-04-20 5:38 ` [PATCH 08/11] xen-blkfront: remove bio splitting NeilBrown 2017-04-20 5:38 ` NeilBrown 2017-04-20 5:38 ` NeilBrown 2017-04-20 10:00 ` Roger Pau Monné 2017-04-20 10:00 ` Roger Pau Monné 2017-04-20 10:00 ` Roger Pau Monné 2017-04-21 11:36 ` Christoph Hellwig 2017-04-21 11:36 ` Christoph Hellwig 2017-04-21 11:46 ` Roger Pau Monne 2017-04-21 11:46 ` Roger Pau Monne 2017-04-20 5:38 ` [PATCH 11/11] block: don't check for BIO_MAX_PAGES in blk_bio_segment_split() NeilBrown 2017-04-21 11:34 ` Christoph Hellwig 2017-04-21 15:48 ` Ming Lei 2017-04-24 3:16 ` NeilBrown 2017-04-24 3:14 ` NeilBrown 2017-04-20 5:38 ` [PATCH 10/11] block: remove bio_clone() and all references NeilBrown 2017-04-21 11:32 ` Christoph Hellwig 2017-04-21 15:43 ` Ming Lei
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=149266672920.27388.16945242936892893803.stgit@noble \ --to=neilb@suse.com \ --cc=axboe@kernel.dk \ --cc=linux-block@vger.kernel.org \ --cc=linux-kernel@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: linkBe 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.