remove dangling allocations

Mark Tinguely tinguely at casselton.net
Wed Sep 2 16:49:12 UTC 2009


Without the pressure of getting something to work for FreeBSD 8.0, I would
like to revisit this issue.

Revisions 181296 and 195779 added cache fixes, and I think we should
also remove a couple dangling allocations.

Without removing the dangling allocation, the next time we map that page,
our cache fixing code will think these pages are still used somewhere else
and will unnecessarially turn off caching. As the system runs for days,
more and more pages could dangle and performance could suffer.

Removing the dangling allocation, may allow future simplification of the
cache fixing code.

Index: arm/arm/vm_machdep.c

===================================================================
--- arm/arm/vm_machdep.c	(revision 196359)
+++ arm/arm/vm_machdep.c	(working copy)
@@ -172,6 +172,9 @@ sf_buf_free(struct sf_buf *sf)
 	 if (sf->ref_count == 0) {
 		 TAILQ_INSERT_TAIL(&sf_buf_freelist, sf, free_entry);
 		 nsfbufsused--;
+		 pmap_kremove(sf->kva);
+		 sf->m = NULL;
+		 LIST_REMOVE(sf, list_entry);
 		 if (sf_buf_alloc_want > 0)
 			 wakeup_one(&sf_buf_freelist);
 	 }
@@ -452,9 +455,12 @@ arm_unmap_nocache(void *addr, vm_size_t size)
 
 	size = round_page(size);
 	i = (raddr - arm_nocache_startaddr) / (PAGE_SIZE);
-	for (; size > 0; size -= PAGE_SIZE, i++)
+	for (; size > 0; size -= PAGE_SIZE, i++) {
 		arm_nocache_allocated[i / BITS_PER_INT] &= ~(1 << (i % 
 		    BITS_PER_INT));
+		pmap_kremove(raddr);
+		raddr += PAGE_SIZE;
+	}
 }
 
 #ifdef ARM_USE_SMALL_ALLOC


More information about the freebsd-arm mailing list