svn commit: r209351 - projects/ppc64/sys/powerpc/aim

Nathan Whitehorn nwhitehorn at FreeBSD.org
Sat Jun 19 19:09:09 UTC 2010


Author: nwhitehorn
Date: Sat Jun 19 19:09:08 2010
New Revision: 209351
URL: http://svn.freebsd.org/changeset/base/209351

Log:
  Fix a bug where the kernel could panic for large numbers of spilled
  mappings due to looking in the wrong PVO bucket.

Modified:
  projects/ppc64/sys/powerpc/aim/mmu_oea64.c

Modified: projects/ppc64/sys/powerpc/aim/mmu_oea64.c
==============================================================================
--- projects/ppc64/sys/powerpc/aim/mmu_oea64.c	Sat Jun 19 18:52:37 2010	(r209350)
+++ projects/ppc64/sys/powerpc/aim/mmu_oea64.c	Sat Jun 19 19:09:08 2010	(r209351)
@@ -2784,7 +2784,7 @@ moea64_pte_insert(u_int ptegidx, struct 
 	if (pt->pte_hi & LPTE_HID)
 		pvo_pt->pte_hi |= LPTE_HID;
 
-	LIST_FOREACH(pvo, &moea64_pvo_table[ptegidx], pvo_olink) {
+	LIST_FOREACH(pvo, &moea64_pvo_table[pteg_bktidx], pvo_olink) {
 		if (pvo->pvo_pte.lpte.pte_hi == pt->pte_hi) {
 			moea64_pte_unset(pt, &pvo->pvo_pte.lpte, pvo->pvo_vpn);
 			PVO_PTEGIDX_CLR(pvo);
@@ -2793,6 +2793,19 @@ moea64_pte_insert(u_int ptegidx, struct 
 		}
 	}
 
+	if (pvo->pvo_pte.lpte.pte_hi != pt->pte_hi) {
+		/* It could have landed in the secondary PTEG */
+		pteg_bktidx ^= moea64_pteg_mask;
+		LIST_FOREACH(pvo, &moea64_pvo_table[pteg_bktidx], pvo_olink) {
+			if (pvo->pvo_pte.lpte.pte_hi == pt->pte_hi) {
+				moea64_pte_unset(pt, &pvo->pvo_pte.lpte,
+				    pvo->pvo_vpn);
+				PVO_PTEGIDX_CLR(pvo);
+				moea64_pte_overflow++;
+				break;
+			}
+		}
+	}
 	KASSERT(pvo->pvo_pte.lpte.pte_hi == pt->pte_hi,
 	   ("Unable to find PVO for spilled PTE"));
 


More information about the svn-src-projects mailing list