Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

[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>

authored by

Peter Osterlund and committed by
Linus Torvalds
3676347a 6f00df24

+34 -12
+6
drivers/md/dm-io.c
··· 239 239 dp->context_ptr = data; 240 240 } 241 241 242 + static void dm_bio_destructor(struct bio *bio) 243 + { 244 + bio_free(bio, _bios); 245 + } 246 + 242 247 /*----------------------------------------------------------------- 243 248 * IO routines that accept a list of pages. 244 249 *---------------------------------------------------------------*/ ··· 268 263 bio->bi_bdev = where->bdev; 269 264 bio->bi_end_io = endio; 270 265 bio->bi_private = io; 266 + bio->bi_destructor = dm_bio_destructor; 271 267 bio_set_region(bio, region); 272 268 273 269 /*
+6
drivers/md/dm.c
··· 399 399 unsigned short idx; 400 400 }; 401 401 402 + static void dm_bio_destructor(struct bio *bio) 403 + { 404 + bio_free(bio, dm_set); 405 + } 406 + 402 407 /* 403 408 * Creates a little bio that is just does part of a bvec. 404 409 */ ··· 415 410 struct bio_vec *bv = bio->bi_io_vec + idx; 416 411 417 412 clone = bio_alloc_bioset(GFP_NOIO, 1, dm_set); 413 + clone->bi_destructor = dm_bio_destructor; 418 414 *clone->bi_io_vec = *bv; 419 415 420 416 clone->bi_sector = sector;
+21 -11
fs/bio.c
··· 104 104 return bvl; 105 105 } 106 106 107 - /* 108 - * default destructor for a bio allocated with bio_alloc_bioset() 109 - */ 110 - static void bio_destructor(struct bio *bio) 107 + void bio_free(struct bio *bio, struct bio_set *bio_set) 111 108 { 112 109 const int pool_idx = BIO_POOL_IDX(bio); 113 - struct bio_set *bs = bio->bi_set; 114 110 115 111 BIO_BUG_ON(pool_idx >= BIOVEC_NR_POOLS); 116 112 117 - mempool_free(bio->bi_io_vec, bs->bvec_pools[pool_idx]); 118 - mempool_free(bio, bs->bio_pool); 113 + mempool_free(bio->bi_io_vec, bio_set->bvec_pools[pool_idx]); 114 + mempool_free(bio, bio_set->bio_pool); 115 + } 116 + 117 + /* 118 + * default destructor for a bio allocated with bio_alloc_bioset() 119 + */ 120 + static void bio_fs_destructor(struct bio *bio) 121 + { 122 + bio_free(bio, fs_bio_set); 119 123 } 120 124 121 125 inline void bio_init(struct bio *bio) ··· 175 171 bio->bi_max_vecs = bvec_slabs[idx].nr_vecs; 176 172 } 177 173 bio->bi_io_vec = bvl; 178 - bio->bi_destructor = bio_destructor; 179 - bio->bi_set = bs; 180 174 } 181 175 out: 182 176 return bio; ··· 182 180 183 181 struct bio *bio_alloc(unsigned int __nocast gfp_mask, int nr_iovecs) 184 182 { 185 - return bio_alloc_bioset(gfp_mask, nr_iovecs, fs_bio_set); 183 + struct bio *bio = bio_alloc_bioset(gfp_mask, nr_iovecs, fs_bio_set); 184 + 185 + if (bio) 186 + bio->bi_destructor = bio_fs_destructor; 187 + 188 + return bio; 186 189 } 187 190 188 191 void zero_fill_bio(struct bio *bio) ··· 280 273 { 281 274 struct bio *b = bio_alloc_bioset(gfp_mask, bio->bi_max_vecs, fs_bio_set); 282 275 283 - if (b) 276 + if (b) { 277 + b->bi_destructor = bio_fs_destructor; 284 278 __bio_clone(b, bio); 279 + } 285 280 286 281 return b; 287 282 } ··· 1084 1075 1085 1076 EXPORT_SYMBOL(bio_alloc); 1086 1077 EXPORT_SYMBOL(bio_put); 1078 + EXPORT_SYMBOL(bio_free); 1087 1079 EXPORT_SYMBOL(bio_endio); 1088 1080 EXPORT_SYMBOL(bio_init); 1089 1081 EXPORT_SYMBOL(__bio_clone);
+1 -1
include/linux/bio.h
··· 111 111 void *bi_private; 112 112 113 113 bio_destructor_t *bi_destructor; /* destructor */ 114 - struct bio_set *bi_set; /* memory pools set */ 115 114 }; 116 115 117 116 /* ··· 279 280 extern struct bio *bio_alloc(unsigned int __nocast, int); 280 281 extern struct bio *bio_alloc_bioset(unsigned int __nocast, int, struct bio_set *); 281 282 extern void bio_put(struct bio *); 283 + extern void bio_free(struct bio *, struct bio_set *); 282 284 283 285 extern void bio_endio(struct bio *, unsigned int, int); 284 286 struct request_queue;