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);