dm bio prison: pass cell memory in
Change the dm_bio_prison interface so that instead of allocating memory internally, dm_bio_detain is supplied with a pre-allocated cell each time it is called. This enables a subsequent patch to move the allocation of the struct dm_bio_prison_cell outside the thin target's mapping function so it can no longer block there. Signed-off-by: Joe Thornber <ejt@redhat.com> Signed-off-by: Alasdair G Kergon <agk@redhat.com>
This commit is contained in:

committed by
Alasdair G Kergon

parent
4e7f1f9089
commit
6beca5eb6e
@@ -35,17 +35,36 @@ struct dm_bio_prison *dm_bio_prison_create(unsigned nr_cells);
|
||||
void dm_bio_prison_destroy(struct dm_bio_prison *prison);
|
||||
|
||||
/*
|
||||
* This may block if a new cell needs allocating. You must ensure that
|
||||
* cells will be unlocked even if the calling thread is blocked.
|
||||
* These two functions just wrap a mempool. This is a transitory step:
|
||||
* Eventually all bio prison clients should manage their own cell memory.
|
||||
*
|
||||
* Like mempool_alloc(), dm_bio_prison_alloc_cell() can only fail if called
|
||||
* in interrupt context or passed GFP_NOWAIT.
|
||||
*/
|
||||
struct dm_bio_prison_cell *dm_bio_prison_alloc_cell(struct dm_bio_prison *prison,
|
||||
gfp_t gfp);
|
||||
void dm_bio_prison_free_cell(struct dm_bio_prison *prison,
|
||||
struct dm_bio_prison_cell *cell);
|
||||
|
||||
/*
|
||||
* An atomic op that combines retrieving a cell, and adding a bio to it.
|
||||
*
|
||||
* Returns 1 if the cell was already held, 0 if @inmate is the new holder.
|
||||
*/
|
||||
int dm_bio_detain(struct dm_bio_prison *prison, struct dm_cell_key *key,
|
||||
struct bio *inmate, struct dm_bio_prison_cell **ref);
|
||||
int dm_bio_detain(struct dm_bio_prison *prison,
|
||||
struct dm_cell_key *key,
|
||||
struct bio *inmate,
|
||||
struct dm_bio_prison_cell *cell_prealloc,
|
||||
struct dm_bio_prison_cell **cell_result);
|
||||
|
||||
void dm_cell_release(struct dm_bio_prison_cell *cell, struct bio_list *bios);
|
||||
void dm_cell_release_no_holder(struct dm_bio_prison_cell *cell, struct bio_list *inmates);
|
||||
void dm_cell_error(struct dm_bio_prison_cell *cell);
|
||||
void dm_cell_release(struct dm_bio_prison *prison,
|
||||
struct dm_bio_prison_cell *cell,
|
||||
struct bio_list *bios);
|
||||
void dm_cell_release_no_holder(struct dm_bio_prison *prison,
|
||||
struct dm_bio_prison_cell *cell,
|
||||
struct bio_list *inmates);
|
||||
void dm_cell_error(struct dm_bio_prison *prison,
|
||||
struct dm_bio_prison_cell *cell);
|
||||
|
||||
/*----------------------------------------------------------------*/
|
||||
|
||||
|
Reference in New Issue
Block a user