[PATCH v3 2/9] nvme-fabrics: allow to queue requests for live queues
James Smart
james.smart at broadcom.com
Thu Aug 20 16:56:00 EDT 2020
On 8/19/2020 10:36 PM, Sagi Grimberg wrote:
> Right now we are failing requests based on the controller state (which
> is checked inline in nvmf_check_ready) however we should definitely
> accept requests if the queue is live.
>
> When entering controller reset, we transition the controller into
> NVME_CTRL_RESETTING, and then return BLK_STS_RESOURCE for non-mpath
> requests (have blk_noretry_request set).
>
> This is also the case for NVME_REQ_USER for the wrong reason. There
> shouldn't be any reason for us to reject this I/O in a controller reset.
> We do want to prevent passthru commands on the admin queue because we
> need the controller to fully initialize first before we let user passthru
> admin commands to be issued.
>
> In a non-mpath setup, this means that the requests will simply be
> requeued over and over forever not allowing the q_usage_counter to drop
> its final reference, causing controller reset to hang if running
> concurrently with heavy I/O.
>
> Fixes: 35897b920c8a ("nvme-fabrics: fix and refine state checks in __nvmf_check_ready")
> Signed-off-by: Sagi Grimberg <sagi at grimberg.me>
> ---
> drivers/nvme/host/fabrics.c | 12 ++++++++----
> 1 file changed, 8 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/nvme/host/fabrics.c b/drivers/nvme/host/fabrics.c
> index 32f61fc5f4c5..8575724734e0 100644
> --- a/drivers/nvme/host/fabrics.c
> +++ b/drivers/nvme/host/fabrics.c
> @@ -565,10 +565,14 @@ bool __nvmf_check_ready(struct nvme_ctrl *ctrl, struct request *rq,
> struct nvme_request *req = nvme_req(rq);
>
> /*
> - * If we are in some state of setup or teardown only allow
> - * internally generated commands.
> + * currently we have a problem sending passthru commands
> + * on the admin_q if the controller is not LIVE because we can't
> + * make sure that they are going out after the admin connect,
> + * controller enable and/or other commands in the initialization
> + * sequence. until the controller will be LIVE, fail with
> + * BLK_STS_RESOURCE so that they will be rescheduled.
> */
> - if (!blk_rq_is_passthrough(rq) || (req->flags & NVME_REQ_USERCMD))
> + if (rq->q == ctrl->admin_q && (req->flags & NVME_REQ_USERCMD))
> return false;
>
> /*
> @@ -577,7 +581,7 @@ bool __nvmf_check_ready(struct nvme_ctrl *ctrl, struct request *rq,
> */
> switch (ctrl->state) {
> case NVME_CTRL_CONNECTING:
> - if (nvme_is_fabrics(req->cmd) &&
> + if (blk_rq_is_passthrough(rq) && nvme_is_fabrics(req->cmd) &&
> req->cmd->fabrics.fctype == nvme_fabrics_type_connect)
> return true;
> break;
Reviewed-by: James Smart <james.smart at broadcom.com>
-- james
More information about the Linux-nvme
mailing list