1621 lines · 43.9 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.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/blk-cgroup.h>#include <linux/highmem.h>#include <linux/sched/sysctl.h>#include <linux/blk-crypto.h>#include <linux/xarray.h> #include <trace/events/block.h>#include "blk.h"#include "blk-rq-qos.h" 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, 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){	BIO_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_uninit(bio); 	if (bs) {		bvec_free(&bs->bvec_pool, bio->bi_io_vec, bio->bi_max_vecs); 		/*		 * If we have front padding, adjust the bio pointer before freeing		 */		p = bio;		p -= bs->front_pad; 		mempool_free(p, &bs->bio_pool);	} else {		/* Bio was allocated by bio_kmalloc() */		kfree(bio);	}} /* * 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 bio_vec *table,	      unsigned short max_vecs){	memset(bio, 0, sizeof(*bio));	atomic_set(&bio->__bi_remaining, 1);	atomic_set(&bio->__bi_cnt, 1); 	bio->bi_io_vec = table;	bio->bi_max_vecs = max_vecs;}EXPORT_SYMBOL(bio_init); /** * bio_reset - reinitialize a bio * @bio:	bio to reset * * 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){	bio_uninit(bio);	memset(bio, 0, BIO_RESET_BYTES);	atomic_set(&bio->__bi_remaining, 1);}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); 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);} /** * bio_alloc_bioset - allocate a bio for I/O * @gfp_mask:   the GFP_* mask given to the slab allocator * @nr_iovecs:	number of iovecs to pre-allocate * @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. * * Returns: Pointer to new bio on success, NULL on failure. */struct bio *bio_alloc_bioset(gfp_t gfp_mask, unsigned short nr_iovecs,			     struct bio_set *bs){	gfp_t saved_gfp = gfp_mask;	struct bio *bio;	void *p; 	/* should not use nobvec bioset for nr_iovecs > 0 */	if (WARN_ON_ONCE(!mempool_initialized(&bs->bvec_pool) && nr_iovecs > 0))		return NULL; 	/*	 * submit_bio_noacct() converts recursion to iteration; this means if	 * we're running beneath it, any bios we allocate and submit will not be	 * submitted (and thus freed) until after we return.	 *	 * This exposes us to a potential deadlock if we allocate multiple bios	 * from the same bio_set() while running underneath submit_bio_noacct().	 * If we were to allocate multiple bios (say a stacking block driver	 * that was splitting bios), we would deadlock if we exhausted the	 * mempool's reserve.	 *	 * We solve this, and guarantee forward progress, with a rescuer	 * workqueue per bio_set. If we go to allocate and there are bios on	 * current->bio_list, we first try the allocation without	 * __GFP_DIRECT_RECLAIM; if that fails, we punt those bios we would be	 * blocking to the rescuer workqueue before we retry with the original	 * gfp_flags.	 */	if (current->bio_list &&	    (!bio_list_empty(&current->bio_list[0]) ||	     !bio_list_empty(&current->bio_list[1])) &&	    bs->rescue_workqueue)		gfp_mask &= ~__GFP_DIRECT_RECLAIM; 	p = mempool_alloc(&bs->bio_pool, gfp_mask);	if (!p && gfp_mask != saved_gfp) {		punt_bios_to_rescuer(bs);		gfp_mask = saved_gfp;		p = mempool_alloc(&bs->bio_pool, gfp_mask);	}	if (unlikely(!p))		return NULL; 	bio = p + bs->front_pad;	if (nr_iovecs > BIO_INLINE_VECS) {		struct bio_vec *bvl = NULL; 		bvl = bvec_alloc(&bs->bvec_pool, &nr_iovecs, gfp_mask);		if (!bvl && gfp_mask != saved_gfp) {			punt_bios_to_rescuer(bs);			gfp_mask = saved_gfp;			bvl = bvec_alloc(&bs->bvec_pool, &nr_iovecs, gfp_mask);		}		if (unlikely(!bvl))			goto err_free; 		bio_init(bio, bvl, nr_iovecs);	} else if (nr_iovecs) {		bio_init(bio, bio->bi_inline_vecs, BIO_INLINE_VECS);	} else {		bio_init(bio, NULL, 0);	} 	bio->bi_pool = bs;	return bio; err_free:	mempool_free(p, &bs->bio_pool);	return NULL;}EXPORT_SYMBOL(bio_alloc_bioset); /** * bio_kmalloc - kmalloc a bio for I/O * @gfp_mask:   the GFP_* mask given to the slab allocator * @nr_iovecs:	number of iovecs to pre-allocate * * Use kmalloc to allocate and initialize a bio. * * Returns: Pointer to new bio on success, NULL on failure. */struct bio *bio_kmalloc(gfp_t gfp_mask, unsigned short nr_iovecs){	struct bio *bio; 	if (nr_iovecs > UIO_MAXIOV)		return NULL; 	bio = kmalloc(struct_size(bio, bi_inline_vecs, nr_iovecs), gfp_mask);	if (unlikely(!bio))		return NULL;	bio_init(bio, nr_iovecs ? bio->bi_inline_vecs : NULL, nr_iovecs);	bio->bi_pool = NULL;	return bio;}EXPORT_SYMBOL(bio_kmalloc); void zero_fill_bio(struct bio *bio){	unsigned long flags;	struct bio_vec bv;	struct bvec_iter iter;

Lines 1–500 of 1621.