svn commit: r197685 - in projects/mips/sys/mips: include mips

Oleksandr Tymoshenko gonzo at FreeBSD.org
Thu Oct 1 20:05:38 UTC 2009


Author: gonzo
Date: Thu Oct  1 20:05:36 2009
New Revision: 197685
URL: http://svn.freebsd.org/changeset/base/197685

Log:
  - Sync caches properly when dealing with sf_buf

Modified:
  projects/mips/sys/mips/include/pmap.h
  projects/mips/sys/mips/mips/pmap.c
  projects/mips/sys/mips/mips/vm_machdep.c

Modified: projects/mips/sys/mips/include/pmap.h
==============================================================================
--- projects/mips/sys/mips/include/pmap.h	Thu Oct  1 19:12:14 2009	(r197684)
+++ projects/mips/sys/mips/include/pmap.h	Thu Oct  1 20:05:36 2009	(r197685)
@@ -172,6 +172,7 @@ void *pmap_kenter_temporary(vm_paddr_t p
 void pmap_kenter_temporary_free(vm_paddr_t pa);
 int pmap_compute_pages_to_dump(void);
 void pmap_update_page(pmap_t pmap, vm_offset_t va, pt_entry_t pte);
+void pmap_flush_pvcache(vm_page_t m);
 
 /*
  * floating virtual pages (FPAGES)

Modified: projects/mips/sys/mips/mips/pmap.c
==============================================================================
--- projects/mips/sys/mips/mips/pmap.c	Thu Oct  1 19:12:14 2009	(r197684)
+++ projects/mips/sys/mips/mips/pmap.c	Thu Oct  1 20:05:36 2009	(r197685)
@@ -187,7 +187,6 @@ static int init_pte_prot(vm_offset_t va,
 static void pmap_TLB_invalidate_kernel(vm_offset_t);
 static void pmap_TLB_update_kernel(vm_offset_t, pt_entry_t);
 static void pmap_init_fpage(void);
-static void pmap_flush_pvcache(vm_page_t m);
 
 #ifdef SMP
 static void pmap_invalidate_page_action(void *arg);
@@ -744,11 +743,12 @@ pmap_qenter(vm_offset_t va, vm_page_t *m
 	vm_offset_t origva = va;
 
 	for (i = 0; i < count; i++) {
+		pmap_flush_pvcache(m[i]);
 		pmap_kenter(va, VM_PAGE_TO_PHYS(m[i]));
 		va += PAGE_SIZE;
 	}
 
-	mips_dcache_wbinv_range_index(origva, PAGE_SIZE*count);
+	mips_dcache_inv_range(origva, PAGE_SIZE*count);
 }
 
 /*
@@ -3313,7 +3313,7 @@ pmap_kextract(vm_offset_t va)
 	return pa;
 }
 
-static void 
+void 
 pmap_flush_pvcache(vm_page_t m)
 {
 	pv_entry_t pv;

Modified: projects/mips/sys/mips/mips/vm_machdep.c
==============================================================================
--- projects/mips/sys/mips/mips/vm_machdep.c	Thu Oct  1 19:12:14 2009	(r197684)
+++ projects/mips/sys/mips/mips/vm_machdep.c	Thu Oct  1 20:05:36 2009	(r197685)
@@ -52,6 +52,7 @@ __FBSDID("$FreeBSD$");
 #include <sys/sysctl.h>
 #include <sys/unistd.h>
 
+#include <machine/cache.h>
 #include <machine/clock.h>
 #include <machine/cpu.h>
 #include <machine/md_var.h>
@@ -474,6 +475,12 @@ sf_buf_alloc(struct vm_page *m, int flag
 				nsfbufsused++;
 				nsfbufspeak = imax(nsfbufspeak, nsfbufsused);
 			}
+			/*
+			 * Flush all mappings in order to have up to date 
+			 * physycal memory
+			 */
+			pmap_flush_pvcache(sf->m);
+			mips_dcache_inv_range(sf->kva, PAGE_SIZE);
 			goto done;
 		}
 	}
@@ -515,6 +522,10 @@ sf_buf_free(struct sf_buf *sf)
 {
 	mtx_lock(&sf_buf_lock);
 	sf->ref_count--;
+	/*
+	 * Make sure all changes in KVA end up in physical memory
+	 */
+	mips_dcache_wbinv_range(sf->kva, PAGE_SIZE);
 	if (sf->ref_count == 0) {
 		TAILQ_INSERT_TAIL(&sf_buf_freelist, sf, free_entry);
 		nsfbufsused--;


More information about the svn-src-projects mailing list