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