linux-block.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Yang Erkun <yangerkun@huawei.com>
To: josef@toxicpanda.com, axboe@kernel.dk, hch@lst.de, yukuai@kernel.org
Cc: yi.zhang@huawei.com, chengzhihao1@huawei.com,
	echo.chenlin@huawei.com, leo.lilong@huaweicloud.com,
	wangkefeng.wang@huawei.com, huawei.libin@huawei.com,
	leijitang@huawei.com, linux-block@vger.kernel.org,
	nbd@other.debian.org
Subject: [PATCH v5 7/8] nbd: remove queue freeze for newly created nbd from netlink path
Date: Thu, 30 Jul 2026 16:20:45 +0800	[thread overview]
Message-ID: <20260730082046.3459239-8-yangerkun@huawei.com> (raw)
In-Reply-To: <20260730082046.3459239-1-yangerkun@huawei.com>

Previous commits has removed the queue freeze in nbd_add_socket and
nbd_set_size during nbd device setup. However, a queue freeze can still
occur when nbd_start_device calls blk_mq_update_nr_hw_queues if the
socket connection count does not match nbd->tag_set->nr_hw_queues.

The nbd_start_device function can be invoked through either the ioctl or
netlink paths. The ioctl path only allows reusing an existing inactivate
nbd device, there is nothing more we can do to prevent the queue freeze
since the old nbd->tag_set->nr_hw_queues may not match the new socket
connection count. Similarly, the netlink path can reuse a preferred
inactivate nbd device, and again, we cannot do more in this scenario.
However, the netlink path can also add a new nbd device using
nbd_dev_add. In this case, we can obtain the new number of socket
connections, and by adding a new argument representing the expected
nr_hw_queues in nbd_dev_add, we can ensure the queue freeze is avoided
for this situation.

Signed-off-by: Yang Erkun <yangerkun@huawei.com>
---
 drivers/block/nbd.c | 13 +++++++++----
 1 file changed, 9 insertions(+), 4 deletions(-)

diff --git a/drivers/block/nbd.c b/drivers/block/nbd.c
index 34b84fc1c61f..6369a409e10c 100644
--- a/drivers/block/nbd.c
+++ b/drivers/block/nbd.c
@@ -1942,7 +1942,8 @@ static const struct blk_mq_ops nbd_mq_ops = {
 	.timeout	= nbd_xmit_timeout,
 };
 
-static struct nbd_device *nbd_dev_add(int index, unsigned int refs)
+static struct nbd_device *nbd_dev_add(int index, unsigned int refs,
+				       int nr_hw_queues)
 {
 	struct queue_limits lim = {
 		.max_hw_sectors		= 65536,
@@ -1959,7 +1960,7 @@ static struct nbd_device *nbd_dev_add(int index, unsigned int refs)
 		goto out;
 
 	nbd->tag_set.ops = &nbd_mq_ops;
-	nbd->tag_set.nr_hw_queues = 1;
+	nbd->tag_set.nr_hw_queues = nr_hw_queues;
 	nbd->tag_set.queue_depth = 128;
 	nbd->tag_set.numa_node = NUMA_NO_NODE;
 	nbd->tag_set.cmd_size = sizeof(struct nbd_cmd);
@@ -2212,7 +2213,11 @@ static int nbd_genl_connect(struct sk_buff *skb, struct genl_info *info)
 	mutex_unlock(&nbd_index_mutex);
 
 	if (!nbd) {
-		nbd = nbd_dev_add(index, 2);
+		ret = nbd_genl_foreach_sock(info, NULL, NULL);
+		if (ret < 0)
+			return ret;
+
+		nbd = nbd_dev_add(index, 2, ret > 0 ? ret : 1);
 		if (IS_ERR(nbd)) {
 			pr_err("failed to add new device\n");
 			return PTR_ERR(nbd);
@@ -2736,7 +2741,7 @@ static int __init nbd_init(void)
 	nbd_dbg_init();
 
 	for (i = 0; i < nbds_max; i++)
-		nbd_dev_add(i, 1);
+		nbd_dev_add(i, 1, 1);
 	return 0;
 }
 
-- 
2.52.0


  parent reply	other threads:[~2026-07-30  8:30 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-07-30  8:20 [PATCH v5 0/8] nbd: eliminate queue freeze/unfreeze overhead in connection setup Yang Erkun
2026-07-30  8:20 ` [PATCH v5 1/8] nbd: simplify find_fallback() by removing redundant logic Yang Erkun
2026-07-30  8:20 ` [PATCH v5 2/8] nbd: disallow NBD_SET_SOCK on an active device Yang Erkun
2026-07-30  8:20 ` [PATCH v5 3/8] nbd: reset write cache on disconnect Yang Erkun
2026-07-30  8:20 ` [PATCH v5 4/8] nbd: remove queue freeze in nbd_add_socket Yang Erkun
2026-07-30  8:20 ` [PATCH v5 5/8] nbd: skip queue freeze when setting size at device startup Yang Erkun
2026-07-30  8:20 ` [PATCH v5 6/8] nbd: factor out a nbd_genl_foreach_sock Yang Erkun
2026-07-30  8:20 ` Yang Erkun [this message]
2026-07-30  8:20 ` [PATCH v5 8/8] nbd: add nr_hw_queues module parameter for pre-created devices Yang Erkun

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20260730082046.3459239-8-yangerkun@huawei.com \
    --to=yangerkun@huawei.com \
    --cc=axboe@kernel.dk \
    --cc=chengzhihao1@huawei.com \
    --cc=echo.chenlin@huawei.com \
    --cc=hch@lst.de \
    --cc=huawei.libin@huawei.com \
    --cc=josef@toxicpanda.com \
    --cc=leijitang@huawei.com \
    --cc=leo.lilong@huaweicloud.com \
    --cc=linux-block@vger.kernel.org \
    --cc=nbd@other.debian.org \
    --cc=wangkefeng.wang@huawei.com \
    --cc=yi.zhang@huawei.com \
    --cc=yukuai@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).