changeset 9935:41052599accc

6849914 corrupted lock causes panic in nxge
author Michael Speer <Michael.Speer@Sun.COM>
date Mon, 22 Jun 2009 13:20:44 -0700
parents a4bd03644408
children c1b18c725b3b
files usr/src/uts/common/io/nxge/nxge_main.c
diffstat 1 files changed, 17 insertions(+), 15 deletions(-) [+]
line wrap: on
line diff
--- a/usr/src/uts/common/io/nxge/nxge_main.c	Mon Jun 22 16:00:45 2009 -0400
+++ b/usr/src/uts/common/io/nxge/nxge_main.c	Mon Jun 22 13:20:44 2009 -0700
@@ -385,9 +385,9 @@
  * mutually exclusive access to the list.
  */
 void 			*nxge_list = NULL;
-
 void			*nxge_hw_list = NULL;
 nxge_os_mutex_t 	nxge_common_lock;
+nxge_os_mutex_t 	nxgedebuglock;
 
 extern uint64_t 	npi_debug_level;
 
@@ -1786,10 +1786,6 @@
 	NXGE_NPI_PIO_WRITE64(nxgep->npi_handle, reg, buf[1]);
 }
 
-
-nxge_os_mutex_t nxgedebuglock;
-int nxge_debug_init = 0;
-
 /*ARGSUSED*/
 /*VARARGS*/
 void
@@ -1815,11 +1811,6 @@
 	    (level == NXGE_NOTE) ||
 	    (level == NXGE_ERR_CTL)) {
 		/* do the msg processing */
-		if (nxge_debug_init == 0) {
-			MUTEX_INIT(&nxgedebuglock, NULL, MUTEX_DRIVER, NULL);
-			nxge_debug_init = 1;
-		}
-
 		MUTEX_ENTER(&nxgedebuglock);
 
 		if ((level & NXGE_NOTE)) {
@@ -5390,14 +5381,19 @@
 {
 	int		status;
 
+	MUTEX_INIT(&nxgedebuglock, NULL, MUTEX_DRIVER, NULL);
+
 	NXGE_DEBUG_MSG((NULL, MOD_CTL, "==> _init"));
+
 	mac_init_ops(&nxge_dev_ops, "nxge");
+
 	status = ddi_soft_state_init(&nxge_list, sizeof (nxge_t), 0);
 	if (status != 0) {
 		NXGE_ERROR_MSG((NULL, NXGE_ERR_CTL,
 		    "failed to init device soft state"));
 		goto _init_exit;
 	}
+
 	status = mod_install(&modlinkage);
 	if (status != 0) {
 		ddi_soft_state_fini(&nxge_list);
@@ -5407,9 +5403,12 @@
 
 	MUTEX_INIT(&nxge_common_lock, NULL, MUTEX_DRIVER, NULL);
 
+	NXGE_DEBUG_MSG((NULL, MOD_CTL, "<== _init status = 0x%X", status));
+	return (status);
+
 _init_exit:
-	NXGE_DEBUG_MSG((NULL, MOD_CTL, "_init status = 0x%X", status));
-
+	NXGE_DEBUG_MSG((NULL, MOD_CTL, "<== _init status = 0x%X", status));
+	MUTEX_DESTROY(&nxgedebuglock);
 	return (status);
 }
 
@@ -5419,7 +5418,6 @@
 	int		status;
 
 	NXGE_DEBUG_MSG((NULL, MOD_CTL, "==> _fini"));
-
 	NXGE_DEBUG_MSG((NULL, MOD_CTL, "==> _fini: mod_remove"));
 
 	if (nxge_mblks_pending)
@@ -5437,10 +5435,14 @@
 
 	ddi_soft_state_fini(&nxge_list);
 
+	NXGE_DEBUG_MSG((NULL, MOD_CTL, "<== _fini status = 0x%08x", status));
+
 	MUTEX_DESTROY(&nxge_common_lock);
+	MUTEX_DESTROY(&nxgedebuglock);
+	return (status);
+
 _fini_exit:
-	NXGE_DEBUG_MSG((NULL, MOD_CTL, "_fini status = 0x%08x", status));
-
+	NXGE_DEBUG_MSG((NULL, MOD_CTL, "<== _fini status = 0x%08x", status));
 	return (status);
 }