diff options
author | dillon <dillon@FreeBSD.org> | 2002-02-26 18:08:54 +0000 |
---|---|---|
committer | dillon <dillon@FreeBSD.org> | 2002-02-26 18:08:54 +0000 |
commit | 5052e3a1dc1787d99f0893854c18fb32eacd8f71 (patch) | |
tree | f77e11b3433f8804aab8caa5b99b7e885b10ca94 | |
parent | 8bf18cd56425bbcd2682f19bb126411f43d0abb0 (diff) | |
download | FreeBSD-src-5052e3a1dc1787d99f0893854c18fb32eacd8f71.zip FreeBSD-src-5052e3a1dc1787d99f0893854c18fb32eacd8f71.tar.gz |
Make peter's commit compatible with interrupt-enabled critical_enter()
and exit(), which has already solved the problem in regards to deadlocked
IPI's.
-rw-r--r-- | sys/amd64/amd64/pmap.c | 4 | ||||
-rw-r--r-- | sys/i386/i386/pmap.c | 4 |
2 files changed, 4 insertions, 4 deletions
diff --git a/sys/amd64/amd64/pmap.c b/sys/amd64/amd64/pmap.c index ba3ee22..8dfacaa 100644 --- a/sys/amd64/amd64/pmap.c +++ b/sys/amd64/amd64/pmap.c @@ -575,7 +575,7 @@ pmap_invalidate_page(pmap_t pmap, vm_offset_t va) * interrupts disabled here. * XXX we may need to hold schedlock to get a coherent pm_active */ - if (td->td_critnest == 1) + if (td->td_critnest == 1 && td->td_savecrit != (critical_t)-1) cpu_critical_exit(td->td_savecrit); if (pmap->pm_active == -1 || pmap->pm_active == all_cpus) { invlpg(va); /* global */ @@ -609,7 +609,7 @@ pmap_invalidate_all(pmap_t pmap) * interrupts disabled here. * XXX we may need to hold schedlock to get a coherent pm_active */ - if (td->td_critnest == 1) + if (td->td_critnest == 1 && td->td_savecrit != (critical_t)-1) cpu_critical_exit(td->td_savecrit); if (pmap->pm_active == -1 || pmap->pm_active == all_cpus) { invltlb(); /* global */ diff --git a/sys/i386/i386/pmap.c b/sys/i386/i386/pmap.c index ba3ee22..8dfacaa 100644 --- a/sys/i386/i386/pmap.c +++ b/sys/i386/i386/pmap.c @@ -575,7 +575,7 @@ pmap_invalidate_page(pmap_t pmap, vm_offset_t va) * interrupts disabled here. * XXX we may need to hold schedlock to get a coherent pm_active */ - if (td->td_critnest == 1) + if (td->td_critnest == 1 && td->td_savecrit != (critical_t)-1) cpu_critical_exit(td->td_savecrit); if (pmap->pm_active == -1 || pmap->pm_active == all_cpus) { invlpg(va); /* global */ @@ -609,7 +609,7 @@ pmap_invalidate_all(pmap_t pmap) * interrupts disabled here. * XXX we may need to hold schedlock to get a coherent pm_active */ - if (td->td_critnest == 1) + if (td->td_critnest == 1 && td->td_savecrit != (critical_t)-1) cpu_critical_exit(td->td_savecrit); if (pmap->pm_active == -1 || pmap->pm_active == all_cpus) { invltlb(); /* global */ |