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);

Reply via email to