From: Mohamed Khalfella <mkhalfella@purestorage.com>
To: James Smart <jsmart833426@gmail.com>
Cc: Justin Tee <justin.tee@broadcom.com>,
Naresh Gottumukkala <nareshgottumukkala83@gmail.com>,
Paul Ely <paul.ely@broadcom.com>,
Chaitanya Kulkarni <kch@nvidia.com>,
Christoph Hellwig <hch@lst.de>, Jens Axboe <axboe@kernel.dk>,
Keith Busch <kbusch@kernel.org>, Sagi Grimberg <sagi@grimberg.me>,
Hannes Reinecke <hare@suse.de>,
Aaron Dailey <adailey@purestorage.com>,
Randy Jennings <randyj@purestorage.com>,
Dhaval Giani <dgiani@purestorage.com>,
linux-nvme@lists.infradead.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH v3 13/21] nvme-fc: Use CCR to recover controller that hits an error
Date: Thu, 26 Mar 2026 10:40:11 -0700 [thread overview]
Message-ID: <20260326174011.GP3435530-mkhalfella@purestorage.com> (raw)
In-Reply-To: <d6013719-8169-4ad0-bb05-a626a717e8b1@gmail.com>
On Fri 2026-02-27 17:03:55 -0800, James Smart wrote:
> On 2/13/2026 8:25 PM, Mohamed Khalfella wrote:
> > An alive nvme controller that hits an error now will move to FENCING
> > state instead of RESETTING state. ctrl->fencing_work attempts CCR to
> > terminate inflight IOs. Regardless of the success or failure of CCR
> > operation the controller is transitioned to RESETTING state to continue
> > error recovery process.
> >
> > Signed-off-by: Mohamed Khalfella <mkhalfella@purestorage.com>
> > ---
> > drivers/nvme/host/fc.c | 30 ++++++++++++++++++++++++++++++
> > 1 file changed, 30 insertions(+)
> >
> > diff --git a/drivers/nvme/host/fc.c b/drivers/nvme/host/fc.c
> > index e6ffaa19aba4..6ebabfb7e76d 100644
> > --- a/drivers/nvme/host/fc.c
> > +++ b/drivers/nvme/host/fc.c
> > @@ -166,6 +166,7 @@ struct nvme_fc_ctrl {
> > struct blk_mq_tag_set admin_tag_set;
> > struct blk_mq_tag_set tag_set;
> >
> > + struct work_struct fencing_work;
> > struct work_struct ioerr_work;
> > struct delayed_work connect_work;
> >
> > @@ -1868,6 +1869,24 @@ __nvme_fc_fcpop_chk_teardowns(struct nvme_fc_ctrl *ctrl,
> > }
> > }
> >
> > +static void nvme_fc_fencing_work(struct work_struct *work)
> > +{
> > + struct nvme_fc_ctrl *fc_ctrl =
> > + container_of(work, struct nvme_fc_ctrl, fencing_work);
> > + struct nvme_ctrl *ctrl = &fc_ctrl->ctrl;
> > + unsigned long rem;
> > +
> > + rem = nvme_fence_ctrl(ctrl);
> > + if (rem) {
> > + dev_info(ctrl->device,
> > + "CCR failed, skipping time-based recovery\n");
> > + }
> > +
> > + nvme_change_ctrl_state(ctrl, NVME_CTRL_FENCED);
> > + if (nvme_change_ctrl_state(ctrl, NVME_CTRL_RESETTING))
> > + queue_work(nvme_reset_wq, &fc_ctrl->ioerr_work);
>
> catch the rework of prior patch
I ended up not dropping ctrl->ioerr_work. There are situations we need
error recovery work to run on a separate thread.
>
> > +}
> > +
> > static void
> > nvme_fc_ctrl_ioerr_work(struct work_struct *work)
> > {
> > @@ -1889,6 +1908,7 @@ nvme_fc_ctrl_ioerr_work(struct work_struct *work)
> > return;
> > }
> >
> > + flush_work(&ctrl->fencing_work);
> > nvme_fc_error_recovery(ctrl);
> > }
> >
> > @@ -1915,6 +1935,14 @@ static void nvme_fc_start_ioerr_recovery(struct nvme_fc_ctrl *ctrl,
> > {
> > enum nvme_ctrl_state state;
> >
> From prior patch - the CONNECTING logic should be here....
Yes, it is here. The check for CONNECTING state is at the top of
nvme_fc_start_ioerr_recovery().
>
> > + if (nvme_change_ctrl_state(&ctrl->ctrl, NVME_CTRL_FENCING)) {
> > + dev_warn(ctrl->ctrl.device,
> > + "NVME-FC{%d}: starting controller fencing %s\n",
> > + ctrl->cnum, errmsg);
> > + queue_work(nvme_wq, &ctrl->fencing_work);
> > + return;
> > + }
> > +
> > if (nvme_change_ctrl_state(&ctrl->ctrl, NVME_CTRL_RESETTING)) {
> > dev_warn(ctrl->ctrl.device, "NVME-FC{%d}: starting error recovery %s\n",
> > ctrl->cnum, errmsg);
> > @@ -3322,6 +3350,7 @@ nvme_fc_reset_ctrl_work(struct work_struct *work)
> > struct nvme_fc_ctrl *ctrl =
> > container_of(work, struct nvme_fc_ctrl, ctrl.reset_work);
> >
> > + flush_work(&ctrl->fencing_work);
> > nvme_stop_ctrl(&ctrl->ctrl);
> >
> > /* will block will waiting for io to terminate */
> > @@ -3497,6 +3526,7 @@ nvme_fc_alloc_ctrl(struct device *dev, struct nvmf_ctrl_options *opts,
> >
> > INIT_WORK(&ctrl->ctrl.reset_work, nvme_fc_reset_ctrl_work);
> > INIT_DELAYED_WORK(&ctrl->connect_work, nvme_fc_connect_ctrl_work);
> > + INIT_WORK(&ctrl->fencing_work, nvme_fc_fencing_work);
> > INIT_WORK(&ctrl->ioerr_work, nvme_fc_ctrl_ioerr_work);
> > spin_lock_init(&ctrl->lock);
> >
>
> there is a little to be in sync with my comment on the prior patch, but
> otherwise what is here is fine.
>
> What bothers me in this process is - there are certainly conditions
> where there is not connectivity loss where FC can send things such as
> the ABTS or a Disconnect LS that can inform the controller to start
> terminating. Its odd that we skip this step and go directly to the CCR
> reset to terminate the controller. We should have been able to continue
> to send the things that start to directly tear down the controller which
> can be happening in parallel with the CCR.
Depending on how the target is implemented ABTS or Disconnect LS do not
guarantee inflight IOs are terminated. CCR main point is terminate
inflight IOs making it safe to retry failed IOs.
next prev parent reply other threads:[~2026-03-26 17:40 UTC|newest]
Thread overview: 61+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-02-14 4:25 [PATCH v3 00/21] TP8028 Rapid Path Failure Recovery Mohamed Khalfella
2026-02-14 4:25 ` [PATCH v3 01/21] nvmet: Rapid Path Failure Recovery set controller identify fields Mohamed Khalfella
2026-02-14 4:25 ` [PATCH v3 02/21] nvmet/debugfs: Export controller CIU and CIRN via debugfs Mohamed Khalfella
2026-02-14 4:25 ` [PATCH v3 03/21] nvmet: Implement CCR nvme command Mohamed Khalfella
2026-02-27 16:30 ` Maurizio Lombardi
2026-03-25 18:52 ` Mohamed Khalfella
2026-02-14 4:25 ` [PATCH v3 04/21] nvmet: Implement CCR logpage Mohamed Khalfella
2026-02-14 4:25 ` [PATCH v3 05/21] nvmet: Send an AEN on CCR completion Mohamed Khalfella
2026-02-14 4:25 ` [PATCH v3 06/21] nvme: Rapid Path Failure Recovery read controller identify fields Mohamed Khalfella
2026-02-14 4:25 ` [PATCH v3 07/21] nvme: Introduce FENCING and FENCED controller states Mohamed Khalfella
2026-02-16 12:33 ` Hannes Reinecke
2026-02-14 4:25 ` [PATCH v3 08/21] nvme: Implement cross-controller reset recovery Mohamed Khalfella
2026-02-16 12:41 ` Hannes Reinecke
2026-02-17 18:35 ` Mohamed Khalfella
2026-02-26 2:37 ` Randy Jennings
2026-03-27 18:33 ` Mohamed Khalfella
2026-02-14 4:25 ` [PATCH v3 09/21] nvme: Implement cross-controller reset completion Mohamed Khalfella
2026-02-16 12:43 ` Hannes Reinecke
2026-02-17 18:25 ` Mohamed Khalfella
2026-02-18 7:51 ` Hannes Reinecke
2026-02-18 12:47 ` Mohamed Khalfella
2026-02-20 3:34 ` Randy Jennings
2026-02-14 4:25 ` [PATCH v3 10/21] nvme-tcp: Use CCR to recover controller that hits an error Mohamed Khalfella
2026-02-16 12:47 ` Hannes Reinecke
2026-02-14 4:25 ` [PATCH v3 11/21] nvme-rdma: " Mohamed Khalfella
2026-02-16 12:47 ` Hannes Reinecke
2026-02-14 4:25 ` [PATCH v3 12/21] nvme-fc: Decouple error recovery from controller reset Mohamed Khalfella
2026-02-28 0:12 ` James Smart
2026-03-26 2:37 ` Mohamed Khalfella
2026-02-14 4:25 ` [PATCH v3 13/21] nvme-fc: Use CCR to recover controller that hits an error Mohamed Khalfella
2026-02-28 1:03 ` James Smart
2026-03-26 17:40 ` Mohamed Khalfella [this message]
2026-02-14 4:25 ` [PATCH v3 14/21] nvme-fc: Hold inflight requests while in FENCING state Mohamed Khalfella
2026-02-27 2:49 ` Randy Jennings
2026-02-28 1:10 ` James Smart
2026-02-14 4:25 ` [PATCH v3 15/21] nvme-fc: Do not cancel requests in io taget before it is initialized Mohamed Khalfella
2026-02-28 1:12 ` James Smart
2026-02-14 4:25 ` [PATCH v3 16/21] nvmet: Add support for CQT to nvme target Mohamed Khalfella
2026-02-14 4:25 ` [PATCH v3 17/21] nvme: Add support for CQT to nvme host Mohamed Khalfella
2026-02-14 4:25 ` [PATCH v3 18/21] nvme: Update CCR completion wait timeout to consider CQT Mohamed Khalfella
2026-02-16 12:54 ` Hannes Reinecke
2026-02-16 18:45 ` Mohamed Khalfella
2026-02-17 7:09 ` Hannes Reinecke
2026-02-17 15:35 ` Mohamed Khalfella
2026-02-20 1:22 ` James Smart
2026-02-20 2:11 ` Randy Jennings
2026-02-20 7:23 ` Hannes Reinecke
2026-02-20 2:01 ` Randy Jennings
2026-02-20 7:25 ` Hannes Reinecke
2026-02-27 3:05 ` Randy Jennings
2026-03-02 7:32 ` Hannes Reinecke
2026-02-14 4:25 ` [PATCH v3 19/21] nvme-tcp: Extend FENCING state per TP4129 on CCR failure Mohamed Khalfella
2026-02-16 12:56 ` Hannes Reinecke
2026-02-17 17:58 ` Mohamed Khalfella
2026-02-18 8:26 ` Hannes Reinecke
2026-02-14 4:25 ` [PATCH v3 20/21] nvme-rdma: " Mohamed Khalfella
2026-02-14 4:25 ` [PATCH v3 21/21] nvme-fc: " Mohamed Khalfella
2026-02-28 1:20 ` James Smart
2026-03-25 19:07 ` Mohamed Khalfella
2026-04-01 13:33 ` [PATCH v3 00/21] TP8028 Rapid Path Failure Recovery Achkinazi, Igor
2026-04-01 16:37 ` 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=20260326174011.GP3435530-mkhalfella@purestorage.com \
--to=mkhalfella@purestorage.com \
--cc=adailey@purestorage.com \
--cc=axboe@kernel.dk \
--cc=dgiani@purestorage.com \
--cc=hare@suse.de \
--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