summaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorNeilBrown <neilb@suse.com>2017-06-18 00:38:57 -0400
committerJens Axboe <axboe@kernel.dk>2017-06-18 14:40:59 -0400
commit47e0fb461fca1a68a566c82fcc006cc787312d8c (patch)
tree5362bdaeb18fdbe069062d33cb27622088698374 /drivers
parent011067b05668b05aae88e5a24cff0ca0a67ca0b0 (diff)
blk: make the bioset rescue_workqueue optional.
This patch converts bioset_create() to not create a workqueue by default, so alloctions will never trigger punt_bios_to_rescuer(). It also introduces a new flag BIOSET_NEED_RESCUER which tells bioset_create() to preserve the old behavior. All callers of bioset_create() that are inside block device drivers, are given the BIOSET_NEED_RESCUER flag. 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, and one allocated by target_core_iblock.c. biosets used by md/raid do not need rescuing as their usage was recently audited and 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. Reviewed-by: Christoph Hellwig <hch@lst.de> Credit-to: Ming Lei <ming.lei@redhat.com> (minor fixes) Reviewed-by: Ming Lei <ming.lei@redhat.com> Signed-off-by: NeilBrown <neilb@suse.com> Signed-off-by: Jens Axboe <axboe@kernel.dk>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/block/drbd/drbd_main.c4
-rw-r--r--drivers/md/bcache/super.c8
-rw-r--r--drivers/md/dm-crypt.c3
-rw-r--r--drivers/md/dm-io.c3
-rw-r--r--drivers/md/dm.c5
5 files changed, 16 insertions, 7 deletions
diff --git a/drivers/block/drbd/drbd_main.c b/drivers/block/drbd/drbd_main.c
index b395fe391171..bdf51b6977cf 100644
--- a/drivers/block/drbd/drbd_main.c
+++ b/drivers/block/drbd/drbd_main.c
@@ -2165,7 +2165,9 @@ static int drbd_create_mempools(void)
2165 goto Enomem; 2165 goto Enomem;
2166 2166
2167 /* mempools */ 2167 /* mempools */
2168 drbd_md_io_bio_set = bioset_create(DRBD_MIN_POOL_PAGES, 0, BIOSET_NEED_BVECS); 2168 drbd_md_io_bio_set = bioset_create(DRBD_MIN_POOL_PAGES, 0,
2169 BIOSET_NEED_BVECS |
2170 BIOSET_NEED_RESCUER);
2169 if (drbd_md_io_bio_set == NULL) 2171 if (drbd_md_io_bio_set == NULL)
2170 goto Enomem; 2172 goto Enomem;
2171 2173
diff --git a/drivers/md/bcache/super.c b/drivers/md/bcache/super.c
index abd6e825b39b..8352fad765f6 100644
--- a/drivers/md/bcache/super.c
+++ b/drivers/md/bcache/super.c
@@ -782,7 +782,9 @@ static int bcache_device_init(struct bcache_device *d, unsigned block_size,
782 782
783 minor *= BCACHE_MINORS; 783 minor *= BCACHE_MINORS;
784 784
785 if (!(d->bio_split = bioset_create(4, offsetof(struct bbio, bio), BIOSET_NEED_BVECS)) || 785 if (!(d->bio_split = bioset_create(4, offsetof(struct bbio, bio),
786 BIOSET_NEED_BVECS |
787 BIOSET_NEED_RESCUER)) ||
786 !(d->disk = alloc_disk(BCACHE_MINORS))) { 788 !(d->disk = alloc_disk(BCACHE_MINORS))) {
787 ida_simple_remove(&bcache_minor, minor); 789 ida_simple_remove(&bcache_minor, minor);
788 return -ENOMEM; 790 return -ENOMEM;
@@ -1516,7 +1518,9 @@ struct cache_set *bch_cache_set_alloc(struct cache_sb *sb)
1516 sizeof(struct bbio) + sizeof(struct bio_vec) * 1518 sizeof(struct bbio) + sizeof(struct bio_vec) *
1517 bucket_pages(c))) || 1519 bucket_pages(c))) ||
1518 !(c->fill_iter = mempool_create_kmalloc_pool(1, iter_size)) || 1520 !(c->fill_iter = mempool_create_kmalloc_pool(1, iter_size)) ||
1519 !(c->bio_split = bioset_create(4, offsetof(struct bbio, bio), BIOSET_NEED_BVECS)) || 1521 !(c->bio_split = bioset_create(4, offsetof(struct bbio, bio),
1522 BIOSET_NEED_BVECS |
1523 BIOSET_NEED_RESCUER)) ||
1520 !(c->uuids = alloc_bucket_pages(GFP_KERNEL, c)) || 1524 !(c->uuids = alloc_bucket_pages(GFP_KERNEL, c)) ||
1521 !(c->moving_gc_wq = alloc_workqueue("bcache_gc", 1525 !(c->moving_gc_wq = alloc_workqueue("bcache_gc",
1522 WQ_MEM_RECLAIM, 0)) || 1526 WQ_MEM_RECLAIM, 0)) ||
diff --git a/drivers/md/dm-crypt.c b/drivers/md/dm-crypt.c
index 237ff8e9752a..9e1b72e8f7ef 100644
--- a/drivers/md/dm-crypt.c
+++ b/drivers/md/dm-crypt.c
@@ -2677,7 +2677,8 @@ static int crypt_ctr(struct dm_target *ti, unsigned int argc, char **argv)
2677 goto bad; 2677 goto bad;
2678 } 2678 }
2679 2679
2680 cc->bs = bioset_create(MIN_IOS, 0, BIOSET_NEED_BVECS); 2680 cc->bs = bioset_create(MIN_IOS, 0, (BIOSET_NEED_BVECS |
2681 BIOSET_NEED_RESCUER));
2681 if (!cc->bs) { 2682 if (!cc->bs) {
2682 ti->error = "Cannot allocate crypt bioset"; 2683 ti->error = "Cannot allocate crypt bioset";
2683 goto bad; 2684 goto bad;
diff --git a/drivers/md/dm-io.c b/drivers/md/dm-io.c
index 5c4121024d92..81248a8a8b57 100644
--- a/drivers/md/dm-io.c
+++ b/drivers/md/dm-io.c
@@ -58,7 +58,8 @@ struct dm_io_client *dm_io_client_create(void)
58 if (!client->pool) 58 if (!client->pool)
59 goto bad; 59 goto bad;
60 60
61 client->bios = bioset_create(min_ios, 0, BIOSET_NEED_BVECS); 61 client->bios = bioset_create(min_ios, 0, (BIOSET_NEED_BVECS |
62 BIOSET_NEED_RESCUER));
62 if (!client->bios) 63 if (!client->bios)
63 goto bad; 64 goto bad;
64 65
diff --git a/drivers/md/dm.c b/drivers/md/dm.c
index 3394a311de3d..fbd06b9f9467 100644
--- a/drivers/md/dm.c
+++ b/drivers/md/dm.c
@@ -1036,7 +1036,8 @@ static void flush_current_bio_list(struct blk_plug_cb *cb, bool from_schedule)
1036 1036
1037 while ((bio = bio_list_pop(&list))) { 1037 while ((bio = bio_list_pop(&list))) {
1038 struct bio_set *bs = bio->bi_pool; 1038 struct bio_set *bs = bio->bi_pool;
1039 if (unlikely(!bs) || bs == fs_bio_set) { 1039 if (unlikely(!bs) || bs == fs_bio_set ||
1040 !bs->rescue_workqueue) {
1040 bio_list_add(&current->bio_list[i], bio); 1041 bio_list_add(&current->bio_list[i], bio);
1041 continue; 1042 continue;
1042 } 1043 }
@@ -2660,7 +2661,7 @@ struct dm_md_mempools *dm_alloc_md_mempools(struct mapped_device *md, enum dm_qu
2660 BUG(); 2661 BUG();
2661 } 2662 }
2662 2663
2663 pools->bs = bioset_create(pool_size, front_pad, 0); 2664 pools->bs = bioset_create(pool_size, front_pad, BIOSET_NEED_RESCUER);
2664 if (!pools->bs) 2665 if (!pools->bs)
2665 goto out; 2666 goto out;
2666 2667