summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
authoralc <alc@FreeBSD.org>1999-05-18 06:01:49 +0000
committeralc <alc@FreeBSD.org>1999-05-18 06:01:49 +0000
commit6591f9981cf0e380f6f5cbbcbc11bb0b963ad1a6 (patch)
tree249622f1634074a40074a0c9064467171dd08399 /sys
parentf2cbc8ce7a5bca71786f3fc0e985466bca23d37c (diff)
downloadFreeBSD-src-6591f9981cf0e380f6f5cbbcbc11bb0b963ad1a6.zip
FreeBSD-src-6591f9981cf0e380f6f5cbbcbc11bb0b963ad1a6.tar.gz
pmap_qremove:
Eliminate unnecessary TLB shootdowns.
Diffstat (limited to 'sys')
-rw-r--r--sys/amd64/amd64/pmap.c21
-rw-r--r--sys/i386/i386/pmap.c21
2 files changed, 34 insertions, 8 deletions
diff --git a/sys/amd64/amd64/pmap.c b/sys/amd64/amd64/pmap.c
index 7aa92de..2a8eb19 100644
--- a/sys/amd64/amd64/pmap.c
+++ b/sys/amd64/amd64/pmap.c
@@ -39,7 +39,7 @@
* SUCH DAMAGE.
*
* from: @(#)pmap.c 7.7 (Berkeley) 5/12/91
- * $Id: pmap.c,v 1.233 1999/04/25 18:40:05 alc Exp $
+ * $Id: pmap.c,v 1.234 1999/04/28 01:03:23 luoqi Exp $
*/
/*
@@ -851,12 +851,25 @@ pmap_qremove(va, count)
vm_offset_t va;
int count;
{
- int i;
+ vm_offset_t end_va;
- for (i = 0; i < count; i++) {
- pmap_kremove(va);
+ end_va = va + count*PAGE_SIZE;
+
+ while (va < end_va) {
+ unsigned *pte;
+
+ pte = (unsigned *)vtopte(va);
+ *pte = 0;
+#ifdef SMP
+ cpu_invlpg((void *)va);
+#else
+ invltlb_1pg(va);
+#endif
va += PAGE_SIZE;
}
+#ifdef SMP
+ smp_invltlb();
+#endif
}
static vm_page_t
diff --git a/sys/i386/i386/pmap.c b/sys/i386/i386/pmap.c
index 7aa92de..2a8eb19 100644
--- a/sys/i386/i386/pmap.c
+++ b/sys/i386/i386/pmap.c
@@ -39,7 +39,7 @@
* SUCH DAMAGE.
*
* from: @(#)pmap.c 7.7 (Berkeley) 5/12/91
- * $Id: pmap.c,v 1.233 1999/04/25 18:40:05 alc Exp $
+ * $Id: pmap.c,v 1.234 1999/04/28 01:03:23 luoqi Exp $
*/
/*
@@ -851,12 +851,25 @@ pmap_qremove(va, count)
vm_offset_t va;
int count;
{
- int i;
+ vm_offset_t end_va;
- for (i = 0; i < count; i++) {
- pmap_kremove(va);
+ end_va = va + count*PAGE_SIZE;
+
+ while (va < end_va) {
+ unsigned *pte;
+
+ pte = (unsigned *)vtopte(va);
+ *pte = 0;
+#ifdef SMP
+ cpu_invlpg((void *)va);
+#else
+ invltlb_1pg(va);
+#endif
va += PAGE_SIZE;
}
+#ifdef SMP
+ smp_invltlb();
+#endif
}
static vm_page_t
OpenPOWER on IntegriCloud