mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-28 10:41:38 -04:00
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 <[email protected]> Credit-to: Ming Lei <[email protected]> (minor fixes) Reviewed-by: Ming Lei <[email protected]> Signed-off-by: NeilBrown <[email protected]> Signed-off-by: Jens Axboe <[email protected]>
This commit is contained in:
parent
011067b056
commit
47e0fb461f
8 changed files with 30 additions and 10 deletions
|
|
@ -782,7 +782,9 @@ static int bcache_device_init(struct bcache_device *d, unsigned block_size,
|
|||
|
||||
minor *= BCACHE_MINORS;
|
||||
|
||||
if (!(d->bio_split = bioset_create(4, offsetof(struct bbio, bio), BIOSET_NEED_BVECS)) ||
|
||||
if (!(d->bio_split = bioset_create(4, offsetof(struct bbio, bio),
|
||||
BIOSET_NEED_BVECS |
|
||||
BIOSET_NEED_RESCUER)) ||
|
||||
!(d->disk = alloc_disk(BCACHE_MINORS))) {
|
||||
ida_simple_remove(&bcache_minor, minor);
|
||||
return -ENOMEM;
|
||||
|
|
@ -1516,7 +1518,9 @@ struct cache_set *bch_cache_set_alloc(struct cache_sb *sb)
|
|||
sizeof(struct bbio) + sizeof(struct bio_vec) *
|
||||
bucket_pages(c))) ||
|
||||
!(c->fill_iter = mempool_create_kmalloc_pool(1, iter_size)) ||
|
||||
!(c->bio_split = bioset_create(4, offsetof(struct bbio, bio), BIOSET_NEED_BVECS)) ||
|
||||
!(c->bio_split = bioset_create(4, offsetof(struct bbio, bio),
|
||||
BIOSET_NEED_BVECS |
|
||||
BIOSET_NEED_RESCUER)) ||
|
||||
!(c->uuids = alloc_bucket_pages(GFP_KERNEL, c)) ||
|
||||
!(c->moving_gc_wq = alloc_workqueue("bcache_gc",
|
||||
WQ_MEM_RECLAIM, 0)) ||
|
||||
|
|
|
|||
|
|
@ -2677,7 +2677,8 @@ static int crypt_ctr(struct dm_target *ti, unsigned int argc, char **argv)
|
|||
goto bad;
|
||||
}
|
||||
|
||||
cc->bs = bioset_create(MIN_IOS, 0, BIOSET_NEED_BVECS);
|
||||
cc->bs = bioset_create(MIN_IOS, 0, (BIOSET_NEED_BVECS |
|
||||
BIOSET_NEED_RESCUER));
|
||||
if (!cc->bs) {
|
||||
ti->error = "Cannot allocate crypt bioset";
|
||||
goto bad;
|
||||
|
|
|
|||
|
|
@ -58,7 +58,8 @@ struct dm_io_client *dm_io_client_create(void)
|
|||
if (!client->pool)
|
||||
goto bad;
|
||||
|
||||
client->bios = bioset_create(min_ios, 0, BIOSET_NEED_BVECS);
|
||||
client->bios = bioset_create(min_ios, 0, (BIOSET_NEED_BVECS |
|
||||
BIOSET_NEED_RESCUER));
|
||||
if (!client->bios)
|
||||
goto bad;
|
||||
|
||||
|
|
|
|||
|
|
@ -1036,7 +1036,8 @@ static void flush_current_bio_list(struct blk_plug_cb *cb, bool from_schedule)
|
|||
|
||||
while ((bio = bio_list_pop(&list))) {
|
||||
struct bio_set *bs = bio->bi_pool;
|
||||
if (unlikely(!bs) || bs == fs_bio_set) {
|
||||
if (unlikely(!bs) || bs == fs_bio_set ||
|
||||
!bs->rescue_workqueue) {
|
||||
bio_list_add(¤t->bio_list[i], bio);
|
||||
continue;
|
||||
}
|
||||
|
|
@ -2660,7 +2661,7 @@ struct dm_md_mempools *dm_alloc_md_mempools(struct mapped_device *md, enum dm_qu
|
|||
BUG();
|
||||
}
|
||||
|
||||
pools->bs = bioset_create(pool_size, front_pad, 0);
|
||||
pools->bs = bioset_create(pool_size, front_pad, BIOSET_NEED_RESCUER);
|
||||
if (!pools->bs)
|
||||
goto out;
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue