svn commit: r366707 - head/sys/dev/nvme

Alexander Motin mav at FreeBSD.org
Wed Oct 14 15:50:28 UTC 2020


Author: mav
Date: Wed Oct 14 15:50:28 2020
New Revision: 366707
URL: https://svnweb.freebsd.org/changeset/base/366707

Log:
  Use RTD3 Entry Latency value as shutdown timeout.
  
  This field was not in specs when the driver was written, but now there
  are SSDs with the reported latency of 10s, where hardcoded value of 5s
  seems to be not enough sometimes, causing shutdown timeout messages.
  
  MFC after:	1 week
  Sponsored by:	iXsystems, Inc.

Modified:
  head/sys/dev/nvme/nvme_ctrlr.c

Modified: head/sys/dev/nvme/nvme_ctrlr.c
==============================================================================
--- head/sys/dev/nvme/nvme_ctrlr.c	Wed Oct 14 15:31:42 2020	(r366706)
+++ head/sys/dev/nvme/nvme_ctrlr.c	Wed Oct 14 15:50:28 2020	(r366707)
@@ -1510,22 +1510,24 @@ nvme_ctrlr_shutdown(struct nvme_controller *ctrlr)
 {
 	uint32_t	cc;
 	uint32_t	csts;
-	int		ticks = 0;
+	int		ticks = 0, timeout;
 
 	cc = nvme_mmio_read_4(ctrlr, cc);
 	cc &= ~(NVME_CC_REG_SHN_MASK << NVME_CC_REG_SHN_SHIFT);
 	cc |= NVME_SHN_NORMAL << NVME_CC_REG_SHN_SHIFT;
 	nvme_mmio_write_4(ctrlr, cc, cc);
 
+	timeout = ctrlr->cdata.rtd3e == 0 ? 5 * hz :
+	    ((uint64_t)ctrlr->cdata.rtd3e * hz + 999999) / 1000000;
 	while (1) {
 		csts = nvme_mmio_read_4(ctrlr, csts);
 		if (csts == 0xffffffff)		/* Hot unplug. */
 			break;
 		if (NVME_CSTS_GET_SHST(csts) == NVME_SHST_COMPLETE)
 			break;
-		if (ticks++ > 5*hz) {
+		if (ticks++ > timeout) {
 			nvme_printf(ctrlr, "did not complete shutdown within"
-			    " 5 seconds of notification\n");
+			    " %d ticks of notification\n", timeout);
 			break;
 		}
 		pause("nvme shn", 1);


More information about the svn-src-all mailing list