svn commit: r328684 - stable/11/sys/dev/nvme

Alexander Motin mav at FreeBSD.org
Thu Feb 1 16:45:09 UTC 2018


Author: mav
Date: Thu Feb  1 16:45:08 2018
New Revision: 328684
URL: https://svnweb.freebsd.org/changeset/base/328684

Log:
  MFC r322443 (by nwhitehorn):
  Move NVME controller shutdown from being called as part of module unloading
  to being called through the newbus DEVICE_SHUTDOWN() path. This ensures that
  the NVME controller gets shut down before the device and bus disappear
  and prevents data corruption on shutdown on at least Samsung EVO 960 SSDs.
  
  PR:		kern/211852

Modified:
  stable/11/sys/dev/nvme/nvme.c
Directory Properties:
  stable/11/   (props changed)

Modified: stable/11/sys/dev/nvme/nvme.c
==============================================================================
--- stable/11/sys/dev/nvme/nvme.c	Thu Feb  1 16:44:19 2018	(r328683)
+++ stable/11/sys/dev/nvme/nvme.c	Thu Feb  1 16:45:08 2018	(r328684)
@@ -58,6 +58,7 @@ MALLOC_DEFINE(M_NVME, "nvme", "nvme(4) memory allocati
 static int    nvme_probe(device_t);
 static int    nvme_attach(device_t);
 static int    nvme_detach(device_t);
+static int    nvme_shutdown(device_t);
 static int    nvme_modevent(module_t mod, int type, void *arg);
 
 static devclass_t nvme_devclass;
@@ -67,6 +68,7 @@ static device_method_t nvme_pci_methods[] = {
 	DEVMETHOD(device_probe,     nvme_probe),
 	DEVMETHOD(device_attach,    nvme_attach),
 	DEVMETHOD(device_detach,    nvme_detach),
+	DEVMETHOD(device_shutdown,  nvme_shutdown),
 	{ 0, 0 }
 };
 
@@ -180,22 +182,15 @@ nvme_unload(void)
 {
 }
 
-static void
-nvme_shutdown(void)
+static int
+nvme_shutdown(device_t dev)
 {
-	device_t		*devlist;
 	struct nvme_controller	*ctrlr;
-	int			dev, devcount;
 
-	if (devclass_get_devices(nvme_devclass, &devlist, &devcount))
-		return;
+	ctrlr = DEVICE2SOFTC(dev);
+	nvme_ctrlr_shutdown(ctrlr);
 
-	for (dev = 0; dev < devcount; dev++) {
-		ctrlr = DEVICE2SOFTC(devlist[dev]);
-		nvme_ctrlr_shutdown(ctrlr);
-	}
-
-	free(devlist, M_TEMP);
+	return (0);
 }
 
 static int
@@ -208,9 +203,6 @@ nvme_modevent(module_t mod, int type, void *arg)
 		break;
 	case MOD_UNLOAD:
 		nvme_unload();
-		break;
-	case MOD_SHUTDOWN:
-		nvme_shutdown();
 		break;
 	default:
 		break;


More information about the svn-src-all mailing list