aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlan Cox <alc@FreeBSD.org>2002-12-02 04:54:21 +0000
committerAlan Cox <alc@FreeBSD.org>2002-12-02 04:54:21 +0000
commitd79ebb6026172b5c7a497131d6483231edacfcaa (patch)
treea140b58d4a4ffec8dec72799379ce5684dd435b9
parenta8896b02e03af0e927be8756f15d11b8cabb75ba (diff)
Notes
-rw-r--r--sys/amd64/amd64/pmap.c13
-rw-r--r--sys/i386/i386/pmap.c13
2 files changed, 20 insertions, 6 deletions
diff --git a/sys/amd64/amd64/pmap.c b/sys/amd64/amd64/pmap.c
index 5da015ae22e8..c842eff0c7c7 100644
--- a/sys/amd64/amd64/pmap.c
+++ b/sys/amd64/amd64/pmap.c
@@ -1149,8 +1149,8 @@ static int
_pmap_unwire_pte_hold(pmap_t pmap, vm_page_t m)
{
- while (vm_page_sleep_busy(m, FALSE, "pmuwpt"))
- ;
+ while (vm_page_sleep_if_busy(m, FALSE, "pmuwpt"))
+ vm_page_lock_queues();
if (m->hold_count == 0) {
vm_offset_t pteva;
@@ -2133,7 +2133,9 @@ pmap_enter(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_prot_t prot,
*/
if (opa) {
int err;
+ vm_page_lock_queues();
err = pmap_remove_pte(pmap, pte, va);
+ vm_page_unlock_queues();
if (err)
panic("pmap_enter: pte vanished, va: 0x%x", va);
}
@@ -2252,8 +2254,11 @@ retry:
*/
pte = vtopte(va);
if (*pte) {
- if (mpte)
+ if (mpte != NULL) {
+ vm_page_lock_queues();
pmap_unwire_pte_hold(pmap, mpte);
+ vm_page_unlock_queues();
+ }
return 0;
}
@@ -2667,7 +2672,9 @@ pmap_copy(pmap_t dst_pmap, pmap_t src_pmap, vm_offset_t dst_addr, vm_size_t len,
pmap_insert_entry(dst_pmap, addr,
dstmpte, m);
} else {
+ vm_page_lock_queues();
pmap_unwire_pte_hold(dst_pmap, dstmpte);
+ vm_page_unlock_queues();
}
if (dstmpte->hold_count >= srcmpte->hold_count)
break;
diff --git a/sys/i386/i386/pmap.c b/sys/i386/i386/pmap.c
index 5da015ae22e8..c842eff0c7c7 100644
--- a/sys/i386/i386/pmap.c
+++ b/sys/i386/i386/pmap.c
@@ -1149,8 +1149,8 @@ static int
_pmap_unwire_pte_hold(pmap_t pmap, vm_page_t m)
{
- while (vm_page_sleep_busy(m, FALSE, "pmuwpt"))
- ;
+ while (vm_page_sleep_if_busy(m, FALSE, "pmuwpt"))
+ vm_page_lock_queues();
if (m->hold_count == 0) {
vm_offset_t pteva;
@@ -2133,7 +2133,9 @@ pmap_enter(pmap_t pmap, vm_offset_t va, vm_page_t m, vm_prot_t prot,
*/
if (opa) {
int err;
+ vm_page_lock_queues();
err = pmap_remove_pte(pmap, pte, va);
+ vm_page_unlock_queues();
if (err)
panic("pmap_enter: pte vanished, va: 0x%x", va);
}
@@ -2252,8 +2254,11 @@ retry:
*/
pte = vtopte(va);
if (*pte) {
- if (mpte)
+ if (mpte != NULL) {
+ vm_page_lock_queues();
pmap_unwire_pte_hold(pmap, mpte);
+ vm_page_unlock_queues();
+ }
return 0;
}
@@ -2667,7 +2672,9 @@ pmap_copy(pmap_t dst_pmap, pmap_t src_pmap, vm_offset_t dst_addr, vm_size_t len,
pmap_insert_entry(dst_pmap, addr,
dstmpte, m);
} else {
+ vm_page_lock_queues();
pmap_unwire_pte_hold(dst_pmap, dstmpte);
+ vm_page_unlock_queues();
}
if (dstmpte->hold_count >= srcmpte->hold_count)
break;