Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 333243
b: refs/heads/master
c: 4254bba
h: refs/heads/master
i:
  333241: d908db6
  333239: 5dd4af9
v: v3
  • Loading branch information
Kent Overstreet authored and Jens Axboe committed Sep 9, 2012
1 parent d664b9c commit 67d40ae
Show file tree
Hide file tree
Showing 6 changed files with 28 additions and 49 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: ccc5c9ca6aac08218b1ba52afd07a1a9864c8c5d
refs/heads/master: 4254bba17d92d53822a56ebc2a0c1eb7e2a71155
5 changes: 0 additions & 5 deletions trunk/Documentation/block/biodoc.txt
Original file line number Diff line number Diff line change
Expand Up @@ -465,7 +465,6 @@ struct bio {
bio_end_io_t *bi_end_io; /* bi_end_io (bio) */
atomic_t bi_cnt; /* pin count: free when it hits zero */
void *bi_private;
bio_destructor_t *bi_destructor; /* bi_destructor (bio) */
};

With this multipage bio design:
Expand Down Expand Up @@ -647,10 +646,6 @@ for a non-clone bio. There are the 6 pools setup for different size biovecs,
so bio_alloc(gfp_mask, nr_iovecs) will allocate a vec_list of the
given size from these slabs.

The bi_destructor() routine takes into account the possibility of the bio
having originated from a different source (see later discussions on
n/w to block transfers and kvec_cb)

The bio_get() routine may be used to hold an extra reference on a bio prior
to i/o submission, if the bio fields are likely to be accessed after the
i/o is issued (since the bio may otherwise get freed in case i/o completion
Expand Down
2 changes: 1 addition & 1 deletion trunk/block/blk-core.c
Original file line number Diff line number Diff line change
Expand Up @@ -2807,7 +2807,7 @@ int blk_rq_prep_clone(struct request *rq, struct request *rq_src,

free_and_out:
if (bio)
bio_free(bio, bs);
bio_put(bio);
blk_rq_unprep_clone(rq);

return -ENOMEM;
Expand Down
64 changes: 26 additions & 38 deletions trunk/fs/bio.c
Original file line number Diff line number Diff line change
Expand Up @@ -233,26 +233,37 @@ struct bio_vec *bvec_alloc_bs(gfp_t gfp_mask, int nr, unsigned long *idx,
return bvl;
}

void bio_free(struct bio *bio, struct bio_set *bs)
static void __bio_free(struct bio *bio)
{
void *p;

if (bio_has_allocated_vec(bio))
bvec_free_bs(bs, bio->bi_io_vec, BIO_POOL_IDX(bio));
bio_disassociate_task(bio);

if (bio_integrity(bio))
bio_integrity_free(bio);
}

/*
* If we have front padding, adjust the bio pointer before freeing
*/
p = bio;
if (bs->front_pad)
static void bio_free(struct bio *bio)
{
struct bio_set *bs = bio->bi_pool;
void *p;

__bio_free(bio);

if (bs) {
if (bio_has_allocated_vec(bio))
bvec_free_bs(bs, bio->bi_io_vec, BIO_POOL_IDX(bio));

/*
* If we have front padding, adjust the bio pointer before freeing
*/
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);
}
}
EXPORT_SYMBOL(bio_free);

void bio_init(struct bio *bio)
{
Expand All @@ -276,10 +287,7 @@ void bio_reset(struct bio *bio)
{
unsigned long flags = bio->bi_flags & (~0UL << BIO_RESET_BITS);

if (bio_integrity(bio))
bio_integrity_free(bio);

bio_disassociate_task(bio);
__bio_free(bio);

memset(bio, 0, BIO_RESET_BYTES);
bio->bi_flags = flags|(1 << BIO_UPTODATE);
Expand Down Expand Up @@ -362,13 +370,6 @@ struct bio *bio_alloc(gfp_t gfp_mask, unsigned int nr_iovecs)
}
EXPORT_SYMBOL(bio_alloc);

static void bio_kmalloc_destructor(struct bio *bio)
{
if (bio_integrity(bio))
bio_integrity_free(bio);
kfree(bio);
}

/**
* bio_kmalloc - allocate a bio for I/O using kmalloc()
* @gfp_mask: the GFP_ mask given to the slab allocator
Expand All @@ -395,7 +396,6 @@ struct bio *bio_kmalloc(gfp_t gfp_mask, unsigned int nr_iovecs)
bio->bi_flags |= BIO_POOL_NONE << BIO_POOL_OFFSET;
bio->bi_max_vecs = nr_iovecs;
bio->bi_io_vec = bio->bi_inline_vecs;
bio->bi_destructor = bio_kmalloc_destructor;

return bio;
}
Expand Down Expand Up @@ -431,20 +431,8 @@ void bio_put(struct bio *bio)
/*
* last put frees it
*/
if (atomic_dec_and_test(&bio->bi_cnt)) {
bio_disassociate_task(bio);
bio->bi_next = NULL;

/*
* This if statement is temporary - bi_pool is replacing
* bi_destructor, but bi_destructor will be taken out in another
* patch.
*/
if (bio->bi_pool)
bio_free(bio, bio->bi_pool);
else
bio->bi_destructor(bio);
}
if (atomic_dec_and_test(&bio->bi_cnt))
bio_free(bio);
}
EXPORT_SYMBOL(bio_put);

Expand Down
1 change: 0 additions & 1 deletion trunk/include/linux/bio.h
Original file line number Diff line number Diff line change
Expand Up @@ -216,7 +216,6 @@ extern struct bio *bio_alloc(gfp_t, unsigned int);
extern struct bio *bio_kmalloc(gfp_t, unsigned int);
extern struct bio *bio_alloc_bioset(gfp_t, 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 *, int);
struct request_queue;
Expand Down
3 changes: 0 additions & 3 deletions trunk/include/linux/blk_types.h
Original file line number Diff line number Diff line change
Expand Up @@ -84,11 +84,8 @@ struct bio {

struct bio_vec *bi_io_vec; /* the actual vec list */

/* If bi_pool is non NULL, bi_destructor is not called */
struct bio_set *bi_pool;

bio_destructor_t *bi_destructor; /* destructor */

/*
* We can inline a number of vecs at the end of the bio, to avoid
* double allocations for a small number of bio_vecs. This member
Expand Down

0 comments on commit 67d40ae

Please sign in to comment.