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:
Родитель
11dfce509e
Коммит
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;
|
front_pad = 0;
|
||||||
inline_vecs = nr_iovecs;
|
inline_vecs = nr_iovecs;
|
||||||
} else {
|
} 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
|
* generic_make_request() converts recursion to iteration; this
|
||||||
* means if we're running beneath it, any bios we allocate and
|
* 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);
|
EXPORT_SYMBOL(bioset_free);
|
||||||
|
|
||||||
/**
|
static struct bio_set *__bioset_create(unsigned int pool_size,
|
||||||
* bioset_create - Create a bio_set
|
unsigned int front_pad,
|
||||||
* @pool_size: Number of bio and bio_vecs to cache in the mempool
|
bool create_bvec_pool)
|
||||||
* @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)
|
|
||||||
{
|
{
|
||||||
unsigned int back_pad = BIO_INLINE_VECS * sizeof(struct bio_vec);
|
unsigned int back_pad = BIO_INLINE_VECS * sizeof(struct bio_vec);
|
||||||
struct bio_set *bs;
|
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)
|
if (!bs->bio_pool)
|
||||||
goto bad;
|
goto bad;
|
||||||
|
|
||||||
bs->bvec_pool = biovec_create_pool(pool_size);
|
if (create_bvec_pool) {
|
||||||
if (!bs->bvec_pool)
|
bs->bvec_pool = biovec_create_pool(pool_size);
|
||||||
goto bad;
|
if (!bs->bvec_pool)
|
||||||
|
goto bad;
|
||||||
|
}
|
||||||
|
|
||||||
bs->rescue_workqueue = alloc_workqueue("bioset", WQ_MEM_RECLAIM, 0);
|
bs->rescue_workqueue = alloc_workqueue("bioset", WQ_MEM_RECLAIM, 0);
|
||||||
if (!bs->rescue_workqueue)
|
if (!bs->rescue_workqueue)
|
||||||
|
@ -1951,8 +1945,41 @@ bad:
|
||||||
bioset_free(bs);
|
bioset_free(bs);
|
||||||
return NULL;
|
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);
|
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
|
#ifdef CONFIG_BLK_CGROUP
|
||||||
/**
|
/**
|
||||||
* bio_associate_current - associate a bio with %current
|
* 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(unsigned int, unsigned int);
|
||||||
|
extern struct bio_set *bioset_create_nobvec(unsigned int, unsigned int);
|
||||||
extern void bioset_free(struct bio_set *);
|
extern void bioset_free(struct bio_set *);
|
||||||
extern mempool_t *biovec_create_pool(int pool_entries);
|
extern mempool_t *biovec_create_pool(int pool_entries);
|
||||||
|
|
||||||
|
|
Загрузка…
Ссылка в новой задаче