From: emilne@redhat.com (Ewan D. Milne)
Subject: [PATCH] nvme-fc: correct csn initialization and increments on error
Date: Mon, 08 Apr 2019 17:04:02 -0400 [thread overview]
Message-ID: <64d15879674dbdbda2015d0982edba565eb64f04.camel@redhat.com> (raw)
In-Reply-To: <20190408181519.14086-1-jsmart2021@gmail.com>
On Mon, 2019-04-08@11:15 -0700, James Smart wrote:
> This patch fixes a long-standing bug that initialized the FC-NVME
> cmnd iu CSN value to 1. Early FC-NVME specs had the connection starting
> with CSN=1. By the time the spec reached approval, the language had
> changed to state a connection should start with CSN=0. This patch
> corrects the initialization value for FC-NVME connections.
>
> Additionally, in reviewing the transport, the CSN value is assigned to
> the new IU early in the start routine. It's possible that a later dma
> map request may fail, causing the command to never be sent to the
> controller. Change the location of the assignment so that it is
> immediately prior to calling the lldd. Add a comment block to explain
> the impacts if the lldd were to additionally fail sending the command.
>
> Signed-off-by: Dick Kennedy <dick.kennedy at broadcom.com>
> Signed-off-by: James Smart <jsmart2021 at gmail.com>
> ---
> drivers/nvme/host/fc.c | 23 +++++++++++++++++++----
> 1 file changed, 19 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/nvme/host/fc.c b/drivers/nvme/host/fc.c
> index f3b9d91ba0df..1f30984b2d31 100644
> --- a/drivers/nvme/host/fc.c
> +++ b/drivers/nvme/host/fc.c
> @@ -1845,7 +1845,7 @@ nvme_fc_init_queue(struct nvme_fc_ctrl *ctrl, int idx)
> memset(queue, 0, sizeof(*queue));
> queue->ctrl = ctrl;
> queue->qnum = idx;
> - atomic_set(&queue->csn, 1);
> + atomic_set(&queue->csn, 0);
> queue->dev = ctrl->dev;
>
> if (idx > 0)
> @@ -1887,7 +1887,7 @@ nvme_fc_free_queue(struct nvme_fc_queue *queue)
> */
>
> queue->connection_id = 0;
> - atomic_set(&queue->csn, 1);
> + atomic_set(&queue->csn, 0);
> }
>
> static void
> @@ -2198,8 +2198,6 @@ nvme_fc_start_fcp_op(struct nvme_fc_ctrl *ctrl, struct nvme_fc_queue *queue,
>
> /* format the FC-NVME CMD IU and fcp_req */
> cmdiu->connection_id = cpu_to_be64(queue->connection_id);
> - csn = atomic_inc_return(&queue->csn);
> - cmdiu->csn = cpu_to_be32(csn);
> cmdiu->data_len = cpu_to_be32(data_len);
> switch (io_dir) {
> case NVMEFC_FCP_WRITE:
> @@ -2257,11 +2255,28 @@ nvme_fc_start_fcp_op(struct nvme_fc_ctrl *ctrl, struct nvme_fc_queue *queue,
> if (!(op->flags & FCOP_FLAGS_AEN))
> blk_mq_start_request(op->rq);
>
> + csn = atomic_inc_return(&queue->csn);
> + cmdiu->csn = cpu_to_be32(csn);
> +
> ret = ctrl->lport->ops->fcp_io(&ctrl->lport->localport,
> &ctrl->rport->remoteport,
> queue->lldd_handle, &op->fcp_req);
>
> if (ret) {
> + /*
> + * If the lld fails to send the command is there an issue
> + * with the csn value ? If the command that fails is the
> + * Connect, no - as the connection won't be live. If it's
> + * a command post-connect, it's possible a gap in csn may
> + * be created. Does this matter? As linux initiators don't
> + * send fused commands, no. The gap would exist, but as
> + * there's nothing that depends on csn order to be delivered
> + * on the target side, it shouldn't hurt. It would be
> + * difficult for a target to even detect the csn gap as
> + * it has no idea when the cmd with the csn was supposed
> + * to arrive.
> + */
> +
> opstate = atomic_xchg(&op->state, FCPOP_STATE_COMPLETE);
> __nvme_fc_fcpop_chk_teardowns(ctrl, op, opstate);
>
Reviewed-by: Ewan D. Milne <emilne at redhat.com>
next prev parent reply other threads:[~2019-04-08 21:04 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-04-08 18:15 [PATCH] nvme-fc: correct csn initialization and increments on error James Smart
2019-04-08 21:04 ` Ewan D. Milne [this message]
2019-04-09 10:16 ` Christoph Hellwig
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=64d15879674dbdbda2015d0982edba565eb64f04.camel@redhat.com \
--to=emilne@redhat.com \
/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;
as well as URLs for NNTP newsgroup(s).