2218 lines · 59.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 <linux/kmemleak.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;}; #define BIO_INLINE_VECS 4 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[12];};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_obj(*bslab); 	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 inline void *bio_slab_addr(struct bio *bio){	return (void *)bio - bio->bi_pool->front_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);} /* * 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 try_alloc_gfp(gfp_t gfp){	return (gfp & ~(__GFP_DIRECT_RECLAIM | __GFP_IO)) |		__GFP_NOMEMALLOC | __GFP_NORETRY | __GFP_NOWARN;} 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);	WARN_ON_ONCE(bio->bi_max_vecs > BIO_MAX_VECS); 	bio_uninit(bio);	if (bio->bi_max_vecs == BIO_MAX_VECS)		mempool_free(bio->bi_io_vec, &bs->bvec_pool);	else if (bio->bi_max_vecs > BIO_INLINE_VECS)		kmem_cache_free(biovec_slab(bio->bi_max_vecs)->slab,				bio->bi_io_vec);	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_write_stream = 0;	bio->bi_status = 0;	bio->bi_bvec_gap_bit = 0;	bio->bi_iter.bi_sector = 0;	bio->bi_iter.bi_size = 0;	bio->bi_iter.bi_idx = 0;	bio->bi_iter.bi_offset = 0;	bio->bi_end_io = NULL;	bio->bi_private = NULL;#ifdef CONFIG_BLK_CGROUP	bio->bi_blkg = NULL;	bio->issue_time_ns = 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){	struct bio_vec          *bv = bio->bi_io_vec; 	bio_uninit(bio);	memset(bio, 0, BIO_RESET_BYTES);	atomic_set(&bio->__bi_remaining, 1);	bio->bi_io_vec = bv;	bio->bi_bdev = bdev;	if (bio->bi_bdev)		bio_associate_blkg(bio);	bio->bi_opf = opf;}EXPORT_SYMBOL(bio_reset); /** * bio_reuse - reuse a bio with the payload left intact * @bio:	bio to reuse * @opf:	operation and flags for the next I/O * * Allow reusing an existing bio for another operation with all set up * fields including the payload, device and end_io handler left intact. * * Typically used when @bio is first used to read data which is then written * to another location without modification.  @bio must not be in-flight and * owned by the caller.  Can't be used for cloned bios. * * Note: Can't be used when @bio has integrity or blk-crypto contexts for now. * Feel free to add that support when you need it, though. */void bio_reuse(struct bio *bio, blk_opf_t opf){	unsigned short vcnt = bio->bi_vcnt, i;	bio_end_io_t *end_io = bio->bi_end_io;	void *private = bio->bi_private; 	WARN_ON_ONCE(bio_flagged(bio, BIO_CLONED));	WARN_ON_ONCE(bio_integrity(bio));	WARN_ON_ONCE(bio_has_crypt_ctx(bio)); 	bio_reset(bio, bio->bi_bdev, opf);	for (i = 0; i < vcnt; i++)		bio->bi_iter.bi_size += bio->bi_io_vec[i].bv_len;	bio->bi_vcnt = vcnt;	bio->bi_private = private;	bio->bi_end_io = end_io;}EXPORT_SYMBOL_GPL(bio_reuse); 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;} /* * This function should only be used as a flag and must never be called. * If execution reaches here, it indicates a serious programming error. */static void bio_chain_endio(struct bio *bio){	BUG();} /** * 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);	}} /* * 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 by punting the bios on * current->bio_list to a per bio_set rescuer workqueue before blocking to wait * for elements being returned to the mempool. */static void punt_bios_to_rescuer(struct bio_set *bs){	struct bio_list punt, nopunt;	struct bio *bio; 	if (!current->bio_list || !bs->rescue_workqueue)		return;	if (bio_list_empty(&current->bio_list[0]) &&	    bio_list_empty(&current->bio_list[1]))		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 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->bi_pool = bs; 	kmemleak_alloc(bio_slab_addr(bio),		       kmem_cache_size(bs->bio_slab), 1, GFP_NOIO);	return bio;} 

Lines 1–500 of 2218.