From: Stanislav Fomichev <sdf.kernel@gmail.com>
To: Nilay Shroff <nilay@linux.ibm.com>
Cc: kbusch@kernel.org, hch@lst.de, hare@suse.de, sagi@grimberg.me,
chaitanyak@nvidia.com, gjoyce@linux.ibm.com, kuba@kernel.org,
davem@davemloft.net, edumazet@google.com, pabeni@redhat.com,
horms@kernel.org, linux-nvme@lists.infradead.org,
netdev@vger.kernel.org
Subject: Re: [RESEND PATCH v2 2/4] nvme-tcp: limit I/O queue count based on NIC queue count
Date: Fri, 31 Jul 2026 09:41:00 -0700 [thread overview]
Message-ID: <amzPvMWfzetiirw0@devvm7509.cco0.facebook.com> (raw)
In-Reply-To: <20260731073918.614014-3-nilay@linux.ibm.com>
On 07/31, Nilay Shroff wrote:
> NVMe-TCP currently provisions I/O queues based primarily on the number
> of online CPUs. On systems where the CPU count significantly exceeds the
> number of NIC hardware queues, multiple NVMe-TCP I/O queues end up
> sharing the same NIC TX/RX queues. This increases lock contention,
> cacheline bouncing, and inter-processor interrupts (IPIs), reducing I/O
> efficiency.
>
> Limit the number of NVMe-TCP default I/O queues to the smaller of the
> number of online CPUs and the number of NIC hardware queues. Aligning
> the number of NVMe-TCP I/O queues with the NIC queue topology reduces
> queue sharing, improves locality, and can improve throughput while
> reducing tail latency.
>
> The number of NVMe-TCP I/O queues is now limited to:
>
> min(num_online_cpus, num_nic_queues)
>
> Signed-off-by: Nilay Shroff <nilay@linux.ibm.com>
> ---
> drivers/nvme/host/tcp.c | 61 +++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 61 insertions(+)
>
> diff --git a/drivers/nvme/host/tcp.c b/drivers/nvme/host/tcp.c
> index ba5c7b3e2a7c..a2110287099e 100644
> --- a/drivers/nvme/host/tcp.c
> +++ b/drivers/nvme/host/tcp.c
> @@ -1774,6 +1774,50 @@ static int nvme_tcp_start_tls(struct nvme_ctrl *nctrl,
> return ret;
> }
>
> +static struct net_device *nvme_tcp_get_netdev(struct nvme_ctrl *ctrl,
> + netdevice_tracker *tracker, gfp_t gfp)
> +{
> + struct net_device *dev = NULL;
> +
> + if (ctrl->opts->mask & NVMF_OPT_HOST_IFACE)
> + dev = netdev_get_by_name(&init_net, ctrl->opts->host_iface,
> + tracker, gfp);
> + else {
> + struct nvme_tcp_ctrl *tctrl = to_tcp_ctrl(ctrl);
> + struct sockaddr_storage *src = NULL, *dest = NULL;
> +
> + if (ctrl->opts->mask & NVMF_OPT_HOST_TRADDR)
> + src = &tctrl->src_addr;
> +
> + dest = &tctrl->addr;
> +
> + dev = netdev_get_by_addr(&init_net, src, dest, tracker, gfp);
> + }
> + return dev;
> +}
> +
> +/*
> + * Returns number of active NIC queues (min of TX/RX), or 0 if device cannot
> + * be determined.
> + */
> +static int nvme_tcp_get_netdev_current_queue_count(struct nvme_ctrl *ctrl)
> +{
> + struct net_device *dev;
> + int tx_queues, rx_queues;
> + netdevice_tracker tracker;
> +
> + dev = nvme_tcp_get_netdev(ctrl, &tracker, GFP_KERNEL);
> + if (!dev)
> + return 0;
> +
> + tx_queues = dev->real_num_tx_queues;
> + rx_queues = dev->real_num_rx_queues;
> +
> + netdev_put(dev, &tracker);
> +
> + return min(tx_queues, rx_queues);
> +}
> +
> static int nvme_tcp_alloc_queue(struct nvme_ctrl *nctrl, int qid,
> key_serial_t pskid)
> {
> @@ -2165,6 +2209,23 @@ static int nvme_tcp_alloc_io_queues(struct nvme_ctrl *ctrl)
> unsigned int nr_io_queues;
> int ret;
[..]
> + if (!(ctrl->opts->mask & NVMF_OPT_NR_IO_QUEUES)) {
> + int nr_hw_queues;
Looks like the userspace can already pass the preferred number of queues,
so in this case, why not do all this netdev resolution and queue
estimation in the userspace? Presumably most or the users you care
about always go through nvme-cli, right?
next prev parent reply other threads:[~2026-07-31 16:41 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-07-31 7:39 [RESEND PATCH v2 0/4] nvme-tcp: NIC topology aware I/O queue scaling and queue info export Nilay Shroff
2026-07-31 7:39 ` [RESEND PATCH v2 1/4] net: add helper for device lookup by destination address Nilay Shroff
2026-07-31 7:39 ` [RESEND PATCH v2 2/4] nvme-tcp: limit I/O queue count based on NIC queue count Nilay Shroff
2026-07-31 16:41 ` Stanislav Fomichev [this message]
2026-07-31 7:39 ` [RESEND PATCH v2 3/4] nvme: add debugfs helpers for NVMe drivers Nilay Shroff
2026-07-31 8:14 ` Maurizio Lombardi
2026-07-31 7:39 ` [RESEND PATCH v2 4/4] nvme: expose queue information via debugfs Nilay Shroff
2026-07-31 16:39 ` [RESEND PATCH v2 0/4] nvme-tcp: NIC topology aware I/O queue scaling and queue info export Stanislav Fomichev
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=amzPvMWfzetiirw0@devvm7509.cco0.facebook.com \
--to=sdf.kernel@gmail.com \
--cc=chaitanyak@nvidia.com \
--cc=davem@davemloft.net \
--cc=edumazet@google.com \
--cc=gjoyce@linux.ibm.com \
--cc=hare@suse.de \
--cc=hch@lst.de \
--cc=horms@kernel.org \
--cc=kbusch@kernel.org \
--cc=kuba@kernel.org \
--cc=linux-nvme@lists.infradead.org \
--cc=netdev@vger.kernel.org \
--cc=nilay@linux.ibm.com \
--cc=pabeni@redhat.com \
--cc=sagi@grimberg.me \
/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).