mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-24 04:34:08 +08:00
block: add bioset_create_nobvec()
Users of bio_clone_fast() do not want bios with their own bvecs. Allocating a bvec mempool as part of the bioset intended for such users is a waste of memory. bioset_create_nobvec() creates a bioset that doesn't have the bvec mempool. Signed-off-by: Jun'ichi Nomura <j-nomura@ce.jp.nec.com> Signed-off-by: Mike Snitzer <snitzer@redhat.com> Signed-off-by: Jens Axboe <axboe@fb.com>
This commit is contained in:
parent
11dfce509e
commit
d8f429e166
61
block/bio.c
61
block/bio.c
@ -428,6 +428,9 @@ struct bio *bio_alloc_bioset(gfp_t gfp_mask, int nr_iovecs, struct bio_set *bs)
|
||||
front_pad = 0;
|
||||
inline_vecs = nr_iovecs;
|
||||
} else {
|
||||
/* should not use nobvec bioset for nr_iovecs > 0 */
|
||||
if (WARN_ON_ONCE(!bs->bvec_pool && nr_iovecs > 0))
|
||||
return NULL;
|
||||
/*
|
||||
* generic_make_request() converts recursion to iteration; this
|
||||
* means if we're running beneath it, any bios we allocate and
|
||||
@ -1900,20 +1903,9 @@ void bioset_free(struct bio_set *bs)
|
||||
}
|
||||
EXPORT_SYMBOL(bioset_free);
|
||||
|
||||
/**
|
||||
* bioset_create - Create a bio_set
|
||||
* @pool_size: Number of bio and bio_vecs to cache in the mempool
|
||||
* @front_pad: Number of bytes to allocate in front of the returned bio
|
||||
*
|
||||
* Description:
|
||||
* Set up a bio_set to be used with @bio_alloc_bioset. Allows the caller
|
||||
* to ask for a number of bytes to be allocated in front of the bio.
|
||||
* Front pad allocation is useful for embedding the bio inside
|
||||
* another structure, to avoid allocating extra data to go with the bio.
|
||||
* Note that the bio must be embedded at the END of that structure always,
|
||||
* or things will break badly.
|
||||
*/
|
||||
struct bio_set *bioset_create(unsigned int pool_size, unsigned int front_pad)
|
||||
static struct bio_set *__bioset_create(unsigned int pool_size,
|
||||
unsigned int front_pad,
|
||||
bool create_bvec_pool)
|
||||
{
|
||||
unsigned int back_pad = BIO_INLINE_VECS * sizeof(struct bio_vec);
|
||||
struct bio_set *bs;
|
||||
@ -1938,9 +1930,11 @@ struct bio_set *bioset_create(unsigned int pool_size, unsigned int front_pad)
|
||||
if (!bs->bio_pool)
|
||||
goto bad;
|
||||
|
||||
bs->bvec_pool = biovec_create_pool(pool_size);
|
||||
if (!bs->bvec_pool)
|
||||
goto bad;
|
||||
if (create_bvec_pool) {
|
||||
bs->bvec_pool = biovec_create_pool(pool_size);
|
||||
if (!bs->bvec_pool)
|
||||
goto bad;
|
||||
}
|
||||
|
||||
bs->rescue_workqueue = alloc_workqueue("bioset", WQ_MEM_RECLAIM, 0);
|
||||
if (!bs->rescue_workqueue)
|
||||
@ -1951,8 +1945,41 @@ bad:
|
||||
bioset_free(bs);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
* bioset_create - Create a bio_set
|
||||
* @pool_size: Number of bio and bio_vecs to cache in the mempool
|
||||
* @front_pad: Number of bytes to allocate in front of the returned bio
|
||||
*
|
||||
* Description:
|
||||
* Set up a bio_set to be used with @bio_alloc_bioset. Allows the caller
|
||||
* to ask for a number of bytes to be allocated in front of the bio.
|
||||
* Front pad allocation is useful for embedding the bio inside
|
||||
* another structure, to avoid allocating extra data to go with the bio.
|
||||
* Note that the bio must be embedded at the END of that structure always,
|
||||
* or things will break badly.
|
||||
*/
|
||||
struct bio_set *bioset_create(unsigned int pool_size, unsigned int front_pad)
|
||||
{
|
||||
return __bioset_create(pool_size, front_pad, true);
|
||||
}
|
||||
EXPORT_SYMBOL(bioset_create);
|
||||
|
||||
/**
|
||||
* bioset_create_nobvec - Create a bio_set without bio_vec mempool
|
||||
* @pool_size: Number of bio to cache in the mempool
|
||||
* @front_pad: Number of bytes to allocate in front of the returned bio
|
||||
*
|
||||
* Description:
|
||||
* Same functionality as bioset_create() except that mempool is not
|
||||
* created for bio_vecs. Saving some memory for bio_clone_fast() users.
|
||||
*/
|
||||
struct bio_set *bioset_create_nobvec(unsigned int pool_size, unsigned int front_pad)
|
||||
{
|
||||
return __bioset_create(pool_size, front_pad, false);
|
||||
}
|
||||
EXPORT_SYMBOL(bioset_create_nobvec);
|
||||
|
||||
#ifdef CONFIG_BLK_CGROUP
|
||||
/**
|
||||
* bio_associate_current - associate a bio with %current
|
||||
|
@ -378,6 +378,7 @@ static inline struct bio *bio_next_split(struct bio *bio, int sectors,
|
||||
}
|
||||
|
||||
extern struct bio_set *bioset_create(unsigned int, unsigned int);
|
||||
extern struct bio_set *bioset_create_nobvec(unsigned int, unsigned int);
|
||||
extern void bioset_free(struct bio_set *);
|
||||
extern mempool_t *biovec_create_pool(int pool_entries);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user