Skip to content

Commit cfc97ab

Browse files
author
Mike Snitzer
committed
dm: conditionally enable BIOSET_PERCPU_CACHE for dm_io bioset
A bioset's per-cpu alloc cache may have broader utility in the future but for now constrain it to being tightly coupled to QUEUE_FLAG_POLL. Also change dm_io_complete() to use bio_clear_polled() so that it properly clears all associated bio state on requeue. This commit improves DM's hipri bio polling (REQ_POLLED) perf by 7 - 20% depending on the system. Signed-off-by: Mike Snitzer <[email protected]>
1 parent 069adba commit cfc97ab

File tree

3 files changed

+14
-9
lines changed

3 files changed

+14
-9
lines changed

drivers/md/dm-table.c

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1002,28 +1002,33 @@ bool dm_table_request_based(struct dm_table *t)
10021002
return __table_type_request_based(dm_table_get_type(t));
10031003
}
10041004

1005+
static int dm_table_supports_poll(struct dm_table *t);
1006+
10051007
static int dm_table_alloc_md_mempools(struct dm_table *t, struct mapped_device *md)
10061008
{
10071009
enum dm_queue_mode type = dm_table_get_type(t);
10081010
unsigned per_io_data_size = 0;
10091011
unsigned min_pool_size = 0;
10101012
struct dm_target *ti;
10111013
unsigned i;
1014+
bool poll_supported = false;
10121015

10131016
if (unlikely(type == DM_TYPE_NONE)) {
10141017
DMWARN("no table type is set, can't allocate mempools");
10151018
return -EINVAL;
10161019
}
10171020

1018-
if (__table_type_bio_based(type))
1021+
if (__table_type_bio_based(type)) {
10191022
for (i = 0; i < t->num_targets; i++) {
10201023
ti = t->targets + i;
10211024
per_io_data_size = max(per_io_data_size, ti->per_io_data_size);
10221025
min_pool_size = max(min_pool_size, ti->num_flush_bios);
10231026
}
1027+
poll_supported = !!dm_table_supports_poll(t);
1028+
}
10241029

1025-
t->mempools = dm_alloc_md_mempools(md, type, t->integrity_supported,
1026-
per_io_data_size, min_pool_size);
1030+
t->mempools = dm_alloc_md_mempools(md, type, per_io_data_size, min_pool_size,
1031+
t->integrity_supported, poll_supported);
10271032
if (!t->mempools)
10281033
return -ENOMEM;
10291034

drivers/md/dm.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -899,7 +899,7 @@ static void dm_io_complete(struct dm_io *io)
899899
* may only reflect a subset of the pre-split original)
900900
* so clear REQ_POLLED in case of requeue.
901901
*/
902-
bio->bi_opf &= ~REQ_POLLED;
902+
bio_clear_polled(bio);
903903
if (io_error == BLK_STS_AGAIN) {
904904
/* io_uring doesn't handle BLK_STS_AGAIN (yet) */
905905
queue_io(md, bio);
@@ -2901,8 +2901,8 @@ int dm_noflush_suspending(struct dm_target *ti)
29012901
EXPORT_SYMBOL_GPL(dm_noflush_suspending);
29022902

29032903
struct dm_md_mempools *dm_alloc_md_mempools(struct mapped_device *md, enum dm_queue_mode type,
2904-
unsigned integrity, unsigned per_io_data_size,
2905-
unsigned min_pool_size)
2904+
unsigned per_io_data_size, unsigned min_pool_size,
2905+
bool integrity, bool poll)
29062906
{
29072907
struct dm_md_mempools *pools = kzalloc_node(sizeof(*pools), GFP_KERNEL, md->numa_node_id);
29082908
unsigned int pool_size = 0;
@@ -2918,7 +2918,7 @@ struct dm_md_mempools *dm_alloc_md_mempools(struct mapped_device *md, enum dm_qu
29182918
pool_size = max(dm_get_reserved_bio_based_ios(), min_pool_size);
29192919
front_pad = roundup(per_io_data_size, __alignof__(struct dm_target_io)) + DM_TARGET_IO_BIO_OFFSET;
29202920
io_front_pad = roundup(per_io_data_size, __alignof__(struct dm_io)) + DM_IO_BIO_OFFSET;
2921-
ret = bioset_init(&pools->io_bs, pool_size, io_front_pad, 0);
2921+
ret = bioset_init(&pools->io_bs, pool_size, io_front_pad, poll ? BIOSET_PERCPU_CACHE : 0);
29222922
if (ret)
29232923
goto out;
29242924
if (integrity && bioset_integrity_create(&pools->io_bs, pool_size))

drivers/md/dm.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -221,8 +221,8 @@ void dm_kcopyd_exit(void);
221221
* Mempool operations
222222
*/
223223
struct dm_md_mempools *dm_alloc_md_mempools(struct mapped_device *md, enum dm_queue_mode type,
224-
unsigned integrity, unsigned per_bio_data_size,
225-
unsigned min_pool_size);
224+
unsigned per_io_data_size, unsigned min_pool_size,
225+
bool integrity, bool poll);
226226
void dm_free_md_mempools(struct dm_md_mempools *pools);
227227

228228
/*

0 commit comments

Comments
 (0)