svn commit: r212257 - in user/nwhitehorn/ps3/powerpc: aim ps3

Nathan Whitehorn nwhitehorn at FreeBSD.org
Mon Sep 6 13:47:12 UTC 2010


Author: nwhitehorn
Date: Mon Sep  6 13:47:11 2010
New Revision: 212257
URL: http://svn.freebsd.org/changeset/base/212257

Log:
  Add some seatbelts to mmu_ps3 and fiddle the SLB allocator some more
  following advice from alc. PS3 still hangs in low-memory situations.

Modified:
  user/nwhitehorn/ps3/powerpc/aim/slb.c
  user/nwhitehorn/ps3/powerpc/ps3/mmu_ps3.c

Modified: user/nwhitehorn/ps3/powerpc/aim/slb.c
==============================================================================
--- user/nwhitehorn/ps3/powerpc/aim/slb.c	Mon Sep  6 13:17:01 2010	(r212256)
+++ user/nwhitehorn/ps3/powerpc/aim/slb.c	Mon Sep  6 13:47:11 2010	(r212257)
@@ -316,22 +316,10 @@ slb_uma_cache_alloc(uma_zone_t zone, int
 	if ((wait & M_ZERO) && (m->flags & PG_ZERO) == 0)
 		bzero(va, PAGE_SIZE);
 
-        return (va);
-}
-
-static void
-slb_uma_cache_free(void *mem, int size, u_int8_t flags)
-{
-	vm_page_t m;
+	/* vm_phys_alloc_contig does not track wiring */
+	m->wire_count = 1;
 
-	if (!hw_direct_map)
-		pmap_remove(kernel_pmap,(vm_offset_t)mem,
-		    (vm_offset_t)mem + PAGE_SIZE);
-
-	m = PHYS_TO_VM_PAGE((vm_offset_t)mem);
-	vm_page_lock_queues();
-	vm_phys_free_pages(m, 0);
-	vm_page_unlock_queues();
+	return (va);
 }
 
 static void
@@ -343,10 +331,8 @@ slb_zone_init(void *dummy)
 	slb_cache_zone = uma_zcreate("SLB cache", 64*sizeof(struct slb),
 	    NULL, NULL, NULL, NULL, UMA_ALIGN_PTR, UMA_ZONE_VM);
 
-	if (platform_real_maxaddr() != VM_MAX_ADDRESS) {
+	if (platform_real_maxaddr() != VM_MAX_ADDRESS)
 		uma_zone_set_allocf(slb_cache_zone, slb_uma_cache_alloc);
-		uma_zone_set_freef(slb_cache_zone, slb_uma_cache_free);
-	}
 }
 
 struct slb *

Modified: user/nwhitehorn/ps3/powerpc/ps3/mmu_ps3.c
==============================================================================
--- user/nwhitehorn/ps3/powerpc/ps3/mmu_ps3.c	Mon Sep  6 13:17:01 2010	(r212256)
+++ user/nwhitehorn/ps3/powerpc/ps3/mmu_ps3.c	Mon Sep  6 13:47:11 2010	(r212257)
@@ -259,6 +259,7 @@ mps3_pte_insert(u_int ptegidx, struct lp
 	pvo_pt->pte_hi |= LPTE_VALID;
 	pvo_pt->pte_hi &= ~LPTE_HID;
 	evicted.pte_hi = 0;
+	PTESYNC();
 	result = lv1_insert_htab_entry(mps3_vas_id, ptegidx << 3,
 	    pvo_pt->pte_hi, pvo_pt->pte_lo, LPTE_LOCKED | LPTE_WIRED, 0,
 	    &index, &evicted.pte_hi, &evicted.pte_lo);
@@ -290,6 +291,9 @@ mps3_pte_insert(u_int ptegidx, struct lp
 	if (evicted.pte_hi & LPTE_HID)
 		ptegidx ^= moea64_pteg_mask; /* PTEs indexed by primary */
 
+	KASSERT((evicted.pte_hi & (LPTE_WIRED | LPTE_LOCKED)) == 0,
+	    ("Evicted a wired PTE"));
+
 	result = 0;
 	LIST_FOREACH(pvo, &moea64_pvo_table[ptegidx], pvo_olink) {
 		if (!PVO_PTEGIDX_ISSET(pvo))


More information about the svn-src-user mailing list