[PATCH] kill bio->bi_set
Jens: ->bi_set is totally unnecessary bloat of struct bio. Just define a proper destructor for the bio and it already knows what bio_set it belongs too. Peter: Fixed the bugs. Signed-off-by: Jens Axboe <axboe@suse.de> Signed-off-by: Peter Osterlund <petero2@telia.com> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
parent
6f00df24ee
commit
3676347a5e
4 changed files with 34 additions and 12 deletions
|
@ -239,6 +239,11 @@ static void vm_dp_init(struct dpages *dp, void *data)
|
||||||
dp->context_ptr = data;
|
dp->context_ptr = data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void dm_bio_destructor(struct bio *bio)
|
||||||
|
{
|
||||||
|
bio_free(bio, _bios);
|
||||||
|
}
|
||||||
|
|
||||||
/*-----------------------------------------------------------------
|
/*-----------------------------------------------------------------
|
||||||
* IO routines that accept a list of pages.
|
* IO routines that accept a list of pages.
|
||||||
*---------------------------------------------------------------*/
|
*---------------------------------------------------------------*/
|
||||||
|
@ -263,6 +268,7 @@ static void do_region(int rw, unsigned int region, struct io_region *where,
|
||||||
bio->bi_bdev = where->bdev;
|
bio->bi_bdev = where->bdev;
|
||||||
bio->bi_end_io = endio;
|
bio->bi_end_io = endio;
|
||||||
bio->bi_private = io;
|
bio->bi_private = io;
|
||||||
|
bio->bi_destructor = dm_bio_destructor;
|
||||||
bio_set_region(bio, region);
|
bio_set_region(bio, region);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -399,6 +399,11 @@ struct clone_info {
|
||||||
unsigned short idx;
|
unsigned short idx;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static void dm_bio_destructor(struct bio *bio)
|
||||||
|
{
|
||||||
|
bio_free(bio, dm_set);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Creates a little bio that is just does part of a bvec.
|
* Creates a little bio that is just does part of a bvec.
|
||||||
*/
|
*/
|
||||||
|
@ -410,6 +415,7 @@ static struct bio *split_bvec(struct bio *bio, sector_t sector,
|
||||||
struct bio_vec *bv = bio->bi_io_vec + idx;
|
struct bio_vec *bv = bio->bi_io_vec + idx;
|
||||||
|
|
||||||
clone = bio_alloc_bioset(GFP_NOIO, 1, dm_set);
|
clone = bio_alloc_bioset(GFP_NOIO, 1, dm_set);
|
||||||
|
clone->bi_destructor = dm_bio_destructor;
|
||||||
*clone->bi_io_vec = *bv;
|
*clone->bi_io_vec = *bv;
|
||||||
|
|
||||||
clone->bi_sector = sector;
|
clone->bi_sector = sector;
|
||||||
|
|
32
fs/bio.c
32
fs/bio.c
|
@ -104,18 +104,22 @@ static inline struct bio_vec *bvec_alloc_bs(unsigned int __nocast gfp_mask, int
|
||||||
return bvl;
|
return bvl;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
void bio_free(struct bio *bio, struct bio_set *bio_set)
|
||||||
* default destructor for a bio allocated with bio_alloc_bioset()
|
|
||||||
*/
|
|
||||||
static void bio_destructor(struct bio *bio)
|
|
||||||
{
|
{
|
||||||
const int pool_idx = BIO_POOL_IDX(bio);
|
const int pool_idx = BIO_POOL_IDX(bio);
|
||||||
struct bio_set *bs = bio->bi_set;
|
|
||||||
|
|
||||||
BIO_BUG_ON(pool_idx >= BIOVEC_NR_POOLS);
|
BIO_BUG_ON(pool_idx >= BIOVEC_NR_POOLS);
|
||||||
|
|
||||||
mempool_free(bio->bi_io_vec, bs->bvec_pools[pool_idx]);
|
mempool_free(bio->bi_io_vec, bio_set->bvec_pools[pool_idx]);
|
||||||
mempool_free(bio, bs->bio_pool);
|
mempool_free(bio, bio_set->bio_pool);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* default destructor for a bio allocated with bio_alloc_bioset()
|
||||||
|
*/
|
||||||
|
static void bio_fs_destructor(struct bio *bio)
|
||||||
|
{
|
||||||
|
bio_free(bio, fs_bio_set);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline void bio_init(struct bio *bio)
|
inline void bio_init(struct bio *bio)
|
||||||
|
@ -171,8 +175,6 @@ struct bio *bio_alloc_bioset(unsigned int __nocast gfp_mask, int nr_iovecs, stru
|
||||||
bio->bi_max_vecs = bvec_slabs[idx].nr_vecs;
|
bio->bi_max_vecs = bvec_slabs[idx].nr_vecs;
|
||||||
}
|
}
|
||||||
bio->bi_io_vec = bvl;
|
bio->bi_io_vec = bvl;
|
||||||
bio->bi_destructor = bio_destructor;
|
|
||||||
bio->bi_set = bs;
|
|
||||||
}
|
}
|
||||||
out:
|
out:
|
||||||
return bio;
|
return bio;
|
||||||
|
@ -180,7 +182,12 @@ struct bio *bio_alloc_bioset(unsigned int __nocast gfp_mask, int nr_iovecs, stru
|
||||||
|
|
||||||
struct bio *bio_alloc(unsigned int __nocast gfp_mask, int nr_iovecs)
|
struct bio *bio_alloc(unsigned int __nocast gfp_mask, int nr_iovecs)
|
||||||
{
|
{
|
||||||
return bio_alloc_bioset(gfp_mask, nr_iovecs, fs_bio_set);
|
struct bio *bio = bio_alloc_bioset(gfp_mask, nr_iovecs, fs_bio_set);
|
||||||
|
|
||||||
|
if (bio)
|
||||||
|
bio->bi_destructor = bio_fs_destructor;
|
||||||
|
|
||||||
|
return bio;
|
||||||
}
|
}
|
||||||
|
|
||||||
void zero_fill_bio(struct bio *bio)
|
void zero_fill_bio(struct bio *bio)
|
||||||
|
@ -273,8 +280,10 @@ struct bio *bio_clone(struct bio *bio, unsigned int __nocast gfp_mask)
|
||||||
{
|
{
|
||||||
struct bio *b = bio_alloc_bioset(gfp_mask, bio->bi_max_vecs, fs_bio_set);
|
struct bio *b = bio_alloc_bioset(gfp_mask, bio->bi_max_vecs, fs_bio_set);
|
||||||
|
|
||||||
if (b)
|
if (b) {
|
||||||
|
b->bi_destructor = bio_fs_destructor;
|
||||||
__bio_clone(b, bio);
|
__bio_clone(b, bio);
|
||||||
|
}
|
||||||
|
|
||||||
return b;
|
return b;
|
||||||
}
|
}
|
||||||
|
@ -1075,6 +1084,7 @@ subsys_initcall(init_bio);
|
||||||
|
|
||||||
EXPORT_SYMBOL(bio_alloc);
|
EXPORT_SYMBOL(bio_alloc);
|
||||||
EXPORT_SYMBOL(bio_put);
|
EXPORT_SYMBOL(bio_put);
|
||||||
|
EXPORT_SYMBOL(bio_free);
|
||||||
EXPORT_SYMBOL(bio_endio);
|
EXPORT_SYMBOL(bio_endio);
|
||||||
EXPORT_SYMBOL(bio_init);
|
EXPORT_SYMBOL(bio_init);
|
||||||
EXPORT_SYMBOL(__bio_clone);
|
EXPORT_SYMBOL(__bio_clone);
|
||||||
|
|
|
@ -111,7 +111,6 @@ struct bio {
|
||||||
void *bi_private;
|
void *bi_private;
|
||||||
|
|
||||||
bio_destructor_t *bi_destructor; /* destructor */
|
bio_destructor_t *bi_destructor; /* destructor */
|
||||||
struct bio_set *bi_set; /* memory pools set */
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -280,6 +279,7 @@ extern void bioset_free(struct bio_set *);
|
||||||
extern struct bio *bio_alloc(unsigned int __nocast, int);
|
extern struct bio *bio_alloc(unsigned int __nocast, int);
|
||||||
extern struct bio *bio_alloc_bioset(unsigned int __nocast, int, struct bio_set *);
|
extern struct bio *bio_alloc_bioset(unsigned int __nocast, int, struct bio_set *);
|
||||||
extern void bio_put(struct bio *);
|
extern void bio_put(struct bio *);
|
||||||
|
extern void bio_free(struct bio *, struct bio_set *);
|
||||||
|
|
||||||
extern void bio_endio(struct bio *, unsigned int, int);
|
extern void bio_endio(struct bio *, unsigned int, int);
|
||||||
struct request_queue;
|
struct request_queue;
|
||||||
|
|
Loading…
Reference in a new issue