svn commit: r205193 - stable/8/sys/arm/arm

Rafal Jaworowski raj at FreeBSD.org
Mon Mar 15 19:59:17 UTC 2010


Author: raj
Date: Mon Mar 15 19:59:16 2010
New Revision: 205193
URL: http://svn.freebsd.org/changeset/base/205193

Log:
  MFC r205028
  
   Fix ARM cache handling yet more.
  
   1) vm_machdep.c: remove the dangling allocations so they do not
      un-necessarily turn off the cache upon consecutive access.
  
   2) busdma_machdep.c: remove the same amount than shadow mapped.
  
  Reported by:	Maks Verver
  Submitted by:	Mark Tinguely
  Reviewed by:	Grzegorz Bernacki

Modified:
  stable/8/sys/arm/arm/busdma_machdep.c
  stable/8/sys/arm/arm/vm_machdep.c
Directory Properties:
  stable/8/sys/   (props changed)
  stable/8/sys/amd64/include/xen/   (props changed)
  stable/8/sys/cddl/contrib/opensolaris/   (props changed)
  stable/8/sys/contrib/dev/acpica/   (props changed)
  stable/8/sys/contrib/pf/   (props changed)
  stable/8/sys/dev/xen/xenpci/   (props changed)

Modified: stable/8/sys/arm/arm/busdma_machdep.c
==============================================================================
--- stable/8/sys/arm/arm/busdma_machdep.c	Mon Mar 15 19:51:24 2010	(r205192)
+++ stable/8/sys/arm/arm/busdma_machdep.c	Mon Mar 15 19:59:16 2010	(r205193)
@@ -649,7 +649,8 @@ bus_dmamem_free(bus_dma_tag_t dmat, void
 		KASSERT(map->allocbuffer == vaddr,
 		    ("Trying to freeing the wrong DMA buffer"));
 		vaddr = map->origbuffer;
-		arm_unmap_nocache(map->allocbuffer, dmat->maxsize);
+		arm_unmap_nocache(map->allocbuffer,
+		    dmat->maxsize + ((vm_offset_t)vaddr & PAGE_MASK));
 	}
         if (dmat->maxsize <= PAGE_SIZE &&
 	   dmat->alignment < dmat->maxsize &&

Modified: stable/8/sys/arm/arm/vm_machdep.c
==============================================================================
--- stable/8/sys/arm/arm/vm_machdep.c	Mon Mar 15 19:51:24 2010	(r205192)
+++ stable/8/sys/arm/arm/vm_machdep.c	Mon Mar 15 19:59:16 2010	(r205193)
@@ -171,6 +171,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);
 	 }
@@ -502,9 +505,12 @@ arm_unmap_nocache(void *addr, vm_size_t 
 
 	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 svn-src-all mailing list