1855 lines · 49.4 KB · C
RawDownload
// SPDX-License-Identifier: GPL-2.0/* * Copyright (C) 2001 Jens Axboe <axboe@kernel.dk> */#include <linux/mm.h>#include <linux/swap.h>#include <linux/bio-integrity.h>#include <linux/blkdev.h>#include <linux/uio.h>#include <linux/iocontext.h>#include <linux/slab.h>#include <linux/init.h>#include <linux/kernel.h>#include <linux/export.h>#include <linux/mempool.h>#include <linux/workqueue.h>#include <linux/cgroup.h>#include <linux/highmem.h>#include <linux/blk-crypto.h>#include <linux/xarray.h> #include <trace/events/block.h>#include "blk.h"#include "blk-rq-qos.h"#include "blk-cgroup.h" #define ALLOC_CACHE_THRESHOLD	16#define ALLOC_CACHE_MAX		256 struct bio_alloc_cache {	struct bio		*free_list;	struct bio		*free_list_irq;	unsigned int		nr;	unsigned int		nr_irq;}; static struct biovec_slab {	int nr_vecs;	char *name;	struct kmem_cache *slab;} bvec_slabs[] __read_mostly = {	{ .nr_vecs = 16, .name = "biovec-16" },	{ .nr_vecs = 64, .name = "biovec-64" },	{ .nr_vecs = 128, .name = "biovec-128" },	{ .nr_vecs = BIO_MAX_VECS, .name = "biovec-max" },}; static struct biovec_slab *biovec_slab(unsigned short nr_vecs){	switch (nr_vecs) {	/* smaller bios use inline vecs */	case 5 ... 16:		return &bvec_slabs[0];	case 17 ... 64:		return &bvec_slabs[1];	case 65 ... 128:		return &bvec_slabs[2];	case 129 ... BIO_MAX_VECS:		return &bvec_slabs[3];	default:		BUG();		return NULL;	}} /* * fs_bio_set is the bio_set containing bio and iovec memory pools used by * IO code that does not need private memory pools. */struct bio_set fs_bio_set;EXPORT_SYMBOL(fs_bio_set); /* * Our slab pool management */struct bio_slab {	struct kmem_cache *slab;	unsigned int slab_ref;	unsigned int slab_size;	char name[8];};static DEFINE_MUTEX(bio_slab_lock);static DEFINE_XARRAY(bio_slabs); static struct bio_slab *create_bio_slab(unsigned int size){	struct bio_slab *bslab = kzalloc(sizeof(*bslab), GFP_KERNEL); 	if (!bslab)		return NULL; 	snprintf(bslab->name, sizeof(bslab->name), "bio-%d", size);	bslab->slab = kmem_cache_create(bslab->name, size,			ARCH_KMALLOC_MINALIGN,			SLAB_HWCACHE_ALIGN | SLAB_TYPESAFE_BY_RCU, NULL);	if (!bslab->slab)		goto fail_alloc_slab; 	bslab->slab_ref = 1;	bslab->slab_size = size; 	if (!xa_err(xa_store(&bio_slabs, size, bslab, GFP_KERNEL)))		return bslab; 	kmem_cache_destroy(bslab->slab); fail_alloc_slab:	kfree(bslab);	return NULL;} static inline unsigned int bs_bio_slab_size(struct bio_set *bs){	return bs->front_pad + sizeof(struct bio) + bs->back_pad;} static struct kmem_cache *bio_find_or_create_slab(struct bio_set *bs){	unsigned int size = bs_bio_slab_size(bs);	struct bio_slab *bslab; 	mutex_lock(&bio_slab_lock);	bslab = xa_load(&bio_slabs, size);	if (bslab)		bslab->slab_ref++;	else		bslab = create_bio_slab(size);	mutex_unlock(&bio_slab_lock); 	if (bslab)		return bslab->slab;	return NULL;} static void bio_put_slab(struct bio_set *bs){	struct bio_slab *bslab = NULL;	unsigned int slab_size = bs_bio_slab_size(bs); 	mutex_lock(&bio_slab_lock); 	bslab = xa_load(&bio_slabs, slab_size);	if (WARN(!bslab, KERN_ERR "bio: unable to find slab!\n"))		goto out; 	WARN_ON_ONCE(bslab->slab != bs->bio_slab); 	WARN_ON(!bslab->slab_ref); 	if (--bslab->slab_ref)		goto out; 	xa_erase(&bio_slabs, slab_size); 	kmem_cache_destroy(bslab->slab);	kfree(bslab); out:	mutex_unlock(&bio_slab_lock);} void bvec_free(mempool_t *pool, struct bio_vec *bv, unsigned short nr_vecs){	BUG_ON(nr_vecs > BIO_MAX_VECS); 	if (nr_vecs == BIO_MAX_VECS)		mempool_free(bv, pool);	else if (nr_vecs > BIO_INLINE_VECS)		kmem_cache_free(biovec_slab(nr_vecs)->slab, bv);} /* * Make the first allocation restricted and don't dump info on allocation * failures, since we'll fall back to the mempool in case of failure. */static inline gfp_t bvec_alloc_gfp(gfp_t gfp){	return (gfp & ~(__GFP_DIRECT_RECLAIM | __GFP_IO)) |		__GFP_NOMEMALLOC | __GFP_NORETRY | __GFP_NOWARN;} struct bio_vec *bvec_alloc(mempool_t *pool, unsigned short *nr_vecs,		gfp_t gfp_mask){	struct biovec_slab *bvs = biovec_slab(*nr_vecs); 	if (WARN_ON_ONCE(!bvs))		return NULL; 	/*	 * Upgrade the nr_vecs request to take full advantage of the allocation.	 * We also rely on this in the bvec_free path.	 */	*nr_vecs = bvs->nr_vecs; 	/*	 * Try a slab allocation first for all smaller allocations.  If that	 * fails and __GFP_DIRECT_RECLAIM is set retry with the mempool.	 * The mempool is sized to handle up to BIO_MAX_VECS entries.	 */	if (*nr_vecs < BIO_MAX_VECS) {		struct bio_vec *bvl; 		bvl = kmem_cache_alloc(bvs->slab, bvec_alloc_gfp(gfp_mask));		if (likely(bvl) || !(gfp_mask & __GFP_DIRECT_RECLAIM))			return bvl;		*nr_vecs = BIO_MAX_VECS;	} 	return mempool_alloc(pool, gfp_mask);} void bio_uninit(struct bio *bio){#ifdef CONFIG_BLK_CGROUP	if (bio->bi_blkg) {		blkg_put(bio->bi_blkg);		bio->bi_blkg = NULL;	}#endif	if (bio_integrity(bio))		bio_integrity_free(bio); 	bio_crypt_free_ctx(bio);}EXPORT_SYMBOL(bio_uninit); static void bio_free(struct bio *bio){	struct bio_set *bs = bio->bi_pool;	void *p = bio; 	WARN_ON_ONCE(!bs); 	bio_uninit(bio);	bvec_free(&bs->bvec_pool, bio->bi_io_vec, bio->bi_max_vecs);	mempool_free(p - bs->front_pad, &bs->bio_pool);} /* * Users of this function have their own bio allocation. Subsequently, * they must remember to pair any call to bio_init() with bio_uninit() * when IO has completed, or when the bio is released. */void bio_init(struct bio *bio, struct block_device *bdev, struct bio_vec *table,	      unsigned short max_vecs, blk_opf_t opf){	bio->bi_next = NULL;	bio->bi_bdev = bdev;	bio->bi_opf = opf;	bio->bi_flags = 0;	bio->bi_ioprio = 0;	bio->bi_write_hint = 0;	bio->bi_status = 0;	bio->bi_iter.bi_sector = 0;	bio->bi_iter.bi_size = 0;	bio->bi_iter.bi_idx = 0;	bio->bi_iter.bi_bvec_done = 0;	bio->bi_end_io = NULL;	bio->bi_private = NULL;#ifdef CONFIG_BLK_CGROUP	bio->bi_blkg = NULL;	bio->bi_issue.value = 0;	if (bdev)		bio_associate_blkg(bio);#ifdef CONFIG_BLK_CGROUP_IOCOST	bio->bi_iocost_cost = 0;#endif#endif#ifdef CONFIG_BLK_INLINE_ENCRYPTION	bio->bi_crypt_context = NULL;#endif#ifdef CONFIG_BLK_DEV_INTEGRITY	bio->bi_integrity = NULL;#endif	bio->bi_vcnt = 0; 	atomic_set(&bio->__bi_remaining, 1);	atomic_set(&bio->__bi_cnt, 1);	bio->bi_cookie = BLK_QC_T_NONE; 	bio->bi_max_vecs = max_vecs;	bio->bi_io_vec = table;	bio->bi_pool = NULL;}EXPORT_SYMBOL(bio_init); /** * bio_reset - reinitialize a bio * @bio:	bio to reset * @bdev:	block device to use the bio for * @opf:	operation and flags for bio * * Description: *   After calling bio_reset(), @bio will be in the same state as a freshly *   allocated bio returned bio bio_alloc_bioset() - the only fields that are *   preserved are the ones that are initialized by bio_alloc_bioset(). See *   comment in struct bio. */void bio_reset(struct bio *bio, struct block_device *bdev, blk_opf_t opf){	bio_uninit(bio);	memset(bio, 0, BIO_RESET_BYTES);	atomic_set(&bio->__bi_remaining, 1);	bio->bi_bdev = bdev;	if (bio->bi_bdev)		bio_associate_blkg(bio);	bio->bi_opf = opf;}EXPORT_SYMBOL(bio_reset); static struct bio *__bio_chain_endio(struct bio *bio){	struct bio *parent = bio->bi_private; 	if (bio->bi_status && !parent->bi_status)		parent->bi_status = bio->bi_status;	bio_put(bio);	return parent;} static void bio_chain_endio(struct bio *bio){	bio_endio(__bio_chain_endio(bio));} /** * bio_chain - chain bio completions * @bio: the target bio * @parent: the parent bio of @bio * * The caller won't have a bi_end_io called when @bio completes - instead, * @parent's bi_end_io won't be called until both @parent and @bio have * completed; the chained bio will also be freed when it completes. * * The caller must not set bi_private or bi_end_io in @bio. */void bio_chain(struct bio *bio, struct bio *parent){	BUG_ON(bio->bi_private || bio->bi_end_io); 	bio->bi_private = parent;	bio->bi_end_io	= bio_chain_endio;	bio_inc_remaining(parent);}EXPORT_SYMBOL(bio_chain); /** * bio_chain_and_submit - submit a bio after chaining it to another one * @prev: bio to chain and submit * @new: bio to chain to * * If @prev is non-NULL, chain it to @new and submit it. * * Return: @new. */struct bio *bio_chain_and_submit(struct bio *prev, struct bio *new){	if (prev) {		bio_chain(prev, new);		submit_bio(prev);	}	return new;} struct bio *blk_next_bio(struct bio *bio, struct block_device *bdev,		unsigned int nr_pages, blk_opf_t opf, gfp_t gfp){	return bio_chain_and_submit(bio, bio_alloc(bdev, nr_pages, opf, gfp));}EXPORT_SYMBOL_GPL(blk_next_bio); static void bio_alloc_rescue(struct work_struct *work){	struct bio_set *bs = container_of(work, struct bio_set, rescue_work);	struct bio *bio; 	while (1) {		spin_lock(&bs->rescue_lock);		bio = bio_list_pop(&bs->rescue_list);		spin_unlock(&bs->rescue_lock); 		if (!bio)			break; 		submit_bio_noacct(bio);	}} 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	 * there for a stacking driver higher up in the stack, processing it	 * could require allocating bios from this bio_set, and doing that from	 * our own rescuer would be bad.	 *	 * Since bio lists are singly linked, pop them all instead of trying to	 * remove from the middle of the list:	 */ 	bio_list_init(&punt);	bio_list_init(&nopunt); 	while ((bio = bio_list_pop(&current->bio_list[0])))		bio_list_add(bio->bi_pool == bs ? &punt : &nopunt, bio);	current->bio_list[0] = nopunt; 	bio_list_init(&nopunt);	while ((bio = bio_list_pop(&current->bio_list[1])))		bio_list_add(bio->bi_pool == bs ? &punt : &nopunt, bio);	current->bio_list[1] = nopunt; 	spin_lock(&bs->rescue_lock);	bio_list_merge(&bs->rescue_list, &punt);	spin_unlock(&bs->rescue_lock); 	queue_work(bs->rescue_workqueue, &bs->rescue_work);} static void bio_alloc_irq_cache_splice(struct bio_alloc_cache *cache){	unsigned long flags; 	/* cache->free_list must be empty */	if (WARN_ON_ONCE(cache->free_list))		return; 	local_irq_save(flags);	cache->free_list = cache->free_list_irq;	cache->free_list_irq = NULL;	cache->nr += cache->nr_irq;	cache->nr_irq = 0;	local_irq_restore(flags);} static struct bio *bio_alloc_percpu_cache(struct block_device *bdev,		unsigned short nr_vecs, blk_opf_t opf, gfp_t gfp,		struct bio_set *bs){	struct bio_alloc_cache *cache;	struct bio *bio; 	cache = per_cpu_ptr(bs->cache, get_cpu());	if (!cache->free_list) {		if (READ_ONCE(cache->nr_irq) >= ALLOC_CACHE_THRESHOLD)			bio_alloc_irq_cache_splice(cache);		if (!cache->free_list) {			put_cpu();			return NULL;		}	}	bio = cache->free_list;	cache->free_list = bio->bi_next;	cache->nr--;	put_cpu(); 	bio_init(bio, bdev, nr_vecs ? bio->bi_inline_vecs : NULL, nr_vecs, opf);	bio->bi_pool = bs;	return bio;} /** * bio_alloc_bioset - allocate a bio for I/O * @bdev:	block device to allocate the bio for (can be %NULL) * @nr_vecs:	number of bvecs to pre-allocate * @opf:	operation and flags for bio * @gfp_mask:   the GFP_* mask given to the slab allocator * @bs:		the bio_set to allocate from. * * Allocate a bio from the mempools in @bs. * * If %__GFP_DIRECT_RECLAIM is set then bio_alloc will always be able to * allocate a bio.  This is due to the mempool guarantees.  To make this work, * callers must never allocate more than 1 bio at a time from the general pool. * Callers that need to allocate more than 1 bio must always submit the * previously allocated bio for IO before attempting to allocate a new one. * Failure to do so can cause deadlocks under memory pressure. * * Note that when running under submit_bio_noacct() (i.e. any block driver), * bios are not submitted until after you return - see the code in * submit_bio_noacct() that converts recursion into iteration, to prevent * stack overflows. * * This would normally mean allocating multiple bios under submit_bio_noacct() * would be susceptible to deadlocks, but we have * deadlock avoidance code that resubmits any blocked bios from a rescuer * thread. * * However, we do not guarantee forward progress for allocations from other * mempools. Doing multiple allocations from the same mempool under * submit_bio_noacct() should be avoided - instead, use bio_set's front_pad * for per bio allocations. *

Lines 1–500 of 1855.