From: Maurizio Lombardi <mlombard@redhat.com>
To: kbusch@kernel.org
Cc: mheyne@amazon.de, emilne@redhat.com, jmeneghi@redhat.com,
linux-nvme@lists.infradead.org, dwagner@suse.de,
mlombard@arkamax.eu, mkhalfella@purestorage.com,
chaitanyak@nvidia.com, hare@kernel.org, hch@lst.de
Subject: [PATCH V3 0/8] nvme: Refactor and expose per-controller timeout configuration
Date: Fri, 10 Apr 2026 09:39:16 +0200 [thread overview]
Message-ID: <20260410073924.61078-1-mlombard@redhat.com> (raw)
This patchset tries to address some limitations in how the NVMe driver handles
command timeouts.
Currently, the driver relies heavily on global module parameters
(NVME_IO_TIMEOUT and NVME_ADMIN_TIMEOUT), making it difficult for users to
tune timeouts for specific controllers that may have very different
characteristics. Also, in some cases, manual changes to sysfs timeout values
are ignored by the driver logic.
For example this patchset removes the unconditional timeout assignment in
nvme_init_request. This allows the block layer to correctly apply the request
queue's timeout settings, ensuring that user-initiated changes via sysfs
are actually respected for all requests.
It introduces new sysfs attributes (admin_timeout and io_timeout) to the NVMe
controller. This allows users to configure distinct timeout requirements for
different controllers rather than relying on global module parameters.
Some examples:
Changes to the controller's io_timeout gets propagated to all
the associated namespaces' queues:
# find /sys -name 'io_timeout'
/sys/devices/virtual/nvme-fabrics/ctl/nvme0/nvme0c0n1/queue/io_timeout
/sys/devices/virtual/nvme-fabrics/ctl/nvme0/nvme0c0n2/queue/io_timeout
/sys/devices/virtual/nvme-fabrics/ctl/nvme0/nvme0c0n3/queue/io_timeout
/sys/devices/virtual/nvme-fabrics/ctl/nvme0/io_timeout
# echo 27000 > /sys/devices/virtual/nvme-fabrics/ctl/nvme0/io_timeout
# cat /sys/devices/virtual/nvme-fabrics/ctl/nvme0/nvme0c0n1/queue/io_timeout
27000
# cat /sys/devices/virtual/nvme-fabrics/ctl/nvme0/nvme0c0n2/queue/io_timeout
27000
# cat /sys/devices/virtual/nvme-fabrics/ctl/nvme0/nvme0c0n3/queue/io_timeout
27000
When adding a namespace target-side, the io_timeout is inherited from
the controller's preferred timeout:
* target side *
# nvmetcli
/> cd subsystems/test-nqn/namespaces/4
/subsystems/t.../namespaces/4> enable
The Namespace has been enabled.
************
* Host-side *
nvme nvme0: rescanning namespaces.
# find /sys -name 'io_timeout'
/sys/devices/virtual/nvme-fabrics/ctl/nvme0/nvme0c0n1/queue/io_timeout
/sys/devices/virtual/nvme-fabrics/ctl/nvme0/nvme0c0n2/queue/io_timeout
/sys/devices/virtual/nvme-fabrics/ctl/nvme0/nvme0c0n3/queue/io_timeout
/sys/devices/virtual/nvme-fabrics/ctl/nvme0/nvme0c0n4/queue/io_timeout <-- new namespace
/sys/devices/virtual/nvme-fabrics/ctl/nvme0/io_timeout
# cat /sys/devices/virtual/nvme-fabrics/ctl/nvme0/nvme0c0n4/queue/io_timeout
27000
***********
io_timeout and admin_timeout module parameters are used as default
values for new controllers:
# nvme connect -t tcp -a 10.37.153.138 -s 8000 -n test-nqn2
connecting to device: nvme1
# cat /sys/devices/virtual/nvme-fabrics/ctl/nvme1/nvme1c1n1/queue/io_timeout
30000
# cat /sys/devices/virtual/nvme-fabrics/ctl/nvme1/admin_timeout
60000
V3: - Rebase on top of nvme 7.1 branch
- add an admin_timeout variable to nvme_ctrl structure
- Wait until the controller has reached the LIVE state
for the first time before allowing the user to modify
the timeouts, this prevents the dereferencing of the admin_q,
fabrics_q and connect_q queues before their initialization.
- move blk_put_queue(fabrics_q) to nvme_free_ctrl() to align it to
admin_q teardown
- modify nvmet-loop to avoid deleting and re-creating the admin_q queue
when the controller enters the resetting state.
- add a warning if nvme_alloc_admin_tag_set() is called twice against
the same controller
V2: - Drop the RFC tag
- apply the timeout settings to fabrics_q and connect_q too
- Code style fixes
- remove unnecessary check for null admin_q in __nvme_delete_io_queues()
- Use DEVICE_ATTR() macro
Heyne, Maximilian (1):
nvme: Let the blocklayer set timeouts for requests
Maurizio Lombardi (7):
nvme: add sysfs attribute to change admin timeout per nvme controller
nvme: pci: use admin queue timeout over NVME_ADMIN_TIMEOUT
nvme: add sysfs attribute to change IO timeout per nvme controller
nvme: use per controller timeout waits over depending on global
default
nvme-core: align fabrics_q teardown with admin_q in nvme_free_ctrl
nvmet-loop: do not alloc admin tag set during reset
nvme-core: warn on allocating admin tag set with existing queue
drivers/nvme/host/apple.c | 2 +-
drivers/nvme/host/core.c | 23 +++++-----
drivers/nvme/host/nvme.h | 4 +-
drivers/nvme/host/pci.c | 4 +-
drivers/nvme/host/rdma.c | 2 +-
drivers/nvme/host/sysfs.c | 89 ++++++++++++++++++++++++++++++++++++++
drivers/nvme/host/tcp.c | 2 +-
drivers/nvme/target/loop.c | 38 ++++++++--------
8 files changed, 128 insertions(+), 36 deletions(-)
--
2.53.0
next reply other threads:[~2026-04-10 7:39 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-04-10 7:39 Maurizio Lombardi [this message]
2026-04-10 7:39 ` [PATCH V3 1/8] nvme: Let the blocklayer set timeouts for requests Maurizio Lombardi
2026-04-10 7:39 ` [PATCH V3 2/8] nvme: add sysfs attribute to change admin timeout per nvme controller Maurizio Lombardi
2026-04-10 7:39 ` [PATCH V3 3/8] nvme: pci: use admin queue timeout over NVME_ADMIN_TIMEOUT Maurizio Lombardi
2026-04-10 7:39 ` [PATCH V3 4/8] nvme: add sysfs attribute to change IO timeout per nvme controller Maurizio Lombardi
2026-04-10 7:39 ` [PATCH V3 5/8] nvme: use per controller timeout waits over depending on global default Maurizio Lombardi
2026-04-10 7:39 ` [PATCH V3 6/8] nvme-core: align fabrics_q teardown with admin_q in nvme_free_ctrl Maurizio Lombardi
2026-04-10 7:39 ` [PATCH V3 7/8] nvmet-loop: do not alloc admin tag set during reset Maurizio Lombardi
2026-04-10 7:39 ` [PATCH V3 8/8] nvme-core: warn on allocating admin tag set with existing queue Maurizio Lombardi
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=20260410073924.61078-1-mlombard@redhat.com \
--to=mlombard@redhat.com \
--cc=chaitanyak@nvidia.com \
--cc=dwagner@suse.de \
--cc=emilne@redhat.com \
--cc=hare@kernel.org \
--cc=hch@lst.de \
--cc=jmeneghi@redhat.com \
--cc=kbusch@kernel.org \
--cc=linux-nvme@lists.infradead.org \
--cc=mheyne@amazon.de \
--cc=mkhalfella@purestorage.com \
--cc=mlombard@arkamax.eu \
/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