diff options
author | alc <alc@FreeBSD.org> | 2004-06-26 19:10:12 +0000 |
---|---|---|
committer | alc <alc@FreeBSD.org> | 2004-06-26 19:10:12 +0000 |
commit | 11da9eaee1fdbe9e6c047dd1d81374f90e0359b3 (patch) | |
tree | 47ce3d43e3a1dc123fb287870baf58fce5f8e75f /sys | |
parent | 49e32d12eb7f48f207cced3b3b9ddca3db9c8599 (diff) | |
download | FreeBSD-src-11da9eaee1fdbe9e6c047dd1d81374f90e0359b3.zip FreeBSD-src-11da9eaee1fdbe9e6c047dd1d81374f90e0359b3.tar.gz |
In case pmap_extract_and_hold() is ever performed on a different pmap than
the current one, we need to pin the current thread to its CPU.
Submitted by: tegge@
Diffstat (limited to 'sys')
-rw-r--r-- | sys/i386/i386/pmap.c | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/sys/i386/i386/pmap.c b/sys/i386/i386/pmap.c index 756f5dd6..8b6e040 100644 --- a/sys/i386/i386/pmap.c +++ b/sys/i386/i386/pmap.c @@ -878,12 +878,14 @@ pmap_extract_and_hold(pmap_t pmap, vm_offset_t va, vm_prot_t prot) vm_page_hold(m); } } else { + sched_pin(); pte = *pmap_pte_quick(pmap, va); if (pte != 0 && ((pte & PG_RW) || (prot & VM_PROT_WRITE) == 0)) { m = PHYS_TO_VM_PAGE(pte & PG_FRAME); vm_page_hold(m); } + sched_unpin(); } } vm_page_unlock_queues(); |