Mercurial > illumos > illumos-gate
changeset 12716:e5de7a3edad2
6964515 interrupt remapping panics on big machines
author | Frank Van Der Linden <frank.van.der.linden@oracle.com> |
---|---|
date | Mon, 28 Jun 2010 13:50:20 -0700 |
parents | cdbca398ec82 |
children | 1cb0b42b763e |
files | usr/src/uts/i86pc/io/immu.c usr/src/uts/i86pc/io/immu_dvma.c usr/src/uts/i86pc/io/immu_intrmap.c usr/src/uts/i86pc/io/immu_qinv.c usr/src/uts/i86pc/sys/immu.h |
diffstat | 5 files changed, 21 insertions(+), 11 deletions(-) [+] |
line wrap: on
line diff
--- a/usr/src/uts/i86pc/io/immu.c Mon Jun 28 12:31:34 2010 -0700 +++ b/usr/src/uts/i86pc/io/immu.c Mon Jun 28 13:50:20 2010 -0700 @@ -849,8 +849,10 @@ immu_regs_setup(&immu_list); /* subsequent code needs this first */ immu_dvma_setup(&immu_list); - immu_intrmap_setup(&immu_list); - immu_qinv_setup(&immu_list); + if (immu_qinv_setup(&immu_list) == DDI_SUCCESS) + immu_intrmap_setup(&immu_list); + else + immu_intrmap_enable = B_FALSE; mutex_exit(&immu_lock); }
--- a/usr/src/uts/i86pc/io/immu_dvma.c Mon Jun 28 12:31:34 2010 -0700 +++ b/usr/src/uts/i86pc/io/immu_dvma.c Mon Jun 28 13:50:20 2010 -0700 @@ -88,13 +88,13 @@ static ddi_dma_attr_t immu_dma_attr = { DMA_ATTR_V0, 0U, - 0xffffffffU, + 0xffffffffffffffffULL, 0xffffffffU, MMU_PAGESIZE, /* MMU page aligned */ 0x1, 0x1, 0xffffffffU, - 0xffffffffU, + 0xffffffffffffffffULL, 1, 4, 0
--- a/usr/src/uts/i86pc/io/immu_intrmap.c Mon Jun 28 12:31:34 2010 -0700 +++ b/usr/src/uts/i86pc/io/immu_intrmap.c Mon Jun 28 13:50:20 2010 -0700 @@ -280,6 +280,7 @@ bitset_add(&intrmap->intrmap_map, idx + i); } mutex_exit(&intrmap->intrmap_lock); + break; } mutex_exit(&intrmap->intrmap_lock); @@ -305,13 +306,13 @@ ddi_dma_attr_t intrmap_dma_attr = { DMA_ATTR_V0, 0U, - 0xffffffffU, + 0xffffffffffffffffULL, 0xffffffffU, MMU_PAGESIZE, /* page aligned */ 0x1, 0x1, 0xffffffffU, - 0xffffffffU, + 0xffffffffffffffffULL, 1, 4, 0
--- a/usr/src/uts/i86pc/io/immu_qinv.c Mon Jun 28 12:31:34 2010 -0700 +++ b/usr/src/uts/i86pc/io/immu_qinv.c Mon Jun 28 13:50:20 2010 -0700 @@ -502,13 +502,13 @@ ddi_dma_attr_t qinv_dma_attr = { DMA_ATTR_V0, 0U, - 0xffffffffU, + 0xffffffffffffffffULL, 0xffffffffU, MMU_PAGESIZE, /* page aligned */ 0x1, 0x1, 0xffffffffU, - 0xffffffffU, + 0xffffffffffffffffULL, 1, 4, 0 @@ -651,21 +651,28 @@ /* * initialize invalidation request queue structure. */ -void +int immu_qinv_setup(list_t *listp) { immu_t *immu; + int nerr; if (immu_qinv_enable == B_FALSE) { - return; + return (DDI_FAILURE); } + nerr = 0; immu = list_head(listp); for (; immu; immu = list_next(listp, immu)) { if (qinv_setup(immu) == DDI_SUCCESS) { immu->immu_qinv_setup = B_TRUE; + } else { + nerr++; + break; } } + + return (nerr > 0 ? DDI_FAILURE : DDI_SUCCESS); } void
--- a/usr/src/uts/i86pc/sys/immu.h Mon Jun 28 12:31:34 2010 -0700 +++ b/usr/src/uts/i86pc/sys/immu.h Mon Jun 28 13:50:20 2010 -0700 @@ -861,7 +861,7 @@ /* immu_qinv.c interfaces */ -void immu_qinv_setup(list_t *immu_list); +int immu_qinv_setup(list_t *immu_list); void immu_qinv_startup(immu_t *immu); void immu_qinv_shutdown(immu_t *immu); void immu_qinv_destroy(list_t *immu_list);