diff --git a/drivers/block/nbd.c b/drivers/block/nbd.c index 6c4aa19ea11a..ffce519bf008 100644 --- a/drivers/block/nbd.c +++ b/drivers/block/nbd.c @@ -166,6 +166,7 @@ static struct dentry *nbd_dbg_dir; static unsigned int nbds_max = 16; static int max_part = 16; +static int pre_defined_connections = 1; static int part_shift; static int nbd_dev_dbg_init(struct nbd_device *nbd); @@ -2712,6 +2713,12 @@ static int __init nbd_init(void) if (nbds_max > 1UL << (MINORBITS - part_shift)) return -EINVAL; + /* An excessively large value will be adjusted in blk_mq_alloc_tag_set */ + if (pre_defined_connections < 1) { + pr_err("pre_defined_connections must be >= 1\n"); + return -EINVAL; + } + if (register_blkdev(NBD_MAJOR, "nbd")) return -EIO; @@ -2728,8 +2735,12 @@ static int __init nbd_init(void) } nbd_dbg_init(); + /* + * Set to the intended connection count so nbd_start_device() can skip + * the queue-freezing blk_mq_update_nr_hw_queues() call. + */ for (i = 0; i < nbds_max; i++) - nbd_dev_add(i, 1, 1); + nbd_dev_add(i, 1, pre_defined_connections); return 0; } @@ -2790,3 +2801,6 @@ module_param(nbds_max, int, 0444); MODULE_PARM_DESC(nbds_max, "number of network block devices to initialize (default: 16)"); module_param(max_part, int, 0444); MODULE_PARM_DESC(max_part, "number of partitions per device (default: 16)"); +module_param(pre_defined_connections, int, 0444); +MODULE_PARM_DESC(pre_defined_connections, +"number of connections for devices pre-created at module load (default: 1)");