summaryrefslogtreecommitdiffstats
path: root/sys/dev/nvme/nvme_ctrlr.c
diff options
context:
space:
mode:
authorjimharris <jimharris@FreeBSD.org>2013-03-26 20:02:35 +0000
committerjimharris <jimharris@FreeBSD.org>2013-03-26 20:02:35 +0000
commit83032bc2394df6e15ddb874995f794f0c8c660b1 (patch)
tree5ebc789383fbca5abbead81ca4e0081cc57c742d /sys/dev/nvme/nvme_ctrlr.c
parent711dabaf432762eec4942b5f5f7611e7df825260 (diff)
downloadFreeBSD-src-83032bc2394df6e15ddb874995f794f0c8c660b1.zip
FreeBSD-src-83032bc2394df6e15ddb874995f794f0c8c660b1.tar.gz
Add a tunable for the I/O timeout interval. Default is still 30 seconds,
but can be adjusted between a min/max of 5 and 120 seconds. Sponsored by: Intel Reviewed by: carl
Diffstat (limited to 'sys/dev/nvme/nvme_ctrlr.c')
-rw-r--r--sys/dev/nvme/nvme_ctrlr.c13
1 files changed, 10 insertions, 3 deletions
diff --git a/sys/dev/nvme/nvme_ctrlr.c b/sys/dev/nvme/nvme_ctrlr.c
index f759a60..6328134 100644
--- a/sys/dev/nvme/nvme_ctrlr.c
+++ b/sys/dev/nvme/nvme_ctrlr.c
@@ -592,10 +592,10 @@ nvme_ctrlr_construct_and_submit_aer(struct nvme_controller *ctrlr,
aer->req = req;
/*
- * Override default timeout value here, since asynchronous event
- * requests should by nature never be timed out.
+ * Disable timeout here, since asynchronous event requests should by
+ * nature never be timed out.
*/
- req->timeout = 0;
+ req->timeout = FALSE;
req->cmd.opc = NVME_OPC_ASYNC_EVENT_REQUEST;
nvme_ctrlr_submit_admin_request(ctrlr, req);
}
@@ -791,6 +791,7 @@ nvme_ctrlr_construct(struct nvme_controller *ctrlr, device_t dev)
union cap_lo_register cap_lo;
union cap_hi_register cap_hi;
int num_vectors, per_cpu_io_queues, status = 0;
+ int timeout_period;
ctrlr->dev = dev;
ctrlr->is_started = FALSE;
@@ -822,6 +823,12 @@ nvme_ctrlr_construct(struct nvme_controller *ctrlr, device_t dev)
cap_lo.raw = nvme_mmio_read_4(ctrlr, cap_lo);
ctrlr->ready_timeout_in_ms = cap_lo.bits.to * 500;
+ timeout_period = NVME_DEFAULT_TIMEOUT_PERIOD;
+ TUNABLE_INT_FETCH("hw.nvme.timeout_period", &timeout_period);
+ timeout_period = min(timeout_period, NVME_MAX_TIMEOUT_PERIOD);
+ timeout_period = max(timeout_period, NVME_MIN_TIMEOUT_PERIOD);
+ ctrlr->timeout_period = timeout_period;
+
per_cpu_io_queues = 1;
TUNABLE_INT_FETCH("hw.nvme.per_cpu_io_queues", &per_cpu_io_queues);
ctrlr->per_cpu_io_queues = per_cpu_io_queues ? TRUE : FALSE;
OpenPOWER on IntegriCloud