Fix an SMP-only TLB invalidation bug. Specifically, disable

a TLB invalidation optimization that won't work given the
limitations of our current SMP support.

This patch should be applied to -stable ASAP.

Thanks to John Capo <jc@irbs.com>,
          Steve Kargl <sgk@troutmask.apl.washington.edu>, and
          Chuck Robey <chuckr@mat.net>
for testing.
This commit is contained in:
Alan Cox 1999-03-05 08:05:44 +00:00
parent 2f33b2c03e
commit 901671c028
2 changed files with 10 additions and 2 deletions

View File

@ -39,7 +39,7 @@
* SUCH DAMAGE. * SUCH DAMAGE.
* *
* from: @(#)pmap.c 7.7 (Berkeley) 5/12/91 * from: @(#)pmap.c 7.7 (Berkeley) 5/12/91
* $Id: pmap.c,v 1.222 1999/01/28 01:59:50 dillon Exp $ * $Id: pmap.c,v 1.223 1999/02/19 14:25:33 luoqi Exp $
*/ */
/* /*
@ -1991,11 +1991,15 @@ pmap_remove_all(pa)
if (pmap_track_modified(pv->pv_va)) if (pmap_track_modified(pv->pv_va))
vm_page_dirty(ppv->pv_vm_page); vm_page_dirty(ppv->pv_vm_page);
} }
#ifdef SMP
update_needed = 1;
#else
if (!update_needed && if (!update_needed &&
((!curproc || (vmspace_pmap(curproc->p_vmspace) == pv->pv_pmap)) || ((!curproc || (vmspace_pmap(curproc->p_vmspace) == pv->pv_pmap)) ||
(pv->pv_pmap == kernel_pmap))) { (pv->pv_pmap == kernel_pmap))) {
update_needed = 1; update_needed = 1;
} }
#endif
TAILQ_REMOVE(&pv->pv_pmap->pm_pvlist, pv, pv_plist); TAILQ_REMOVE(&pv->pv_pmap->pm_pvlist, pv, pv_plist);
TAILQ_REMOVE(&ppv->pv_list, pv, pv_list); TAILQ_REMOVE(&ppv->pv_list, pv, pv_list);

View File

@ -39,7 +39,7 @@
* SUCH DAMAGE. * SUCH DAMAGE.
* *
* from: @(#)pmap.c 7.7 (Berkeley) 5/12/91 * from: @(#)pmap.c 7.7 (Berkeley) 5/12/91
* $Id: pmap.c,v 1.222 1999/01/28 01:59:50 dillon Exp $ * $Id: pmap.c,v 1.223 1999/02/19 14:25:33 luoqi Exp $
*/ */
/* /*
@ -1991,11 +1991,15 @@ pmap_remove_all(pa)
if (pmap_track_modified(pv->pv_va)) if (pmap_track_modified(pv->pv_va))
vm_page_dirty(ppv->pv_vm_page); vm_page_dirty(ppv->pv_vm_page);
} }
#ifdef SMP
update_needed = 1;
#else
if (!update_needed && if (!update_needed &&
((!curproc || (vmspace_pmap(curproc->p_vmspace) == pv->pv_pmap)) || ((!curproc || (vmspace_pmap(curproc->p_vmspace) == pv->pv_pmap)) ||
(pv->pv_pmap == kernel_pmap))) { (pv->pv_pmap == kernel_pmap))) {
update_needed = 1; update_needed = 1;
} }
#endif
TAILQ_REMOVE(&pv->pv_pmap->pm_pvlist, pv, pv_plist); TAILQ_REMOVE(&pv->pv_pmap->pm_pvlist, pv, pv_plist);
TAILQ_REMOVE(&ppv->pv_list, pv, pv_list); TAILQ_REMOVE(&ppv->pv_list, pv, pv_list);