Mercurial > illumos > illumos-gate
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