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 08/18] nvme: Implement cross-controller reset recovery
Date: Sat, 31 Oct 2026 01:21:55 -0700 [thread overview]
Message-ID: <20261031082155.GC34016-mkhalfella@purestorage.com> (raw)
In-Reply-To: <6e0b4de0-b030-47cc-84ce-3f021a5c75b0@flourine.local>
On Tue 2026-10-20 10:55:10 +0200, Daniel Wagner wrote:
> > +static int nvme_issue_wait_ccr(struct nvme_ctrl *sctrl, struct nvme_ctrl *ictrl,
> > + unsigned long deadline)
> > +{
> > + struct nvme_ccr_entry ccr = { };
> > + union nvme_result res = { 0 };
> > + struct nvme_command c = { };
> > + unsigned long flags, now, tmo = 0;
> > + bool completed = false;
> > + int ret = 0;
> > + u32 result;
> > +
> > + init_completion(&ccr.complete);
> > + ccr.ictrl = ictrl;
> > +
> > + spin_lock_irqsave(&sctrl->lock, flags);
> > + list_add_tail(&ccr.list, &sctrl->ccr_list);
> > + spin_unlock_irqrestore(&sctrl->lock, flags);
> > +
> > + c.ccr.opcode = nvme_admin_cross_ctrl_reset;
> > + c.ccr.ciu = ictrl->ciu;
> > + c.ccr.icid = cpu_to_le16(ictrl->cntlid);
> > + c.ccr.cirn = cpu_to_le64(ictrl->cirn);
> > + ret = __nvme_submit_sync_cmd(sctrl->admin_q, &c, &res,
> > + NULL, 0, NVME_QID_ANY, 0);
> > + if (ret) {
> > + ret = -EIO;
> > + goto out;
> > + }
> > +
> > + result = le32_to_cpu(res.u32);
> > + if (result & 0x01) /* Immediate Reset Successful */
> > + goto out;
> > +
> > + now = jiffies;
> > + if (time_before(now, deadline))
> > + tmo = min_t(unsigned long,
> > + secs_to_jiffies(ictrl->kato), deadline - now);
> > +
> > + if (!wait_for_completion_timeout(&ccr.complete, tmo)) {
> > + ret = -ETIMEDOUT;
> > + goto out;
> > + }
> > +
> > + completed = true;
> > +
> > +out:
> > + spin_lock_irqsave(&sctrl->lock, flags);
> > + list_del(&ccr.list);
> > + spin_unlock_irqrestore(&sctrl->lock, flags);
> > + if (completed) {
> > + if (ccr.ccrs == NVME_CCR_STATUS_SUCCESS)
> > + return 0;
> > + return -EREMOTEIO;
> > + }
> > + return ret;
>
>
> This part could be made a bit simpler and there is no need for the local
> completed variable:
>
> [...]
> if (!wait_for_completion_timeout(&ccr.complete, tmo))
> ret = -ETIMEDOUT;
>
> out:
> spin_lock_irqsave(&sctrl->lock, flags);
> list_del(&ccr.list);
> spin_unlock_irqrestore(&sctrl->lock, flags);
>
> if (ret || !completion_done(&ccr.complete))
> return ret;
> if (ccr.ccrs == NVME_CCR_STATUS_SUCCESS)
> return 0;
> return -EREMOTEIO;
> }
701
702 if (!wait_for_completion_timeout(&ccr.complete, tmo))
703 ret = -ETIMEDOUT;
704
705 out:
706 spin_lock_irqsave(&sctrl->lock, flags);
707 list_del(&ccr.list);
708 spin_unlock_irqrestore(&sctrl->lock, flags);
709
710 if (ret || !completion_done(&ccr.complete))
711 return ret;
712 if (ccr.ccrs == NVME_CCR_STATUS_SUCCESS)
713 return 0;
714 return -EREMOTEIO;
715 }
Actually, this code has a bug. It does not correctly handle the case
when CCR operation completes with an error. I added line numbers to show
that.
- line 701: AEN, omplete(ccr.complete), x->done++, x->done = 1
- line 702: wait_for_completion_timeout(), x->done--, x->done = 0
- line 710: ret == 0, x->done == 0, completion_done() returns false.
- line 711: return 0;
The problem is that wait_for_completion_timeout() consumes the
completion. This causes completion_done() to return false leading us to
believe CCR operation has not completed.
next prev parent reply other threads:[~2026-10-31 8:22 UTC|newest]
Thread overview: 70+ 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-10-30 10:30 ` Daniel Wagner
2026-10-30 18:52 ` 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-10-30 20:58 ` Randy Jennings
2026-10-30 21:33 ` Mohamed Khalfella
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-10-30 19:42 ` 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-10-30 10:32 ` Daniel Wagner
2026-10-30 19:19 ` 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-10-31 8:21 ` Mohamed Khalfella [this message]
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
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-10-26 18:12 ` 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-10-21 21:23 ` Mohamed Khalfella
2026-10-30 10:29 ` Daniel Wagner
2026-10-30 19:44 ` Mohamed Khalfella
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-10-30 20:05 ` Mohamed Khalfella
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=20261031082155.GC34016-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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.