Module Name: src
Committed By: rmind
Date: Sun Jul 19 15:17:29 UTC 2009
Modified Files:
src/sys/arch/x86/include: pmap.h
src/sys/arch/x86/x86: pmap.c
src/sys/uvm: uvm_emap.c
Log Message:
pmap_emap_sync: add an argument, and do not perform pmap_load() during
context switch (pmap_destroy() path seems to be unsafe), instead just
perform tlbflush(). Slightly inefficient, but good enough for now.
To generate a diff of this commit:
cvs rdiff -u -r1.25 -r1.26 src/sys/arch/x86/include/pmap.h
cvs rdiff -u -r1.87 -r1.88 src/sys/arch/x86/x86/pmap.c
cvs rdiff -u -r1.2 -r1.3 src/sys/uvm/uvm_emap.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/arch/x86/include/pmap.h
diff -u src/sys/arch/x86/include/pmap.h:1.25 src/sys/arch/x86/include/pmap.h:1.26
--- src/sys/arch/x86/include/pmap.h:1.25 Sun Jun 28 15:18:50 2009
+++ src/sys/arch/x86/include/pmap.h Sun Jul 19 15:17:29 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: pmap.h,v 1.25 2009/06/28 15:18:50 rmind Exp $ */
+/* $NetBSD: pmap.h,v 1.26 2009/07/19 15:17:29 rmind Exp $ */
/*
*
@@ -226,7 +226,7 @@
void pmap_emap_enter(vaddr_t, paddr_t, vm_prot_t);
void pmap_emap_remove(vaddr_t, vsize_t);
-void pmap_emap_sync(void);
+void pmap_emap_sync(bool);
vaddr_t reserve_dumppages(vaddr_t); /* XXX: not a pmap fn */
Index: src/sys/arch/x86/x86/pmap.c
diff -u src/sys/arch/x86/x86/pmap.c:1.87 src/sys/arch/x86/x86/pmap.c:1.88
--- src/sys/arch/x86/x86/pmap.c:1.87 Sun Jul 19 10:09:11 2009
+++ src/sys/arch/x86/x86/pmap.c Sun Jul 19 15:17:29 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: pmap.c,v 1.87 2009/07/19 10:09:11 yamt Exp $ */
+/* $NetBSD: pmap.c,v 1.88 2009/07/19 15:17:29 rmind Exp $ */
/*
* Copyright (c) 2007 Manuel Bouyer.
@@ -154,7 +154,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.87 2009/07/19 10:09:11 yamt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.88 2009/07/19 15:17:29 rmind Exp $");
#include "opt_user_ldt.h"
#include "opt_lockdebug.h"
@@ -1080,13 +1080,13 @@
* pmap_emap_sync: perform TLB flush or pmap load, if it was deferred.
*/
void
-pmap_emap_sync(void)
+pmap_emap_sync(bool canload)
{
struct cpu_info *ci = curcpu();
struct pmap *pmap;
KASSERT(kpreempt_disabled());
- if (__predict_true(ci->ci_want_pmapload)) {
+ if (__predict_true(ci->ci_want_pmapload && canload)) {
/*
* XXX: Hint for pmap_reactivate(), which might suggest to
* not perform TLB flush, if state has not changed.
Index: src/sys/uvm/uvm_emap.c
diff -u src/sys/uvm/uvm_emap.c:1.2 src/sys/uvm/uvm_emap.c:1.3
--- src/sys/uvm/uvm_emap.c:1.2 Thu Jul 9 21:43:17 2009
+++ src/sys/uvm/uvm_emap.c Sun Jul 19 15:17:29 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: uvm_emap.c,v 1.2 2009/07/09 21:43:17 rmind Exp $ */
+/* $NetBSD: uvm_emap.c,v 1.3 2009/07/19 15:17:29 rmind Exp $ */
/*-
* Copyright (c) 2009 The NetBSD Foundation, Inc.
@@ -46,7 +46,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: uvm_emap.c,v 1.2 2009/07/09 21:43:17 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uvm_emap.c,v 1.3 2009/07/19 15:17:29 rmind Exp $");
#include <sys/param.h>
#include <sys/kernel.h>
@@ -225,7 +225,7 @@
* barriers and race conditions.
*/
curgen = uvm_emap_gen_return();
- pmap_emap_sync();
+ pmap_emap_sync(false);
ucpu->emap_gen = curgen;
}
@@ -282,7 +282,7 @@
* (3) We will roll the value forward later.
*/
curgen = uvm_emap_gen_return();
- pmap_emap_sync();
+ pmap_emap_sync(true);
ucpu->emap_gen = curgen;
l->l_emap_gen = curgen;
KASSERT((signed int)(curgen - gen) >= 0);