summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoralc <alc@FreeBSD.org>2002-08-02 04:40:10 +0000
committeralc <alc@FreeBSD.org>2002-08-02 04:40:10 +0000
commita15cfdccfbf5cab416e0549067bea309ff990d9b (patch)
tree4711e4d3c2f1e2d8f7713fe24166b67ede07eecf
parent9a9424f83ac186642cecee52408f46f82a2cea90 (diff)
downloadFreeBSD-src-a15cfdccfbf5cab416e0549067bea309ff990d9b.zip
FreeBSD-src-a15cfdccfbf5cab416e0549067bea309ff990d9b.tar.gz
o Lock page queue accesses by vm_page_deactivate().
-rw-r--r--sys/alpha/alpha/pmap.c18
-rw-r--r--sys/ia64/ia64/pmap.c18
2 files changed, 30 insertions, 6 deletions
diff --git a/sys/alpha/alpha/pmap.c b/sys/alpha/alpha/pmap.c
index 6c825c9..1f7c036 100644
--- a/sys/alpha/alpha/pmap.c
+++ b/sys/alpha/alpha/pmap.c
@@ -2312,17 +2312,21 @@ pmap_object_init_pt(pmap_t pmap, vm_offset_t addr,
cnt.v_free_count < cnt.v_free_reserved) {
break;
}
+ vm_page_lock_queues();
if (((p->valid & VM_PAGE_BITS_ALL) == VM_PAGE_BITS_ALL) &&
(p->busy == 0) &&
(p->flags & (PG_BUSY | PG_FICTITIOUS)) == 0) {
if ((p->queue - p->pc) == PQ_CACHE)
vm_page_deactivate(p);
vm_page_busy(p);
+ vm_page_unlock_queues();
mpte = pmap_enter_quick(pmap,
addr + alpha_ptob(tmpidx), p, mpte);
+ vm_page_lock_queues();
vm_page_flag_set(p, PG_MAPPED);
vm_page_wakeup(p);
}
+ vm_page_unlock_queues();
objpgs -= 1;
}
} else {
@@ -2339,18 +2343,23 @@ pmap_object_init_pt(pmap_t pmap, vm_offset_t addr,
break;
}
p = vm_page_lookup(object, tmpidx + pindex);
- if (p &&
- ((p->valid & VM_PAGE_BITS_ALL) == VM_PAGE_BITS_ALL) &&
+ if (p == NULL)
+ continue;
+ vm_page_lock_queues();
+ if ((p->valid & VM_PAGE_BITS_ALL) == VM_PAGE_BITS_ALL &&
(p->busy == 0) &&
(p->flags & (PG_BUSY | PG_FICTITIOUS)) == 0) {
if ((p->queue - p->pc) == PQ_CACHE)
vm_page_deactivate(p);
vm_page_busy(p);
+ vm_page_unlock_queues();
mpte = pmap_enter_quick(pmap,
addr + alpha_ptob(tmpidx), p, mpte);
+ vm_page_lock_queues();
vm_page_flag_set(p, PG_MAPPED);
vm_page_wakeup(p);
}
+ vm_page_unlock_queues();
}
}
return;
@@ -2434,7 +2443,7 @@ pmap_prefault(pmap, addra, entry)
*/
if (m == NULL)
break;
-
+ vm_page_lock_queues();
if (((m->valid & VM_PAGE_BITS_ALL) == VM_PAGE_BITS_ALL) &&
(m->busy == 0) &&
(m->flags & (PG_BUSY | PG_FICTITIOUS)) == 0) {
@@ -2443,10 +2452,13 @@ pmap_prefault(pmap, addra, entry)
vm_page_deactivate(m);
}
vm_page_busy(m);
+ vm_page_unlock_queues();
mpte = pmap_enter_quick(pmap, addr, m, mpte);
+ vm_page_lock_queues();
vm_page_flag_set(m, PG_MAPPED);
vm_page_wakeup(m);
}
+ vm_page_unlock_queues();
}
}
diff --git a/sys/ia64/ia64/pmap.c b/sys/ia64/ia64/pmap.c
index 05ad4dd..1107e1c 100644
--- a/sys/ia64/ia64/pmap.c
+++ b/sys/ia64/ia64/pmap.c
@@ -1819,17 +1819,21 @@ pmap_object_init_pt(pmap_t pmap, vm_offset_t addr,
cnt.v_free_count < cnt.v_free_reserved) {
break;
}
+ vm_page_lock_queues();
if (((p->valid & VM_PAGE_BITS_ALL) == VM_PAGE_BITS_ALL) &&
(p->busy == 0) &&
(p->flags & (PG_BUSY | PG_FICTITIOUS)) == 0) {
if ((p->queue - p->pc) == PQ_CACHE)
vm_page_deactivate(p);
vm_page_busy(p);
+ vm_page_unlock_queues();
pmap_enter_quick(pmap,
addr + ia64_ptob(tmpidx), p);
+ vm_page_lock_queues();
vm_page_flag_set(p, PG_MAPPED);
vm_page_wakeup(p);
}
+ vm_page_unlock_queues();
objpgs -= 1;
}
} else {
@@ -1846,18 +1850,23 @@ pmap_object_init_pt(pmap_t pmap, vm_offset_t addr,
break;
}
p = vm_page_lookup(object, tmpidx + pindex);
- if (p &&
- ((p->valid & VM_PAGE_BITS_ALL) == VM_PAGE_BITS_ALL) &&
+ if (p == NULL)
+ continue;
+ vm_page_lock_queues();
+ if ((p->valid & VM_PAGE_BITS_ALL) == VM_PAGE_BITS_ALL &&
(p->busy == 0) &&
(p->flags & (PG_BUSY | PG_FICTITIOUS)) == 0) {
if ((p->queue - p->pc) == PQ_CACHE)
vm_page_deactivate(p);
vm_page_busy(p);
+ vm_page_unlock_queues();
pmap_enter_quick(pmap,
addr + ia64_ptob(tmpidx), p);
+ vm_page_lock_queues();
vm_page_flag_set(p, PG_MAPPED);
vm_page_wakeup(p);
}
+ vm_page_unlock_queues();
}
}
pmap_install(oldpmap);
@@ -1938,7 +1947,7 @@ pmap_prefault(pmap, addra, entry)
*/
if (m == NULL)
break;
-
+ vm_page_lock_queues();
if (((m->valid & VM_PAGE_BITS_ALL) == VM_PAGE_BITS_ALL) &&
(m->busy == 0) &&
(m->flags & (PG_BUSY | PG_FICTITIOUS)) == 0) {
@@ -1947,10 +1956,13 @@ pmap_prefault(pmap, addra, entry)
vm_page_deactivate(m);
}
vm_page_busy(m);
+ vm_page_unlock_queues();
pmap_enter_quick(pmap, addr, m);
+ vm_page_lock_queues();
vm_page_flag_set(m, PG_MAPPED);
vm_page_wakeup(m);
}
+ vm_page_unlock_queues();
}
}
OpenPOWER on IntegriCloud