|
@@ -254,7 +254,7 @@ static void bio_free(struct bio *bio)
|
|
|
bio_uninit(bio);
|
|
|
|
|
|
if (bs) {
|
|
|
- bvec_free(bs->bvec_pool, bio->bi_io_vec, BVEC_POOL_IDX(bio));
|
|
|
+ bvec_free(&bs->bvec_pool, bio->bi_io_vec, BVEC_POOL_IDX(bio));
|
|
|
|
|
|
/*
|
|
|
* If we have front padding, adjust the bio pointer before freeing
|
|
@@ -262,7 +262,7 @@ static void bio_free(struct bio *bio)
|
|
|
p = bio;
|
|
|
p -= bs->front_pad;
|
|
|
|
|
|
- mempool_free(p, bs->bio_pool);
|
|
|
+ mempool_free(p, &bs->bio_pool);
|
|
|
} else {
|
|
|
/* Bio was allocated by bio_kmalloc() */
|
|
|
kfree(bio);
|
|
@@ -454,7 +454,8 @@ struct bio *bio_alloc_bioset(gfp_t gfp_mask, unsigned int nr_iovecs,
|
|
|
inline_vecs = nr_iovecs;
|
|
|
} else {
|
|
|
/* should not use nobvec bioset for nr_iovecs > 0 */
|
|
|
- if (WARN_ON_ONCE(!bs->bvec_pool && nr_iovecs > 0))
|
|
|
+ if (WARN_ON_ONCE(!mempool_initialized(&bs->bvec_pool) &&
|
|
|
+ nr_iovecs > 0))
|
|
|
return NULL;
|
|
|
/*
|
|
|
* generic_make_request() converts recursion to iteration; this
|
|
@@ -483,11 +484,11 @@ struct bio *bio_alloc_bioset(gfp_t gfp_mask, unsigned int nr_iovecs,
|
|
|
bs->rescue_workqueue)
|
|
|
gfp_mask &= ~__GFP_DIRECT_RECLAIM;
|
|
|
|
|
|
- p = mempool_alloc(bs->bio_pool, gfp_mask);
|
|
|
+ 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);
|
|
|
+ p = mempool_alloc(&bs->bio_pool, gfp_mask);
|
|
|
}
|
|
|
|
|
|
front_pad = bs->front_pad;
|
|
@@ -503,11 +504,11 @@ struct bio *bio_alloc_bioset(gfp_t gfp_mask, unsigned int nr_iovecs,
|
|
|
if (nr_iovecs > inline_vecs) {
|
|
|
unsigned long idx = 0;
|
|
|
|
|
|
- bvl = bvec_alloc(gfp_mask, nr_iovecs, &idx, bs->bvec_pool);
|
|
|
+ bvl = bvec_alloc(gfp_mask, nr_iovecs, &idx, &bs->bvec_pool);
|
|
|
if (!bvl && gfp_mask != saved_gfp) {
|
|
|
punt_bios_to_rescuer(bs);
|
|
|
gfp_mask = saved_gfp;
|
|
|
- bvl = bvec_alloc(gfp_mask, nr_iovecs, &idx, bs->bvec_pool);
|
|
|
+ bvl = bvec_alloc(gfp_mask, nr_iovecs, &idx, &bs->bvec_pool);
|
|
|
}
|
|
|
|
|
|
if (unlikely(!bvl))
|
|
@@ -524,7 +525,7 @@ struct bio *bio_alloc_bioset(gfp_t gfp_mask, unsigned int nr_iovecs,
|
|
|
return bio;
|
|
|
|
|
|
err_free:
|
|
|
- mempool_free(p, bs->bio_pool);
|
|
|
+ mempool_free(p, &bs->bio_pool);
|
|
|
return NULL;
|
|
|
}
|
|
|
EXPORT_SYMBOL(bio_alloc_bioset);
|
|
@@ -1848,11 +1849,11 @@ EXPORT_SYMBOL_GPL(bio_trim);
|
|
|
* create memory pools for biovec's in a bio_set.
|
|
|
* use the global biovec slabs created for general use.
|
|
|
*/
|
|
|
-mempool_t *biovec_create_pool(int pool_entries)
|
|
|
+int biovec_init_pool(mempool_t *pool, int pool_entries)
|
|
|
{
|
|
|
struct biovec_slab *bp = bvec_slabs + BVEC_POOL_MAX;
|
|
|
|
|
|
- return mempool_create_slab_pool(pool_entries, bp->slab);
|
|
|
+ return mempool_init_slab_pool(pool, pool_entries, bp->slab);
|
|
|
}
|
|
|
|
|
|
void bioset_free(struct bio_set *bs)
|
|
@@ -1860,8 +1861,8 @@ void bioset_free(struct bio_set *bs)
|
|
|
if (bs->rescue_workqueue)
|
|
|
destroy_workqueue(bs->rescue_workqueue);
|
|
|
|
|
|
- mempool_destroy(bs->bio_pool);
|
|
|
- mempool_destroy(bs->bvec_pool);
|
|
|
+ mempool_exit(&bs->bio_pool);
|
|
|
+ mempool_exit(&bs->bvec_pool);
|
|
|
|
|
|
bioset_integrity_free(bs);
|
|
|
bio_put_slab(bs);
|
|
@@ -1913,15 +1914,12 @@ struct bio_set *bioset_create(unsigned int pool_size,
|
|
|
return NULL;
|
|
|
}
|
|
|
|
|
|
- bs->bio_pool = mempool_create_slab_pool(pool_size, bs->bio_slab);
|
|
|
- if (!bs->bio_pool)
|
|
|
+ if (mempool_init_slab_pool(&bs->bio_pool, pool_size, bs->bio_slab))
|
|
|
goto bad;
|
|
|
|
|
|
- if (flags & BIOSET_NEED_BVECS) {
|
|
|
- bs->bvec_pool = biovec_create_pool(pool_size);
|
|
|
- if (!bs->bvec_pool)
|
|
|
- goto bad;
|
|
|
- }
|
|
|
+ if ((flags & BIOSET_NEED_BVECS) &&
|
|
|
+ biovec_init_pool(&bs->bvec_pool, pool_size))
|
|
|
+ goto bad;
|
|
|
|
|
|
if (!(flags & BIOSET_NEED_RESCUER))
|
|
|
return bs;
|