From: Mohamed Khalfella <mkhalfella@purestorage.com>
To: Daniel Wagner <dwagner@suse.de>
Cc: Keith Busch <kbusch@kernel.org>, Jens Axboe <axboe@kernel.dk>,
Christoph Hellwig <hch@lst.de>, Sagi Grimberg <sagi@grimberg.me>,
Justin Tee <justin.tee@broadcom.com>,
Naresh Gottumukkala <nareshgottumukkala83@gmail.com>,
Paul Ely <paul.ely@broadcom.com>,
Hannes Reinecke <hare@kernel.org>,
Chaitanya Kulkarni <kch@nvidia.com>,
James Smart <jsmart833426@gmail.com>,
Randy Jennings <randyj@purestorage.com>,
linux-nvme@lists.infradead.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH v6 09/18] nvme: Implement cross-controller reset completion
Date: Wed, 21 Oct 2026 11:16:56 -0700 [thread overview]
Message-ID: <20261021181656.GV2931-mkhalfella@purestorage.com> (raw)
In-Reply-To: <02c2a904-2264-46b8-b49f-6f7109913da6@flourine.local>
On Wed 2026-10-21 10:43:03 +0200, Daniel Wagner wrote:
> On Tue, Oct 20, 2026 at 06:04:38PM -0700, Mohamed Khalfella wrote:
> > > What happens to the waiters on sctrl->ccr_list when the source
> > > controller enters error recovery while a CCR is pending?
> >
> > You already answered it below :)
>
> I tried to figure it out, but I'm still not sure if I really understand
> all the conditions. So bear with me.
No problem. Take your time.
>
> > > As far as I can tell, ccr_work itself is fine. The reset path cancels
> > > it via nvme_stop_ctrl(), and in the error recovery path the Get Log
> > > Page just fails once the admin queue is torn down. But the target drops
> > > all CCRs issued by the old association when it frees the controller,
> > > so the CCR completed AEN for them will never arrive. Nothing on the
> > > host side walks ccr_list when the controller leaves LIVE, so
> > > nvme_issue_wait_ccr() sleeps until min(kato, deadline - now) runs out
> > > before nvme_fence_ctrl() tries the next source controller. In the
> > > worst case that eats the whole fencing window.
> >
> > If the remaining of the fencing window (deadline - now) is less than
> > kato then I am fine with this scenario wasting this time anyway. If we
> > hit the deadline then we consider fencing done anyway. If it consumes
> > kato from the deadline then we retry another path.
>
> Okay, this might be something worth documenting? It seems like a case we
> will get bug reports in the future.
I do not think this behavior worth documenting as stable behavior. We
should be able to refactor/change/optimize this code in the future
without worrying about breaking a documented behavior.
The main point of CCR is to speed up controller fencing in order to avoid
CQT delay. I think of it as a best-effort process attempted in a bounded
amount of time. If it succeeds we skip the CQT delay, otherwise we spend
the time we will have spent in CQT delay anyway.
Can we do better within this bounded amount of time? Sure, this is what
is being suggested here. However, I prefer not to do that part of this
patchset. Also, do not like to clutter the code with comments about
potential changes.
>
> > > Would it make sense to fail all pending entries (set ccrs to a failure
> > > status and complete them under ctrl->lock) when the source controller
> > > goes into error recovery, so the fencing code can move on to another
> > > path right away?
> >
> > Failing pending CCR entries that we know we are not going to complete
> > will help in this case. The question is where to do that. A LIVE
> > controller might hit an error and transition to FENCING, or manually
> > reset and move to RESETTING, or deleted and go to DELETING. Do we need
> > to consider all these places to fail the pending CCRs?
>
> I'd say yes. Anyway, I don't think this needs to be addressed right away
> if the current code is functional correct and we are just not as fast as
> possible.
Agree, the goal of the patchset is to add the initial support for
CCR/CQT. If there are functional issues they should be addressed now.
Known gaps and optimizations can come in later patchsets.
diff --git a/drivers/nvme/host/core.c b/drivers/nvme/host/core.c
index ca7f083702f5..6c0703fba8ff 100644
--- a/drivers/nvme/host/core.c
+++ b/drivers/nvme/host/core.c
@@ -863,6 +863,9 @@ bool nvme_change_ctrl_state(struct nvme_ctrl *ctrl,
wake_up_all(&ctrl->state_wq);
}
+ if (changed && old_state == NVME_CTRL_LIVE)
+ nvme_fail_pending_ccrs(ctrl); /* TBD */
+
spin_unlock_irqrestore(&ctrl->lock, flags);
if (!changed)
return false;
One way to fail pending CCRs is to add it to controller state machine.
Something like the diff above.
>
> > You might have also noticed that nvme_issue_wait_ccr() calling
> > __nvme_submit_sync_cmd() might consume the entire fencing window if the
> > CCR command gets held because the source controller hits an error. This
> > is another area be optimized. I am inclined to leave the code as it is
> > today. What is being described here is an optimization that can come
> > later on.
>
> Yes, I was actually about to ask about __nvme_submit_sync_cmd in this
> path next. Since my questions are about optimization, I don't think we
> should make the current version any more complex than it already is. We
> can handle optimization later, but please document those cases in the
> meantime.
Hannes also raised this point. It is on my todo list to add timeout
parameter to __nvme_submit_sync_cmd() and use that here.
next prev parent reply other threads:[~2026-10-21 18:17 UTC|newest]
Thread overview: 57+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-20 18:27 [PATCH v6 00/18] TP8028 Rapid Path Failure Recovery Mohamed Khalfella
2026-09-20 18:27 ` [PATCH v6 01/18] nvmet: Rapid Path Failure Recovery set controller identify fields Mohamed Khalfella
2026-10-15 12:58 ` Daniel Wagner
2026-10-19 18:06 ` Mohamed Khalfella
2026-09-20 18:28 ` [PATCH v6 02/18] nvmet/debugfs: Export controller CIU and CIRN via debugfs Mohamed Khalfella
2026-10-19 12:01 ` Daniel Wagner
2026-10-19 19:01 ` Mohamed Khalfella
2026-10-20 12:59 ` Daniel Wagner
2026-10-21 18:38 ` Mohamed Khalfella
2026-09-20 18:28 ` [PATCH v6 03/18] nvmet: Implement CCR nvme command Mohamed Khalfella
2026-10-19 16:00 ` Daniel Wagner
2026-10-19 20:21 ` Mohamed Khalfella
2026-09-20 18:28 ` [PATCH v6 04/18] nvmet: Implement CCR logpage Mohamed Khalfella
2026-10-19 16:18 ` Daniel Wagner
2026-09-20 18:28 ` [PATCH v6 05/18] nvmet: Send an AEN on CCR completion Mohamed Khalfella
2026-10-19 16:31 ` Daniel Wagner
2026-09-20 18:28 ` [PATCH v6 06/18] nvme: Rapid Path Failure Recovery read controller identify fields Mohamed Khalfella
2026-10-19 16:56 ` Daniel Wagner
2026-10-19 21:18 ` Mohamed Khalfella
2026-09-20 18:28 ` [PATCH v6 07/18] nvme: Introduce FENCING and FENCED controller states Mohamed Khalfella
2026-10-19 17:01 ` Daniel Wagner
2026-10-19 17:18 ` Daniel Wagner
2026-10-19 21:40 ` Mohamed Khalfella
2026-10-20 13:15 ` Daniel Wagner
2026-10-19 21:26 ` Mohamed Khalfella
2026-10-20 13:10 ` Daniel Wagner
2026-10-21 18:33 ` Mohamed Khalfella
2026-09-20 18:28 ` [PATCH v6 08/18] nvme: Implement cross-controller reset recovery Mohamed Khalfella
2026-10-20 8:55 ` Daniel Wagner
2026-10-20 23:56 ` Mohamed Khalfella
2026-10-21 8:29 ` Daniel Wagner
2026-10-21 18:22 ` Mohamed Khalfella
2026-09-20 18:28 ` [PATCH v6 09/18] nvme: Implement cross-controller reset completion Mohamed Khalfella
2026-10-20 9:18 ` Daniel Wagner
2026-10-21 1:04 ` Mohamed Khalfella
2026-10-21 8:43 ` Daniel Wagner
2026-10-21 18:16 ` Mohamed Khalfella [this message]
2026-09-20 18:28 ` [PATCH v6 10/18] nvme-tcp: Use CCR to recover controller that hits an error Mohamed Khalfella
2026-10-20 9:36 ` Daniel Wagner
2026-10-21 1:20 ` Mohamed Khalfella
2026-09-20 18:28 ` [PATCH v6 11/18] nvme-rdma: " Mohamed Khalfella
2026-10-20 9:36 ` Daniel Wagner
2026-10-21 1:25 ` Mohamed Khalfella
2026-09-20 18:28 ` [PATCH v6 12/18] nvme-fc: start error recovery instead of aborting timed out IOs Mohamed Khalfella
2026-10-20 9:55 ` Daniel Wagner
2026-09-20 18:28 ` [PATCH v6 13/18] nvme-fc: perform error recovery directly from ioerr_work Mohamed Khalfella
2026-10-20 10:20 ` Daniel Wagner
2026-09-20 18:28 ` [PATCH v6 14/18] nvme-fc: Use CCR to recover controller that hits an error Mohamed Khalfella
2026-10-20 11:56 ` Daniel Wagner
2026-10-21 1:31 ` Mohamed Khalfella
2026-09-20 18:28 ` [PATCH v6 15/18] nvme-fc: Hold inflight requests while in FENCING state Mohamed Khalfella
2026-10-20 12:21 ` Daniel Wagner
2026-09-20 18:28 ` [PATCH v6 16/18] nvmet: Add support for CQT to nvme target Mohamed Khalfella
2026-10-20 12:40 ` Daniel Wagner
2026-09-20 18:28 ` [PATCH v6 17/18] nvme: Add support for CQT to nvme host Mohamed Khalfella
2026-10-20 12:46 ` Daniel Wagner
2026-09-20 18:28 ` [PATCH v6 18/18] nvme: let controller deletion wait out a fencing window Mohamed Khalfella
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=20261021181656.GV2931-mkhalfella@purestorage.com \
--to=mkhalfella@purestorage.com \
--cc=axboe@kernel.dk \
--cc=dwagner@suse.de \
--cc=hare@kernel.org \
--cc=hch@lst.de \
--cc=jsmart833426@gmail.com \
--cc=justin.tee@broadcom.com \
--cc=kbusch@kernel.org \
--cc=kch@nvidia.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-nvme@lists.infradead.org \
--cc=nareshgottumukkala83@gmail.com \
--cc=paul.ely@broadcom.com \
--cc=randyj@purestorage.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
all inboxes | Powered by JetHome®