From e8ba2a389f6ca6999ca72dabbe2871e894bf6b67 Mon Sep 17 00:00:00 2001 From: Hans Rosenfeld Date: Tue, 16 Aug 2016 23:20:07 +0200 Subject: [PATCH] 7313 bump nvme admin command timeout to 1s Reviewed by: Yuri Pankov Reviewed by: Rick McNeal Reviewed by: Richard Lowe Reviewed by: Garrett D'Amore Reviewed by: Dan McDonald Approved by: Robert Mustacchi --- usr/src/uts/common/io/nvme/nvme.c | 23 +++++++++++++---------- usr/src/uts/common/io/nvme/nvme_var.h | 3 +-- 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/usr/src/uts/common/io/nvme/nvme.c b/usr/src/uts/common/io/nvme/nvme.c index 7c82d01607..063c0fcc64 100644 --- a/usr/src/uts/common/io/nvme/nvme.c +++ b/usr/src/uts/common/io/nvme/nvme.c @@ -192,6 +192,9 @@ static const int nvme_version_major = 1; static const int nvme_version_minor = 0; +/* tunable for admin command timeout in seconds, default is 1s */ +static volatile int nvme_admin_cmd_timeout = 1; + static int nvme_attach(dev_info_t *, ddi_attach_cmd_t); static int nvme_detach(dev_info_t *, ddi_detach_cmd_t); static int nvme_quiesce(dev_info_t *); @@ -1085,7 +1088,7 @@ nvme_abort_cmd(nvme_cmd_t *abort_cmd) * Send the ABORT to the hardware. The ABORT command will return _after_ * the aborted command has completed (aborted or otherwise). */ - if (nvme_admin_cmd(cmd, NVME_ADMIN_CMD_TIMEOUT) != DDI_SUCCESS) { + if (nvme_admin_cmd(cmd, nvme_admin_cmd_timeout) != DDI_SUCCESS) { sema_v(&nvme->n_abort_sema); dev_err(nvme->n_dip, CE_WARN, "!nvme_admin_cmd failed for ABORT"); @@ -1119,9 +1122,9 @@ nvme_abort_cmd(nvme_cmd_t *abort_cmd) * will be declared dead and FMA will be notified. */ static boolean_t -nvme_wait_cmd(nvme_cmd_t *cmd, uint_t usec) +nvme_wait_cmd(nvme_cmd_t *cmd, uint_t sec) { - clock_t timeout = ddi_get_lbolt() + drv_usectohz(usec); + clock_t timeout = ddi_get_lbolt() + drv_usectohz(sec * MICROSEC); nvme_t *nvme = cmd->nc_nvme; nvme_reg_csts_t csts; @@ -1355,7 +1358,7 @@ nvme_async_event_task(void *arg) } static int -nvme_admin_cmd(nvme_cmd_t *cmd, int usec) +nvme_admin_cmd(nvme_cmd_t *cmd, int sec) { int ret; @@ -1371,7 +1374,7 @@ nvme_admin_cmd(nvme_cmd_t *cmd, int usec) return (DDI_FAILURE); } - if (nvme_wait_cmd(cmd, usec) == B_FALSE) { + if (nvme_wait_cmd(cmd, sec) == B_FALSE) { /* * The command timed out. An abort command was posted that * will take care of the cleanup. @@ -1474,7 +1477,7 @@ nvme_get_logpage(nvme_t *nvme, uint8_t logpage, ...) cmd->nc_dma->nd_cookie.dmac_laddress; } - if (nvme_admin_cmd(cmd, NVME_ADMIN_CMD_TIMEOUT) != DDI_SUCCESS) { + if (nvme_admin_cmd(cmd, nvme_admin_cmd_timeout) != DDI_SUCCESS) { dev_err(nvme->n_dip, CE_WARN, "!nvme_admin_cmd failed for GET LOG PAGE"); return (NULL); @@ -1530,7 +1533,7 @@ nvme_identify(nvme_t *nvme, uint32_t nsid) cmd->nc_dma->nd_cookie.dmac_laddress; } - if (nvme_admin_cmd(cmd, NVME_ADMIN_CMD_TIMEOUT) != DDI_SUCCESS) { + if (nvme_admin_cmd(cmd, nvme_admin_cmd_timeout) != DDI_SUCCESS) { dev_err(nvme->n_dip, CE_WARN, "!nvme_admin_cmd failed for IDENTIFY"); return (NULL); @@ -1566,7 +1569,7 @@ nvme_set_nqueues(nvme_t *nvme, uint16_t nqueues) cmd->nc_sqe.sqe_cdw10 = NVME_FEAT_NQUEUES; cmd->nc_sqe.sqe_cdw11 = nq.r; - if (nvme_admin_cmd(cmd, NVME_ADMIN_CMD_TIMEOUT) != DDI_SUCCESS) { + if (nvme_admin_cmd(cmd, nvme_admin_cmd_timeout) != DDI_SUCCESS) { dev_err(nvme->n_dip, CE_WARN, "!nvme_admin_cmd failed for SET FEATURES (NQUEUES)"); return (0); @@ -1612,7 +1615,7 @@ nvme_create_io_qpair(nvme_t *nvme, nvme_qpair_t *qp, uint16_t idx) cmd->nc_sqe.sqe_cdw11 = c_dw11.r; cmd->nc_sqe.sqe_dptr.d_prp[0] = qp->nq_cqdma->nd_cookie.dmac_laddress; - if (nvme_admin_cmd(cmd, NVME_ADMIN_CMD_TIMEOUT) != DDI_SUCCESS) { + if (nvme_admin_cmd(cmd, nvme_admin_cmd_timeout) != DDI_SUCCESS) { dev_err(nvme->n_dip, CE_WARN, "!nvme_admin_cmd failed for CREATE CQUEUE"); return (DDI_FAILURE); @@ -1639,7 +1642,7 @@ nvme_create_io_qpair(nvme_t *nvme, nvme_qpair_t *qp, uint16_t idx) cmd->nc_sqe.sqe_cdw11 = s_dw11.r; cmd->nc_sqe.sqe_dptr.d_prp[0] = qp->nq_sqdma->nd_cookie.dmac_laddress; - if (nvme_admin_cmd(cmd, NVME_ADMIN_CMD_TIMEOUT) != DDI_SUCCESS) { + if (nvme_admin_cmd(cmd, nvme_admin_cmd_timeout) != DDI_SUCCESS) { dev_err(nvme->n_dip, CE_WARN, "!nvme_admin_cmd failed for CREATE SQUEUE"); return (DDI_FAILURE); diff --git a/usr/src/uts/common/io/nvme/nvme_var.h b/usr/src/uts/common/io/nvme/nvme_var.h index 8071da3872..f23e63b5db 100644 --- a/usr/src/uts/common/io/nvme/nvme_var.h +++ b/usr/src/uts/common/io/nvme/nvme_var.h @@ -10,7 +10,7 @@ */ /* - * Copyright 2015 Nexenta Systems, Inc. All rights reserved. + * Copyright 2016 Nexenta Systems, Inc. All rights reserved. */ #ifndef _NVME_VAR_H @@ -42,7 +42,6 @@ #define NVME_DEFAULT_ASYNC_EVENT_LIMIT 10 #define NVME_MIN_ASYNC_EVENT_LIMIT 1 -#define NVME_ADMIN_CMD_TIMEOUT 100000 typedef struct nvme nvme_t; typedef struct nvme_namespace nvme_namespace_t; -- 2.11.4.GIT