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