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 | 10 +++++++++- 2 files changed, 14 insertions(+), 5 deletions(-) Index: linux-4.13-rc5/drivers/md/dm.c =================================================================== --- linux-4.13-rc5.orig/drivers/md/dm.c +++ linux-4.13-rc5/drivers/md/dm.c @@ -116,6 +116,11 @@ static struct kmem_cache *_rq_cache; #define RESERVED_BIO_BASED_IOS 16 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; + static int __dm_get_module_param_int(int *module_param, int min, int max) { int param = ACCESS_ONCE(*module_param); @@ -2126,7 +2131,7 @@ int dm_setup_md_queue(struct mapped_devi case DM_TYPE_DAX_BIO_BASED: dm_init_normal_md_queue(md); blk_queue_make_request(md->queue, dm_make_request); - md->queue->nr_requests = DEFAULT_NR_REQUESTS; + md->queue->nr_requests = max(default_nr_requests, (unsigned)BLKDEV_MIN_RQ); /* * DM handles splitting bios as needed. Free the bio_split bioset * since it won't be used (saves 1 process per bio-based DM device). @@ -3081,6 +3086,9 @@ MODULE_PARM_DESC(reserved_bio_based_ios, module_param(dm_numa_node, int, S_IRUGO | S_IWUSR); MODULE_PARM_DESC(dm_numa_node, "NUMA node for DM device memory allocations"); +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-4.13-rc5/block/blk-sysfs.c =================================================================== --- linux-4.13-rc5.orig/block/blk-sysfs.c +++ linux-4.13-rc5/block/blk-sysfs.c @@ -67,9 +67,6 @@ queue_requests_store(struct request_queu unsigned long nr; int ret, err; - if (!q->request_fn && !q->mq_ops) - return -EINVAL; - ret = queue_var_store(&nr, page, count); if (ret < 0) return ret; @@ -79,8 +76,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;