Skip to content

Commit 29dec90

Browse files
Christoph HellwigMike Snitzer
authored andcommitted
dm: fix bio_set allocation
The use of bioset_init_from_src mean that the pre-allocated pools weren't used for anything except parameter passing, and the integrity pool creation got completely lost for the actual live mapped_device. Fix that by assigning the actual preallocated dm_md_mempools to the mapped_device and using that for I/O instead of creating new mempools. Fixes: 2a2a4c5 ("dm: use bioset_init_from_src() to copy bio_set") Signed-off-by: Christoph Hellwig <[email protected]> Signed-off-by: Mike Snitzer <[email protected]>
1 parent f2906aa commit 29dec90

File tree

5 files changed

+35
-75
lines changed

5 files changed

+35
-75
lines changed

drivers/md/dm-core.h

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,14 @@ struct dm_kobject_holder {
3333
* access their members!
3434
*/
3535

36+
/*
37+
* For mempools pre-allocation at the table loading time.
38+
*/
39+
struct dm_md_mempools {
40+
struct bio_set bs;
41+
struct bio_set io_bs;
42+
};
43+
3644
struct mapped_device {
3745
struct mutex suspend_lock;
3846

@@ -110,8 +118,7 @@ struct mapped_device {
110118
/*
111119
* io objects are allocated from here.
112120
*/
113-
struct bio_set io_bs;
114-
struct bio_set bs;
121+
struct dm_md_mempools *mempools;
115122

116123
/* kobject and completion */
117124
struct dm_kobject_holder kobj_holder;

drivers/md/dm-rq.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -319,7 +319,7 @@ static int setup_clone(struct request *clone, struct request *rq,
319319
{
320320
int r;
321321

322-
r = blk_rq_prep_clone(clone, rq, &tio->md->bs, gfp_mask,
322+
r = blk_rq_prep_clone(clone, rq, &tio->md->mempools->bs, gfp_mask,
323323
dm_rq_bio_constructor, tio);
324324
if (r)
325325
return r;

drivers/md/dm-table.c

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1038,17 +1038,6 @@ static int dm_table_alloc_md_mempools(struct dm_table *t, struct mapped_device *
10381038
return 0;
10391039
}
10401040

1041-
void dm_table_free_md_mempools(struct dm_table *t)
1042-
{
1043-
dm_free_md_mempools(t->mempools);
1044-
t->mempools = NULL;
1045-
}
1046-
1047-
struct dm_md_mempools *dm_table_get_md_mempools(struct dm_table *t)
1048-
{
1049-
return t->mempools;
1050-
}
1051-
10521041
static int setup_indexes(struct dm_table *t)
10531042
{
10541043
int i;

drivers/md/dm.c

Lines changed: 25 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -136,14 +136,6 @@ static int get_swap_bios(void)
136136
return latch;
137137
}
138138

139-
/*
140-
* For mempools pre-allocation at the table loading time.
141-
*/
142-
struct dm_md_mempools {
143-
struct bio_set bs;
144-
struct bio_set io_bs;
145-
};
146-
147139
struct table_device {
148140
struct list_head list;
149141
refcount_t count;
@@ -581,7 +573,7 @@ static struct dm_io *alloc_io(struct mapped_device *md, struct bio *bio)
581573
struct dm_target_io *tio;
582574
struct bio *clone;
583575

584-
clone = bio_alloc_clone(NULL, bio, GFP_NOIO, &md->io_bs);
576+
clone = bio_alloc_clone(NULL, bio, GFP_NOIO, &md->mempools->io_bs);
585577
/* Set default bdev, but target must bio_set_dev() before issuing IO */
586578
clone->bi_bdev = md->disk->part0;
587579

@@ -628,7 +620,8 @@ static struct bio *alloc_tio(struct clone_info *ci, struct dm_target *ti,
628620
} else {
629621
struct mapped_device *md = ci->io->md;
630622

631-
clone = bio_alloc_clone(NULL, ci->bio, gfp_mask, &md->bs);
623+
clone = bio_alloc_clone(NULL, ci->bio, gfp_mask,
624+
&md->mempools->bs);
632625
if (!clone)
633626
return NULL;
634627
/* Set default bdev, but target must bio_set_dev() before issuing IO */
@@ -1876,8 +1869,7 @@ static void cleanup_mapped_device(struct mapped_device *md)
18761869
{
18771870
if (md->wq)
18781871
destroy_workqueue(md->wq);
1879-
bioset_exit(&md->bs);
1880-
bioset_exit(&md->io_bs);
1872+
dm_free_md_mempools(md->mempools);
18811873

18821874
if (md->dax_dev) {
18831875
dax_remove_host(md->disk);
@@ -2049,48 +2041,6 @@ static void free_dev(struct mapped_device *md)
20492041
kvfree(md);
20502042
}
20512043

2052-
static int __bind_mempools(struct mapped_device *md, struct dm_table *t)
2053-
{
2054-
struct dm_md_mempools *p = dm_table_get_md_mempools(t);
2055-
int ret = 0;
2056-
2057-
if (dm_table_bio_based(t)) {
2058-
/*
2059-
* The md may already have mempools that need changing.
2060-
* If so, reload bioset because front_pad may have changed
2061-
* because a different table was loaded.
2062-
*/
2063-
bioset_exit(&md->bs);
2064-
bioset_exit(&md->io_bs);
2065-
2066-
} else if (bioset_initialized(&md->bs)) {
2067-
/*
2068-
* There's no need to reload with request-based dm
2069-
* because the size of front_pad doesn't change.
2070-
* Note for future: If you are to reload bioset,
2071-
* prep-ed requests in the queue may refer
2072-
* to bio from the old bioset, so you must walk
2073-
* through the queue to unprep.
2074-
*/
2075-
goto out;
2076-
}
2077-
2078-
BUG_ON(!p ||
2079-
bioset_initialized(&md->bs) ||
2080-
bioset_initialized(&md->io_bs));
2081-
2082-
ret = bioset_init_from_src(&md->bs, &p->bs);
2083-
if (ret)
2084-
goto out;
2085-
ret = bioset_init_from_src(&md->io_bs, &p->io_bs);
2086-
if (ret)
2087-
bioset_exit(&md->bs);
2088-
out:
2089-
/* mempool bind completed, no longer need any mempools in the table */
2090-
dm_table_free_md_mempools(t);
2091-
return ret;
2092-
}
2093-
20942044
/*
20952045
* Bind a table to the device.
20962046
*/
@@ -2144,12 +2094,28 @@ static struct dm_table *__bind(struct mapped_device *md, struct dm_table *t,
21442094
* immutable singletons - used to optimize dm_mq_queue_rq.
21452095
*/
21462096
md->immutable_target = dm_table_get_immutable_target(t);
2147-
}
21482097

2149-
ret = __bind_mempools(md, t);
2150-
if (ret) {
2151-
old_map = ERR_PTR(ret);
2152-
goto out;
2098+
/*
2099+
* There is no need to reload with request-based dm because the
2100+
* size of front_pad doesn't change.
2101+
*
2102+
* Note for future: If you are to reload bioset, prep-ed
2103+
* requests in the queue may refer to bio from the old bioset,
2104+
* so you must walk through the queue to unprep.
2105+
*/
2106+
if (!md->mempools) {
2107+
md->mempools = t->mempools;
2108+
t->mempools = NULL;
2109+
}
2110+
} else {
2111+
/*
2112+
* The md may already have mempools that need changing.
2113+
* If so, reload bioset because front_pad may have changed
2114+
* because a different table was loaded.
2115+
*/
2116+
dm_free_md_mempools(md->mempools);
2117+
md->mempools = t->mempools;
2118+
t->mempools = NULL;
21532119
}
21542120

21552121
ret = dm_table_set_restrictions(t, md->queue, limits);

drivers/md/dm.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,8 +71,6 @@ struct dm_target *dm_table_get_immutable_target(struct dm_table *t);
7171
struct dm_target *dm_table_get_wildcard_target(struct dm_table *t);
7272
bool dm_table_bio_based(struct dm_table *t);
7373
bool dm_table_request_based(struct dm_table *t);
74-
void dm_table_free_md_mempools(struct dm_table *t);
75-
struct dm_md_mempools *dm_table_get_md_mempools(struct dm_table *t);
7674

7775
void dm_lock_md_type(struct mapped_device *md);
7876
void dm_unlock_md_type(struct mapped_device *md);

0 commit comments

Comments
 (0)