diff options
author | alc <alc@FreeBSD.org> | 1999-05-18 06:01:49 +0000 |
---|---|---|
committer | alc <alc@FreeBSD.org> | 1999-05-18 06:01:49 +0000 |
commit | 6591f9981cf0e380f6f5cbbcbc11bb0b963ad1a6 (patch) | |
tree | 249622f1634074a40074a0c9064467171dd08399 /sys | |
parent | f2cbc8ce7a5bca71786f3fc0e985466bca23d37c (diff) | |
download | FreeBSD-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.c | 21 | ||||
-rw-r--r-- | sys/i386/i386/pmap.c | 21 |
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 |