* [PATCH] kill bio->bi_set
@ 2005-07-20 22:29 Jens Axboe
2005-07-23 19:58 ` Peter Osterlund
0 siblings, 1 reply; 5+ messages in thread
From: Jens Axboe @ 2005-07-20 22:29 UTC (permalink / raw)
To: linux-kernel; +Cc: Andrew Morton, dmo
Hi,
Dunno why I didn't notice before, but ->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.
Signed-off-by: Jens Axboe <axboe@suse.de>
diff --git a/drivers/md/dm-io.c b/drivers/md/dm-io.c
--- a/drivers/md/dm-io.c
+++ b/drivers/md/dm-io.c
@@ -239,6 +239,11 @@ static void vm_dp_init(struct dpages *dp
dp->context_ptr = data;
}
+static void dm_bio_destructor(struct bio *bio)
+{
+ bio_free(bio, _bios);
+}
+
/*-----------------------------------------------------------------
* IO routines that accept a list of pages.
*---------------------------------------------------------------*/
@@ -263,6 +268,7 @@ static void do_region(int rw, unsigned i
bio->bi_bdev = where->bdev;
bio->bi_end_io = endio;
bio->bi_private = io;
+ bio->bi_destructor = dm_bio_destructor;
bio_set_region(bio, region);
/*
diff --git a/fs/bio.c b/fs/bio.c
--- a/fs/bio.c
+++ b/fs/bio.c
@@ -104,18 +104,22 @@ static inline struct bio_vec *bvec_alloc
return bvl;
}
-/*
- * default destructor for a bio allocated with bio_alloc_bioset()
- */
-static void bio_destructor(struct bio *bio)
+void bio_free(struct bio *bio, struct bio_set *bio_set)
{
const int pool_idx = BIO_POOL_IDX(bio);
- struct bio_set *bs = bio->bi_set;
BIO_BUG_ON(pool_idx >= BIOVEC_NR_POOLS);
- mempool_free(bio->bi_io_vec, bs->bvec_pools[pool_idx]);
- mempool_free(bio, bs->bio_pool);
+ mempool_free(bio->bi_io_vec, fs_bio_set->bvec_pools[pool_idx]);
+ mempool_free(bio, fs_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)
@@ -171,8 +175,6 @@ struct bio *bio_alloc_bioset(unsigned in
bio->bi_max_vecs = bvec_slabs[idx].nr_vecs;
}
bio->bi_io_vec = bvl;
- bio->bi_destructor = bio_destructor;
- bio->bi_set = bs;
}
out:
return bio;
@@ -180,7 +182,12 @@ out:
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)
@@ -1078,6 +1085,7 @@ subsys_initcall(init_bio);
EXPORT_SYMBOL(bio_alloc);
EXPORT_SYMBOL(bio_put);
+EXPORT_SYMBOL(bio_free);
EXPORT_SYMBOL(bio_endio);
EXPORT_SYMBOL(bio_init);
EXPORT_SYMBOL(__bio_clone);
diff --git a/include/linux/bio.h b/include/linux/bio.h
--- a/include/linux/bio.h
+++ b/include/linux/bio.h
@@ -111,7 +111,6 @@ struct bio {
void *bi_private;
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_bioset(unsigned int __nocast, int, struct bio_set *);
extern void bio_put(struct bio *);
+extern void bio_free(struct bio *, struct bio_set *);
extern void bio_endio(struct bio *, unsigned int, int);
struct request_queue;
--
Jens Axboe
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH] kill bio->bi_set
2005-07-20 22:29 [PATCH] kill bio->bi_set Jens Axboe
@ 2005-07-23 19:58 ` Peter Osterlund
2005-07-23 20:59 ` Jens Axboe
0 siblings, 1 reply; 5+ messages in thread
From: Peter Osterlund @ 2005-07-23 19:58 UTC (permalink / raw)
To: Jens Axboe; +Cc: linux-kernel, Andrew Morton, dmo
Jens Axboe <axboe@suse.de> writes:
> Dunno why I didn't notice before, but ->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.
This causes crashes on my computer.
> +void bio_free(struct bio *bio, struct bio_set *bio_set)
> {
> const int pool_idx = BIO_POOL_IDX(bio);
> - struct bio_set *bs = bio->bi_set;
>
> BIO_BUG_ON(pool_idx >= BIOVEC_NR_POOLS);
>
> - mempool_free(bio->bi_io_vec, bs->bvec_pools[pool_idx]);
> - mempool_free(bio, bs->bio_pool);
> + mempool_free(bio->bi_io_vec, fs_bio_set->bvec_pools[pool_idx]);
> + mempool_free(bio, fs_bio_set->bio_pool);
> +}
This function uses fs_bio_set instead of the function parameter
bio_set.
> @@ -171,8 +175,6 @@ struct bio *bio_alloc_bioset(unsigned in
> bio->bi_max_vecs = bvec_slabs[idx].nr_vecs;
> }
> bio->bi_io_vec = bvl;
> - bio->bi_destructor = bio_destructor;
> - bio->bi_set = bs;
> }
This change means that all code that calls bio_alloc_bioset() must now
set bi_destructor, but this is forgotten in bio_clone() in bio.c and
in split_bvec() in dm.c.
--
Peter Osterlund - petero2@telia.com
http://web.telia.com/~u89404340
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH] kill bio->bi_set
2005-07-23 19:58 ` Peter Osterlund
@ 2005-07-23 20:59 ` Jens Axboe
2005-07-26 0:03 ` Peter Osterlund
0 siblings, 1 reply; 5+ messages in thread
From: Jens Axboe @ 2005-07-23 20:59 UTC (permalink / raw)
To: Peter Osterlund; +Cc: linux-kernel, Andrew Morton, dmo
On Sat, Jul 23 2005, Peter Osterlund wrote:
> Jens Axboe <axboe@suse.de> writes:
>
> > Dunno why I didn't notice before, but ->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.
>
> This causes crashes on my computer.
Did I neglect to mention it was untested? :)
> > +void bio_free(struct bio *bio, struct bio_set *bio_set)
> > {
> > const int pool_idx = BIO_POOL_IDX(bio);
> > - struct bio_set *bs = bio->bi_set;
> >
> > BIO_BUG_ON(pool_idx >= BIOVEC_NR_POOLS);
> >
> > - mempool_free(bio->bi_io_vec, bs->bvec_pools[pool_idx]);
> > - mempool_free(bio, bs->bio_pool);
> > + mempool_free(bio->bi_io_vec, fs_bio_set->bvec_pools[pool_idx]);
> > + mempool_free(bio, fs_bio_set->bio_pool);
> > +}
>
> This function uses fs_bio_set instead of the function parameter
> bio_set.
Clear mistake, thanks.
> > @@ -171,8 +175,6 @@ struct bio *bio_alloc_bioset(unsigned in
> > bio->bi_max_vecs = bvec_slabs[idx].nr_vecs;
> > }
> > bio->bi_io_vec = bvl;
> > - bio->bi_destructor = bio_destructor;
> > - bio->bi_set = bs;
> > }
>
> This change means that all code that calls bio_alloc_bioset() must now
Correct. The alternative was to require a destructor function passed
into bio_alloc_bioset().
> set bi_destructor, but this is forgotten in bio_clone() in bio.c and
> in split_bvec() in dm.c.
Thanks, I'll go over these and submit a fixed version.
--
Jens Axboe
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH] kill bio->bi_set
2005-07-23 20:59 ` Jens Axboe
@ 2005-07-26 0:03 ` Peter Osterlund
2005-07-26 2:16 ` Jens Axboe
0 siblings, 1 reply; 5+ messages in thread
From: Peter Osterlund @ 2005-07-26 0:03 UTC (permalink / raw)
To: Jens Axboe; +Cc: linux-kernel, Andrew Morton
Jens Axboe <axboe@suse.de> writes:
> On Sat, Jul 23 2005, Peter Osterlund wrote:
> > Jens Axboe <axboe@suse.de> writes:
> >
> > > Dunno why I didn't notice before, but ->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.
> >
> > This causes crashes on my computer.
>
> Did I neglect to mention it was untested? :)
...
> Thanks, I'll go over these and submit a fixed version.
I fixed this myself. The patch below is tested with dm-crypt on top of
pktcdvd on top of usb-storage, and worked fine in my tests.
Signed-off-by: Jens Axboe <axboe@suse.de>
Signed-off-by: Peter Osterlund <petero2@telia.com>
---
drivers/md/dm-io.c | 6 ++++++
drivers/md/dm.c | 6 ++++++
fs/bio.c | 32 +++++++++++++++++++++-----------
include/linux/bio.h | 2 +-
4 files changed, 34 insertions(+), 12 deletions(-)
diff --git a/drivers/md/dm-io.c b/drivers/md/dm-io.c
--- a/drivers/md/dm-io.c
+++ b/drivers/md/dm-io.c
@@ -239,6 +239,11 @@ static void vm_dp_init(struct dpages *dp
dp->context_ptr = data;
}
+static void dm_bio_destructor(struct bio *bio)
+{
+ bio_free(bio, _bios);
+}
+
/*-----------------------------------------------------------------
* IO routines that accept a list of pages.
*---------------------------------------------------------------*/
@@ -263,6 +268,7 @@ static void do_region(int rw, unsigned i
bio->bi_bdev = where->bdev;
bio->bi_end_io = endio;
bio->bi_private = io;
+ bio->bi_destructor = dm_bio_destructor;
bio_set_region(bio, region);
/*
diff --git a/drivers/md/dm.c b/drivers/md/dm.c
--- a/drivers/md/dm.c
+++ b/drivers/md/dm.c
@@ -399,6 +399,11 @@ struct clone_info {
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.
*/
@@ -410,6 +415,7 @@ static struct bio *split_bvec(struct bio
struct bio_vec *bv = bio->bi_io_vec + idx;
clone = bio_alloc_bioset(GFP_NOIO, 1, dm_set);
+ clone->bi_destructor = dm_bio_destructor;
*clone->bi_io_vec = *bv;
clone->bi_sector = sector;
diff --git a/fs/bio.c b/fs/bio.c
--- a/fs/bio.c
+++ b/fs/bio.c
@@ -104,18 +104,22 @@ static inline struct bio_vec *bvec_alloc
return bvl;
}
-/*
- * default destructor for a bio allocated with bio_alloc_bioset()
- */
-static void bio_destructor(struct bio *bio)
+void bio_free(struct bio *bio, struct bio_set *bio_set)
{
const int pool_idx = BIO_POOL_IDX(bio);
- struct bio_set *bs = bio->bi_set;
BIO_BUG_ON(pool_idx >= BIOVEC_NR_POOLS);
- mempool_free(bio->bi_io_vec, bs->bvec_pools[pool_idx]);
- mempool_free(bio, bs->bio_pool);
+ mempool_free(bio->bi_io_vec, bio_set->bvec_pools[pool_idx]);
+ 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)
@@ -171,8 +175,6 @@ struct bio *bio_alloc_bioset(unsigned in
bio->bi_max_vecs = bvec_slabs[idx].nr_vecs;
}
bio->bi_io_vec = bvl;
- bio->bi_destructor = bio_destructor;
- bio->bi_set = bs;
}
out:
return bio;
@@ -180,7 +182,12 @@ out:
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)
@@ -276,8 +283,10 @@ struct bio *bio_clone(struct bio *bio, u
{
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);
+ }
return b;
}
@@ -1078,6 +1087,7 @@ subsys_initcall(init_bio);
EXPORT_SYMBOL(bio_alloc);
EXPORT_SYMBOL(bio_put);
+EXPORT_SYMBOL(bio_free);
EXPORT_SYMBOL(bio_endio);
EXPORT_SYMBOL(bio_init);
EXPORT_SYMBOL(__bio_clone);
diff --git a/include/linux/bio.h b/include/linux/bio.h
--- a/include/linux/bio.h
+++ b/include/linux/bio.h
@@ -111,7 +111,6 @@ struct bio {
void *bi_private;
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_bioset(unsigned int __nocast, int, struct bio_set *);
extern void bio_put(struct bio *);
+extern void bio_free(struct bio *, struct bio_set *);
extern void bio_endio(struct bio *, unsigned int, int);
struct request_queue;
--
Peter Osterlund - petero2@telia.com
http://web.telia.com/~u89404340
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH] kill bio->bi_set
2005-07-26 0:03 ` Peter Osterlund
@ 2005-07-26 2:16 ` Jens Axboe
0 siblings, 0 replies; 5+ messages in thread
From: Jens Axboe @ 2005-07-26 2:16 UTC (permalink / raw)
To: Peter Osterlund; +Cc: linux-kernel, Andrew Morton
On Tue, Jul 26 2005, Peter Osterlund wrote:
> Jens Axboe <axboe@suse.de> writes:
>
> > On Sat, Jul 23 2005, Peter Osterlund wrote:
> > > Jens Axboe <axboe@suse.de> writes:
> > >
> > > > Dunno why I didn't notice before, but ->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.
> > >
> > > This causes crashes on my computer.
> >
> > Did I neglect to mention it was untested? :)
> ...
> > Thanks, I'll go over these and submit a fixed version.
>
> I fixed this myself. The patch below is tested with dm-crypt on top of
> pktcdvd on top of usb-storage, and worked fine in my tests.
Thanks! I was travelling, so I didn't get to it myself.
--
Jens Axboe
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2005-07-26 7:20 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2005-07-20 22:29 [PATCH] kill bio->bi_set Jens Axboe
2005-07-23 19:58 ` Peter Osterlund
2005-07-23 20:59 ` Jens Axboe
2005-07-26 0:03 ` Peter Osterlund
2005-07-26 2:16 ` Jens Axboe
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox