From: Stuart Hayes <stuart.w.hayes@gmail.com>
To: mkhalfella@purestorage.com
Cc: adailey@purestorage.com, hare@suse.de, hch@lst.de,
jmeneghi@redhat.com, jrani@purestorage.com, kbusch@kernel.org,
linux-kernel@vger.kernel.org, linux-nvme@lists.infradead.org,
randyj@purestorage.com, sagi@grimberg.me, wagi@kernel.org,
Shai.Dagieli@dell.com
Subject: Re: [RFC PATCH v1 0/7] nvme-tcp: Implement TP4129 (KATO Corrections and Clarifications)
Date: Thu, 13 Nov 2025 14:04:07 -0600 [thread overview]
Message-ID: <20251113200407.398321-1-stuart.w.hayes@gmail.com> (raw)
In-Reply-To: <20250324174909.3919131-1-mkhalfella@purestorage.com>
On 2025-03-24 17:48 Mohamed Khalfella mkhalfella@purestorage.com wrote
> Hello,
>
> RFC patchset implementing TP4129 (KATO Corrections and Clarifications)
> for nvme-tcp. nvme-tcp was choosen as an example to demonstrate the
> approach taken in the patchset. Other fabric transports, nvme-rdma and
> nvme-fc, will be added including the feedback received in this RFC.
>
> TP4129 requires nvme controller to not immediately cancel inflight
> requests when connection is lost between initiator and target.
> Instead, inflight requests need to be held for a duration that is long
> enough to allow target to learn about connection loss and quiesce
> pending commands. Only then pending requests on the initiator side can
> be canceled and possibly retried safely on another path. The main issue
> TP4129 tries to address is ABA corruption that could happen if inflight
> requests are tried immediately on another path.
>
> Requests hold timeout has two components:
>
> - KATO timeout is the time sufficient for target to learn about the
> connection loss. It depends on whether command based or traffic based
> keepalive is used. As per TP4129 the timeout is supposed to be 3 x KATO
> for traffic based keepalive and 2 * KATO for command based keepalive.
>
> - CQT is the time needed by target controller to quiesce in flight nvme
> commands after the controller learns about connection loss.
>
> On controller reset or delete cancel inflight requests if controller was
> disabled correctly. Otherwise, hold the requests until it is safe to be
> released.
>
> Jyoti Rani (1):
> nvme-core: Read CQT wait from identify controller response
>
> Mohamed Khalfella (6):
> nvmef: Add nvmef_req_hold_timeout_ms() to calculate kato request hold
> time
> nvme-tcp: Move freeing tagset out of nvme_tcp_teardown_io_queues()
> nvme-tcp: Move freeing admin tagset out of
> nvme_tcp_teardown_admin_queue()
> nvme-tcp: Split nvme_tcp_teardown_io_queues() into two functions
> nvme-core: Add support for holding inflight requests
> nvme-tcp: Do not immediately cancel inflight requests during recovery
>
> drivers/nvme/host/core.c | 62 +++++++++++++++++++++++++++++++++++++
> drivers/nvme/host/fabrics.h | 7 +++++
> drivers/nvme/host/nvme.h | 5 +++
> drivers/nvme/host/tcp.c | 56 +++++++++++++++++++++------------
> include/linux/nvme.h | 4 ++-
> 5 files changed, 114 insertions(+), 20 deletions(-)
>
> --
> 2.48.1
Verified the patch fixes the Data integrity issue for which TP4129 was written.
Tested-by: Shai Dagieli (Shai.Dagieli@dell.com)
Summary:
The test included two parts:
1. Part 1: testing with original kernel without the patch to verify the test can
consistently reproduce the data integrity issue.
a. Result: the Data integrity was recreated.
2. Part 2: testing with a kernel version with the patch.
a. Results:
i. The data integrity issued was not recreated with the patch.
ii. The messages seen on the storage log and dmesg are as expected based on
the test error injection and the patch expected behavior and messages.
3. Conclusion: the patch fixes the data integrity issue.
4. Additional comments:
a. TP4129 defines an extended delay before an IO for which the host did not
receive a ‘command completion’ can be retried on a different path. Based
on the test logs, the extended delay is applied in other cases where the
IO is retried on another path, even when the host received command completion.
For example, the extended delay before retry was seen when the status returned
in the Command Completion was ‘status code type = 3h’ (Path Related Status) &
‘Status code = 00h’ (Internal Path Error). Applying the extended delay in cases
where it is not required increases the potential performance impact of this
patch and should be fixed.
i. Recommendation: Modify the patch to limit the extended delay to the relevant
cases: IO retry, on a different path, when the host DID NOT receive a
Command Completion status.
Execution overview
- Test ran continuously for almost 24 hours with periodic SDT disruptions and host I/O validation.
Findings
- No DIs or I/O errors observed in Vdbench error logs (errorlog.html remained clean).
- No host panics or abnormal behavior were reported.
- dmesg shows expected TP4129 recovery messages, for example:
[18:52:28] nvme nvme2: holding inflight requests for 15000ms
[18:52:43] nvme nvme2: releasing inflight requests
[18:52:43] nvme_cancel_request: 123 callbacks suppressed
[18:52:43] nvme nvme2: Cancelling I/O ...
prev parent reply other threads:[~2025-11-13 20:04 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-03-24 17:48 Mohamed Khalfella
2025-03-24 17:48 ` [RFC PATCH v1 1/7] nvme-core: Read CQT wait from identify controller response Mohamed Khalfella
2025-03-24 17:48 ` [RFC PATCH v1 2/7] nvmef: Add nvmef_req_hold_timeout_ms() to calculate kato request hold time Mohamed Khalfella
2025-03-24 17:48 ` [RFC PATCH v1 3/7] nvme-tcp: Move freeing tagset out of nvme_tcp_teardown_io_queues() Mohamed Khalfella
2025-03-24 17:48 ` [RFC PATCH v1 4/7] nvme-tcp: Move freeing admin tagset out of nvme_tcp_teardown_admin_queue() Mohamed Khalfella
2025-03-24 17:48 ` [RFC PATCH v1 5/7] nvme-tcp: Split nvme_tcp_teardown_io_queues() into two functions Mohamed Khalfella
2025-03-24 17:48 ` [RFC PATCH v1 6/7] nvme-core: Add support for holding inflight requests Mohamed Khalfella
2025-03-24 17:49 ` [RFC PATCH v1 7/7] nvme-tcp: Do not immediately cancel inflight requests during recovery Mohamed Khalfella
2025-11-13 20:04 ` Stuart Hayes [this message]
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=20251113200407.398321-1-stuart.w.hayes@gmail.com \
--to=stuart.w.hayes@gmail.com \
--cc=Shai.Dagieli@dell.com \
--cc=adailey@purestorage.com \
--cc=hare@suse.de \
--cc=hch@lst.de \
--cc=jmeneghi@redhat.com \
--cc=jrani@purestorage.com \
--cc=kbusch@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-nvme@lists.infradead.org \
--cc=mkhalfella@purestorage.com \
--cc=randyj@purestorage.com \
--cc=sagi@grimberg.me \
--cc=wagi@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
all inboxes | Powered by JetHome®