Author: nwhitehorn
Date: Mon Feb  9 15:58:27 2015
New Revision: 278456
URL: https://svnweb.freebsd.org/changeset/base/278456

Log:
  Mark invalid page table entries correctly for PMAP as well as for the
  hypervisor. This prevents an infinite loop where processes with evicted
  pages would page fault forever when PMAP decided the evicted pages on
  which the process was faulting was actually present and did not need to
  be restored.
  
  Found while building LLVM with make -j32.
  
  Sponsored by: FreeBSD Foundation

Modified:
  head/sys/powerpc/pseries/mmu_phyp.c

Modified: head/sys/powerpc/pseries/mmu_phyp.c
==============================================================================
--- head/sys/powerpc/pseries/mmu_phyp.c Mon Feb  9 13:41:29 2015        
(r278455)
+++ head/sys/powerpc/pseries/mmu_phyp.c Mon Feb  9 15:58:27 2015        
(r278456)
@@ -240,6 +240,7 @@ mphyp_pte_unset(mmu_t mmu, uintptr_t slo
        uint64_t junk;
        int err;
 
+       pvo_pt->pte_hi &= ~LPTE_VALID;
        err = phyp_pft_hcall(H_REMOVE, 1UL << 31, slot,
            pvo_pt->pte_hi & LPTE_AVPN_MASK, 0, &pte.pte_hi, &pte.pte_lo,
            &junk);
@@ -265,6 +266,7 @@ mphyp_pte_change(mmu_t mmu, uintptr_t sl
 
        /* XXX: optimization using H_PROTECT for common case? */
        mphyp_pte_unset(mmu, slot, pvo_pt, vpn);
+       pvo_pt->pte_hi |= LPTE_VALID;
        result = phyp_pft_hcall(H_ENTER, H_EXACT, slot, pvo_pt->pte_hi,
                                pvo_pt->pte_lo, &index, &evicted.pte_lo, &junk);
        if (result != H_SUCCESS)
@@ -286,7 +288,7 @@ mphyp_pte_spillable_ident(u_int ptegidx,
                phyp_pft_hcall(H_READ, 0, slot, 0, 0, &pt.pte_hi, &pt.pte_lo,
                    &junk);
                
-               if (pt.pte_hi & LPTE_SWBITS)
+               if (pt.pte_hi & LPTE_WIRED)
                        continue;
 
                /* This is a candidate, so remember it */
@@ -391,7 +393,7 @@ mphyp_pte_insert(mmu_t mmu, u_int ptegid
                }
        }
 
-       KASSERT(pvo->pvo_pte.lpte.pte_hi == evicted.pte_hi,
+       KASSERT((pvo->pvo_pte.lpte.pte_hi | LPTE_VALID) == evicted.pte_hi,
           ("Unable to find PVO for spilled PTE"));
 
        /*
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to