dm: make nr_requests tunable Make it possible to change the value nr_requests for device mapper devices. Signed-off-by: Mikulas Patocka --- block/blk-sysfs.c | 9 +++++++-- drivers/md/dm.c | 12 +++++++++++- include/linux/blkdev.h | 1 + 3 files changed, 19 insertions(+), 3 deletions(-) Index: linux-3.17/drivers/md/dm.c =================================================================== --- linux-3.17.orig/drivers/md/dm.c 2014-10-10 20:26:00.000000000 +0200 +++ linux-3.17/drivers/md/dm.c 2014-10-10 20:26:12.000000000 +0200 @@ -226,6 +226,11 @@ static struct kmem_cache *_rq_tio_cache; static unsigned reserved_bio_based_ios = RESERVED_BIO_BASED_IOS; /* + * nr_requests limit for newly created devices. + */ +static unsigned default_nr_requests = DEFAULT_NR_REQUESTS; + +/* * Request-based DM's mempools' reserved IOs set by the user. */ static unsigned reserved_rq_based_ios = RESERVED_REQUEST_BASED_IOS; @@ -2000,7 +2005,9 @@ static void dm_init_md_queue(struct mapp blk_queue_make_request(md->queue, dm_request); blk_queue_bounce_limit(md->queue, BLK_BOUNCE_ANY); blk_queue_merge_bvec(md->queue, dm_merge_bvec); - md->queue->nr_requests = DEFAULT_NR_REQUESTS; + + md->queue->nr_requests = max(default_nr_requests, (unsigned)BLKDEV_MIN_RQ); + queue_flag_set_unlocked(QUEUE_FLAG_NR_REQUESTS, md->queue); } /* @@ -3040,6 +3047,9 @@ MODULE_PARM_DESC(reserved_bio_based_ios, module_param(reserved_rq_based_ios, uint, S_IRUGO | S_IWUSR); MODULE_PARM_DESC(reserved_rq_based_ios, "Reserved IOs in request-based mempools"); +module_param(default_nr_requests, uint, S_IRUGO | S_IWUSR); +MODULE_PARM_DESC(default_nr_requests, "Default limit of in-flight I/Os"); + MODULE_DESCRIPTION(DM_NAME " driver"); MODULE_AUTHOR("Joe Thornber "); MODULE_LICENSE("GPL"); Index: linux-3.17/include/linux/blkdev.h =================================================================== --- linux-3.17.orig/include/linux/blkdev.h 2014-10-10 20:25:54.000000000 +0200 +++ linux-3.17/include/linux/blkdev.h 2014-10-10 20:26:12.000000000 +0200 @@ -517,6 +517,7 @@ struct request_queue { #define QUEUE_FLAG_NO_SG_MERGE 21 /* don't attempt to merge SG segments*/ #define QUEUE_FLAG_SG_GAPS 22 /* queue doesn't support SG gaps */ #define QUEUE_FLAG_NO_IO_COUNT 23 /* don't increase io request count */ +#define QUEUE_FLAG_NR_REQUESTS 24 /* allow to set nr_requests */ #define QUEUE_FLAG_DEFAULT ((1 << QUEUE_FLAG_IO_STAT) | \ (1 << QUEUE_FLAG_STACKABLE) | \ Index: linux-3.17/block/blk-sysfs.c =================================================================== --- linux-3.17.orig/block/blk-sysfs.c 2014-10-10 20:25:54.000000000 +0200 +++ linux-3.17/block/blk-sysfs.c 2014-10-10 20:26:12.000000000 +0200 @@ -51,7 +51,8 @@ queue_requests_store(struct request_queu unsigned long nr; int ret, err; - if (!q->request_fn && !q->mq_ops) + if (!q->request_fn && !q->mq_ops && + !test_bit(QUEUE_FLAG_NR_REQUESTS, &q->queue_flags)) return -EINVAL; ret = queue_var_store(&nr, page, count); @@ -63,8 +64,12 @@ queue_requests_store(struct request_queu if (q->request_fn) err = blk_update_nr_requests(q, nr); - else + else if (q->mq_ops) err = blk_mq_update_nr_requests(q, nr); + else { + q->nr_requests = nr; + err = 0; + } if (err) return err;