changeset 12638:4cce88587bfc

6952813 mr_sas driver is racy, gets kernel page fault panic on Lynx systems
author Susan Scheufele <Susan.Scheufele@Sun.COM>
date Wed, 16 Jun 2010 20:48:30 -0700
parents ea0ebc6fc051
children 884a64bb4385
files usr/src/uts/common/io/mr_sas/mr_sas.c usr/src/uts/common/io/mr_sas/mr_sas.h
diffstat 2 files changed, 19 insertions(+), 17 deletions(-) [+]
line wrap: on
line diff
--- a/usr/src/uts/common/io/mr_sas/mr_sas.c	Wed Jun 16 20:01:06 2010 -0700
+++ b/usr/src/uts/common/io/mr_sas/mr_sas.c	Wed Jun 16 20:48:30 2010 -0700
@@ -1679,20 +1679,6 @@
 	}
 	con_log(CL_ANN1, (CE_NOTE, "chkpnt:%s:%d", __func__, __LINE__));
 
-	producer = ddi_get32(instance->mfi_internal_dma_obj.acc_handle,
-	    instance->producer);
-	consumer = ddi_get32(instance->mfi_internal_dma_obj.acc_handle,
-	    instance->consumer);
-
-	con_log(CL_ANN1, (CE_NOTE, " producer %x consumer %x ",
-	    producer, consumer));
-	if (producer == consumer) {
-		con_log(CL_ANN1, (CE_WARN, "producer =  consumer case"));
-		DTRACE_PROBE2(isr_pc_err, uint32_t, producer,
-		    uint32_t, consumer);
-		return (DDI_INTR_CLAIMED);
-	}
-
 #ifdef OCRDEBUG
 	if (debug_consecutive_timeout_after_ocr_g == 1) {
 		con_log(CL_ANN1, (CE_NOTE,
@@ -1716,6 +1702,22 @@
 	mutex_enter(&instance->completed_pool_mtx);
 	mutex_enter(&instance->cmd_pend_mtx);
 
+	producer = ddi_get32(instance->mfi_internal_dma_obj.acc_handle,
+	    instance->producer);
+	consumer = ddi_get32(instance->mfi_internal_dma_obj.acc_handle,
+	    instance->consumer);
+
+	con_log(CL_ANN1, (CE_NOTE, " producer %x consumer %x ",
+	    producer, consumer));
+	if (producer == consumer) {
+		con_log(CL_ANN1, (CE_WARN, "producer =  consumer case"));
+		DTRACE_PROBE2(isr_pc_err, uint32_t, producer,
+		    uint32_t, consumer);
+		mutex_exit(&instance->completed_pool_mtx);
+		mutex_exit(&instance->cmd_pend_mtx);
+		return (DDI_INTR_CLAIMED);
+	}
+
 	while (consumer != producer) {
 		context = ddi_get32(instance->mfi_internal_dma_obj.acc_handle,
 		    &instance->reply_queue[consumer]);
@@ -1740,11 +1742,11 @@
 			consumer = 0;
 		}
 	}
+	ddi_put32(instance->mfi_internal_dma_obj.acc_handle,
+	    instance->consumer, consumer);
 	mutex_exit(&instance->cmd_pend_mtx);
 	mutex_exit(&instance->completed_pool_mtx);
 
-	ddi_put32(instance->mfi_internal_dma_obj.acc_handle,
-	    instance->consumer, consumer);
 	(void) ddi_dma_sync(instance->mfi_internal_dma_obj.dma_handle,
 	    0, 0, DDI_DMA_SYNC_FORDEV);
 
--- a/usr/src/uts/common/io/mr_sas/mr_sas.h	Wed Jun 16 20:01:06 2010 -0700
+++ b/usr/src/uts/common/io/mr_sas/mr_sas.h	Wed Jun 16 20:48:30 2010 -0700
@@ -49,7 +49,7 @@
 /*
  * MegaRAID SAS2.0 Driver meta data
  */
-#define	MRSAS_VERSION				"LSIv2.6"
+#define	MRSAS_VERSION				"LSIv2.7"
 #define	MRSAS_RELDATE				"Apr 21, 2010"
 
 #define	MRSAS_TRUE				1