nvme: support command retry delay for admin command
authorMinwoo Im <minwoo.im.dev@gmail.com>
Fri, 8 Jan 2021 14:46:57 +0000 (23:46 +0900)
committerChristoph Hellwig <hch@lst.de>
Tue, 2 Feb 2021 09:26:10 +0000 (10:26 +0100)
The controller can request a delay retrying a failed command by setting
the Command Retry Delay (CRD) field in the Completion Queue Entry.

Currentlty this features is only applied to commands on the I/O queue, but
not to commands on the admin queue.  Retreive the nvme_ctrl from the
request so that no namespace is required and apply the feature to all
commands.

Signed-off-by: Minwoo Im <minwoo.im.dev@gmail.com>
Signed-off-by: Christoph Hellwig <hch@lst.de>
drivers/nvme/host/core.c

index ff0f426..636a88c 100644 (file)
@@ -279,14 +279,13 @@ static blk_status_t nvme_error_status(u16 status)
 
 static void nvme_retry_req(struct request *req)
 {
-       struct nvme_ns *ns = req->q->queuedata;
        unsigned long delay = 0;
        u16 crd;
 
        /* The mask and shift result must be <= 3 */
        crd = (nvme_req(req)->status & NVME_SC_CRD) >> 11;
-       if (ns && crd)
-               delay = ns->ctrl->crdt[crd - 1] * 100;
+       if (crd)
+               delay = nvme_req(req)->ctrl->crdt[crd - 1] * 100;
 
        nvme_req(req)->retries++;
        blk_mq_requeue_request(req, false);