forked from Minki/linux
nvme: support command retry delay for admin command
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>
This commit is contained in:
parent
60b152a508
commit
f9063a5327
@ -279,14 +279,13 @@ static blk_status_t nvme_error_status(u16 status)
|
|||||||
|
|
||||||
static void nvme_retry_req(struct request *req)
|
static void nvme_retry_req(struct request *req)
|
||||||
{
|
{
|
||||||
struct nvme_ns *ns = req->q->queuedata;
|
|
||||||
unsigned long delay = 0;
|
unsigned long delay = 0;
|
||||||
u16 crd;
|
u16 crd;
|
||||||
|
|
||||||
/* The mask and shift result must be <= 3 */
|
/* The mask and shift result must be <= 3 */
|
||||||
crd = (nvme_req(req)->status & NVME_SC_CRD) >> 11;
|
crd = (nvme_req(req)->status & NVME_SC_CRD) >> 11;
|
||||||
if (ns && crd)
|
if (crd)
|
||||||
delay = ns->ctrl->crdt[crd - 1] * 100;
|
delay = nvme_req(req)->ctrl->crdt[crd - 1] * 100;
|
||||||
|
|
||||||
nvme_req(req)->retries++;
|
nvme_req(req)->retries++;
|
||||||
blk_mq_requeue_request(req, false);
|
blk_mq_requeue_request(req, false);
|
||||||
|
Loading…
Reference in New Issue
Block a user