]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
nvme: Use non zero KATO for persistent discovery connections
authorAlistair Francis <alistair.francis@wdc.com>
Tue, 2 Sep 2025 03:52:11 +0000 (13:52 +1000)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 13 Nov 2025 20:34:07 +0000 (15:34 -0500)
[ Upstream commit 2e482655019ab6fcfe8865b62432c6d03f0b5f80 ]

The NVMe Base Specification 2.1 states that:

"""
A host requests an explicit persistent connection ... by specifying a
non-zero Keep Alive Timer value in the Connect command.
"""

As such if we are starting a persistent connection to a discovery
controller and the KATO is currently 0 we need to update KATO to a non
zero value to avoid continuous timeouts on the target.

Signed-off-by: Alistair Francis <alistair.francis@wdc.com>
Reviewed-by: Hannes Reinecke <hare@suse.de>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Keith Busch <kbusch@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/nvme/host/core.c

index 24d82d35041b5464ea4ef2e0d262dae8c7e835d6..a3b9f8ea235f76e5ab578897d1179755247772ed 100644 (file)
@@ -4740,8 +4740,14 @@ void nvme_start_ctrl(struct nvme_ctrl *ctrl)
         * checking that they started once before, hence are reconnecting back.
         */
        if (test_bit(NVME_CTRL_STARTED_ONCE, &ctrl->flags) &&
-           nvme_discovery_ctrl(ctrl))
+           nvme_discovery_ctrl(ctrl)) {
+               if (!ctrl->kato) {
+                       nvme_stop_keep_alive(ctrl);
+                       ctrl->kato = NVME_DEFAULT_KATO;
+                       nvme_start_keep_alive(ctrl);
+               }
                nvme_change_uevent(ctrl, "NVME_EVENT=rediscover");
+       }
 
        if (ctrl->queue_count > 1) {
                nvme_queue_scan(ctrl);