Commit f25cf75a authored by Pavel Begunkov's avatar Pavel Begunkov Committed by Jens Axboe
Browse files

bio: split pcpu cache part of bio_put into a helper



Extract a helper out of bio_put for recycling into percpu caches.
It's a preparation patch without functional changes.

Signed-off-by: default avatarPavel Begunkov <asml.silence@gmail.com>
Link: https://lore.kernel.org/r/e97ab2026a89098ee1bfdd09bcb9451fced95f87.1667384020.git.asml.silence@gmail.com


Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
parent 759aa12f
Loading
Loading
Loading
Loading
+25 −13
Original line number Diff line number Diff line
@@ -727,6 +727,28 @@ static void bio_alloc_cache_destroy(struct bio_set *bs)
	bs->cache = NULL;
}

static inline void bio_put_percpu_cache(struct bio *bio)
{
	struct bio_alloc_cache *cache;

	cache = per_cpu_ptr(bio->bi_pool->cache, get_cpu());
	bio_uninit(bio);

	if ((bio->bi_opf & REQ_POLLED) && !WARN_ON_ONCE(in_interrupt())) {
		bio->bi_next = cache->free_list;
		cache->free_list = bio;
		cache->nr++;
	} else {
		put_cpu();
		bio_free(bio);
		return;
	}

	if (cache->nr > ALLOC_CACHE_MAX + ALLOC_CACHE_SLACK)
		bio_alloc_cache_prune(cache, ALLOC_CACHE_SLACK);
	put_cpu();
}

/**
 * bio_put - release a reference to a bio
 * @bio:   bio to release reference to
@@ -742,21 +764,11 @@ void bio_put(struct bio *bio)
		if (!atomic_dec_and_test(&bio->__bi_cnt))
			return;
	}

	if ((bio->bi_opf & REQ_ALLOC_CACHE) && !WARN_ON_ONCE(in_interrupt())) {
		struct bio_alloc_cache *cache;

		bio_uninit(bio);
		cache = per_cpu_ptr(bio->bi_pool->cache, get_cpu());
		bio->bi_next = cache->free_list;
		cache->free_list = bio;
		if (++cache->nr > ALLOC_CACHE_MAX + ALLOC_CACHE_SLACK)
			bio_alloc_cache_prune(cache, ALLOC_CACHE_SLACK);
		put_cpu();
	} else {
	if (bio->bi_opf & REQ_ALLOC_CACHE)
		bio_put_percpu_cache(bio);
	else
		bio_free(bio);
}
}
EXPORT_SYMBOL(bio_put);

static int __bio_clone(struct bio *bio, struct bio *bio_src, gfp_t gfp)