lkml.org 
[lkml]   [2020]   [Sep]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.8 050/177] nvme-fabrics: allow to queue requests for live queues
    Date
    From: Sagi Grimberg <sagi@grimberg.me>

    [ Upstream commit 73a5379937ec89b91e907bb315e2434ee9696a2c ]

    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")
    Reviewed-by: James Smart <james.smart@broadcom.com>
    Signed-off-by: Sagi Grimberg <sagi@grimberg.me>
    Signed-off-by: Christoph Hellwig <hch@lst.de>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    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 4ec4829d62334..7799d032bf38b 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;

    /*
    @@ -578,7 +582,7 @@ bool __nvmf_check_ready(struct nvme_ctrl *ctrl, struct request *rq,
    switch (ctrl->state) {
    case NVME_CTRL_NEW:
    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;
    --
    2.25.1


    \
     
     \ /
      Last update: 2020-09-16 01:36    [W:2.228 / U:0.576 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site