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