diff options
author | Susan Scheufele <Susan.Scheufele@Sun.COM> | 2010-06-16 20:48:30 -0700 |
---|---|---|
committer | Susan Scheufele <Susan.Scheufele@Sun.COM> | 2010-06-16 20:48:30 -0700 |
commit | b13a95430748795770df36722891ee4065f08f5a (patch) | |
tree | 6148ab7da555e3160f34eb283dcf8a44f9a9135d /usr/src | |
parent | 8d61a337e3509e92fccb0fdeb26db712c21d43cd (diff) | |
download | illumos-gate-b13a95430748795770df36722891ee4065f08f5a.tar.gz |
6952813 mr_sas driver is racy, gets kernel page fault panic on Lynx systems
Diffstat (limited to 'usr/src')
-rw-r--r-- | usr/src/uts/common/io/mr_sas/mr_sas.c | 34 | ||||
-rw-r--r-- | usr/src/uts/common/io/mr_sas/mr_sas.h | 2 |
2 files changed, 19 insertions, 17 deletions
diff --git a/usr/src/uts/common/io/mr_sas/mr_sas.c b/usr/src/uts/common/io/mr_sas/mr_sas.c index 7af147e9fd..64833a57d3 100644 --- a/usr/src/uts/common/io/mr_sas/mr_sas.c +++ b/usr/src/uts/common/io/mr_sas/mr_sas.c @@ -1679,20 +1679,6 @@ mrsas_isr(struct mrsas_instance *instance) } 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 @@ mrsas_isr(struct mrsas_instance *instance) 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 @@ mrsas_isr(struct mrsas_instance *instance) 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); diff --git a/usr/src/uts/common/io/mr_sas/mr_sas.h b/usr/src/uts/common/io/mr_sas/mr_sas.h index 7d2e21de2b..c438a2433b 100644 --- a/usr/src/uts/common/io/mr_sas/mr_sas.h +++ b/usr/src/uts/common/io/mr_sas/mr_sas.h @@ -49,7 +49,7 @@ extern "C" { /* * 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 |