From: Christoph Hellwig <hch@infradead.org>
To: NeilBrown <neilb@suse.com>
Cc: Jens Axboe <axboe@kernel.dk>,
linux-block@vger.kernel.org, Ming Lei <tom.leiming@gmail.com>,
linux-kernel@vger.kernel.org
Subject: Re: [PATCH 03/13] blk: make the bioset rescue_workqueue optional.
Date: Tue, 2 May 2017 01:14:25 -0700 [thread overview]
Message-ID: <20170502081425.GC5578@infradead.org> (raw)
In-Reply-To: <149369654434.5146.15331164625586213889.stgit@noble>
On Tue, May 02, 2017 at 01:42:24PM +1000, NeilBrown wrote:
> This patch converts bioset_create() and
> bioset_create_nobvec() to not create a workqueue so
> alloctions will never trigger punt_bios_to_rescuer(). It
> also introduces bioset_create_rescued() and
> bioset_create_nobvec_rescued() which preserve the old
> behaviour.
>
> All callers of bioset_create() and bioset_create_nobvec(),
> that are inside block device drivers, are converted to the
> _rescued() version.
>
> biosets used by filesystems or other top-level users do not
> need rescuing as the bio can never be queued behind other
> bios. This includes fs_bio_set, blkdev_dio_pool,
> btrfs_bioset, xfs_ioend_bioset, drbd_md_io_bio_set,
> and one allocated by target_core_iblock.c.
>
> biosets used by md/raid to not need rescuing as
> their usage was recently audited to revised to never
> risk deadlock.
>
> It is hoped that most, if not all, of the remaining biosets
> can end up being the non-rescued version.
>
> Signed-off-by: NeilBrown <neilb@suse.com>
> ---
> block/bio.c | 12 ++++++++++--
> block/blk-core.c | 2 +-
> drivers/md/bcache/super.c | 6 ++++--
> drivers/md/dm-crypt.c | 2 +-
> drivers/md/dm-io.c | 2 +-
> drivers/md/dm.c | 5 +++--
> include/linux/bio.h | 1 +
> 7 files changed, 21 insertions(+), 9 deletions(-)
>
> diff --git a/block/bio.c b/block/bio.c
> index 3f1286ed301e..257606e742e0 100644
> --- a/block/bio.c
> +++ b/block/bio.c
> @@ -363,6 +363,8 @@ static void punt_bios_to_rescuer(struct bio_set *bs)
> struct bio_list punt, nopunt;
> struct bio *bio;
>
> + if (!WARN_ON_ONCE(!bs->rescue_workqueue))
> + return;
> /*
> * In order to guarantee forward progress we must punt only bios that
> * were allocated from this bio_set; otherwise, if there was a bio on
> @@ -474,7 +476,8 @@ struct bio *bio_alloc_bioset(gfp_t gfp_mask, unsigned int nr_iovecs,
>
> if (current->bio_list &&
> (!bio_list_empty(¤t->bio_list[0]) ||
> - !bio_list_empty(¤t->bio_list[1])))
> + !bio_list_empty(¤t->bio_list[1])) &&
> + bs->rescue_workqueue)
> gfp_mask &= ~__GFP_DIRECT_RECLAIM;
>
> p = mempool_alloc(bs->bio_pool, gfp_mask);
> @@ -1925,7 +1928,7 @@ EXPORT_SYMBOL(bioset_free);
> * bioset_create - Create a bio_set
> * @pool_size: Number of bio and bio_vecs to cache in the mempool
> * @front_pad: Number of bytes to allocate in front of the returned bio
> - * @flags: Flags to modify behavior, currently only %BIOSET_NEED_BVECS
> + * @flags: Flags to modify behavior, currently %BIOSET_NEED_BVECS and %BIOSET_NEED_RESCUER
> *
> * Description:
> * Set up a bio_set to be used with @bio_alloc_bioset. Allows the caller
> @@ -1936,6 +1939,8 @@ EXPORT_SYMBOL(bioset_free);
> * or things will break badly.
> * If %BIOSET_NEED_BVECS is set in @flags, a separate pool will be allocated
> * for allocating iovecs. This pool is not needed e.g. for bio_clone_fast().
> + * If %BIOSET_NEED_RESCUER is set, workqueue is create which can be used to
> + * dispatch queued requests when the mempool runs out of space.
> *
> */
> struct bio_set *bioset_create(unsigned int pool_size,
> @@ -1971,6 +1976,9 @@ struct bio_set *bioset_create(unsigned int pool_size,
> goto bad;
> }
>
> + if (!(flags & BIOSET_NEED_RESCUER))
> + return bs;
> +
> bs->rescue_workqueue = alloc_workqueue("bioset", WQ_MEM_RECLAIM, 0);
> if (!bs->rescue_workqueue)
> goto bad;
> diff --git a/block/blk-core.c b/block/blk-core.c
> index 3797753f4085..ae51f159a2ca 100644
> --- a/block/blk-core.c
> +++ b/block/blk-core.c
> @@ -730,7 +730,7 @@ struct request_queue *blk_alloc_queue_node(gfp_t gfp_mask, int node_id)
> if (q->id < 0)
> goto fail_q;
>
> - q->bio_split = bioset_create(BIO_POOL_SIZE, 0, BIOSET_NEED_BVECS);
> + q->bio_split = bioset_create(BIO_POOL_SIZE, 0, BIOSET_NEED_BVECS | BIOSET_NEED_RESCUER);
Please avoid > 80 char lines.
Otherwise looks fine,
Reviewed-by: Christoph Hellwig <hch@lst.de>
next prev parent reply other threads:[~2017-05-02 8:14 UTC|newest]
Thread overview: 46+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-05-02 3:42 [PATCH 00/13] block: assorted cleanup for bio splitting and cloning NeilBrown
2017-05-02 3:42 ` [PATCH 02/13] blk: replace bioset_create_nobvec() with a flags arg to bioset_create() NeilBrown
2017-05-02 8:06 ` Christoph Hellwig
2017-05-02 21:47 ` NeilBrown
2017-05-02 9:40 ` Ming Lei
2017-05-02 3:42 ` [PATCH 05/13] block: Improvements to bounce-buffer handling NeilBrown
2017-05-02 8:13 ` Christoph Hellwig
2017-05-02 11:56 ` Ming Lei
2017-05-02 3:42 ` [PATCH 03/13] blk: make the bioset rescue_workqueue optional NeilBrown
2017-05-02 8:14 ` Christoph Hellwig [this message]
2017-05-02 11:00 ` Ming Lei
2017-05-02 22:10 ` NeilBrown
2017-05-02 22:34 ` [PATCH 03/13 V2] " NeilBrown
2017-05-03 3:24 ` Ming Lei
2017-05-02 3:42 ` [PATCH 01/13] blk: remove bio_set arg from blk_queue_split() NeilBrown
2017-05-02 10:44 ` javigon
2017-05-02 3:42 ` [PATCH 04/13] blk: use non-rescuing bioset for q->bio_split NeilBrown
2017-05-02 11:54 ` Ming Lei
2017-05-02 23:21 ` [PATCH 04/13 V2] " NeilBrown
2017-05-02 3:42 ` [PATCH 08/13] pktcdvd: use bio_clone_fast() instead of bio_clone() NeilBrown
2017-05-02 3:42 ` [PATCH 09/13] lightnvm/pblk-read: use bio_clone_fast() NeilBrown
2017-05-02 8:15 ` Christoph Hellwig
2017-05-02 11:22 ` Javier González
2017-05-02 21:51 ` NeilBrown
2017-05-03 6:42 ` Javier González
2017-05-02 3:42 ` [PATCH 06/13] rbd: use bio_clone_fast() instead of bio_clone() NeilBrown
2017-05-02 3:42 ` [PATCH 07/13] drbd: " NeilBrown
2017-05-02 23:20 ` [PATCH 07/13 V2] " NeilBrown
2017-05-02 3:42 ` [PATCH 10/13] xen-blkfront: remove bio splitting NeilBrown
2017-05-02 8:15 ` Christoph Hellwig
2017-05-02 3:42 ` [PATCH 12/13] block: remove bio_clone() and all references NeilBrown
2017-05-02 3:42 ` [PATCH 13/13] block: don't check for BIO_MAX_PAGES in blk_bio_segment_split() NeilBrown
2017-05-02 8:15 ` Christoph Hellwig
2017-05-02 10:22 ` Ming Lei
2017-05-02 22:54 ` NeilBrown
2017-05-02 23:50 ` Ming Lei
2017-05-02 3:42 ` [PATCH 11/13] bcache: use kmalloc to allocate bio in bch_data_verify() NeilBrown
2017-05-11 0:58 ` [PATCH 00/13] block: assorted cleanup for bio splitting and cloning NeilBrown
2017-06-16 5:54 ` NeilBrown
2017-06-16 6:42 ` Christoph Hellwig
2017-06-16 7:30 ` NeilBrown
2017-06-16 7:34 ` Christoph Hellwig
2017-06-16 20:45 ` Jens Axboe
2017-06-18 4:40 ` NeilBrown
2017-06-18 4:40 ` NeilBrown
-- strict thread matches above, loose matches on Subject: below --
2017-06-18 4:38 NeilBrown
2017-06-18 4:38 ` [PATCH 03/13] blk: make the bioset rescue_workqueue optional NeilBrown
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=20170502081425.GC5578@infradead.org \
--to=hch@infradead.org \
--cc=axboe@kernel.dk \
--cc=linux-block@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=neilb@suse.com \
--cc=tom.leiming@gmail.com \
/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 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.