diff options
author | alc <alc@FreeBSD.org> | 2002-08-02 04:14:19 +0000 |
---|---|---|
committer | alc <alc@FreeBSD.org> | 2002-08-02 04:14:19 +0000 |
commit | 9a9424f83ac186642cecee52408f46f82a2cea90 (patch) | |
tree | 13bcc3096bf8cb9c3c382e6a590b22315ec92d5f | |
parent | 9cde99ab1884b5673635f5b2d2232d2f5aaeeaf9 (diff) | |
download | FreeBSD-src-9a9424f83ac186642cecee52408f46f82a2cea90.zip FreeBSD-src-9a9424f83ac186642cecee52408f46f82a2cea90.tar.gz |
o Lock page queue accesses by vm_page_deactivate().
-rw-r--r-- | sys/amd64/amd64/pmap.c | 18 | ||||
-rw-r--r-- | sys/i386/i386/pmap.c | 18 |
2 files changed, 30 insertions, 6 deletions
diff --git a/sys/amd64/amd64/pmap.c b/sys/amd64/amd64/pmap.c index 3df1e09..ffd23d4 100644 --- a/sys/amd64/amd64/pmap.c +++ b/sys/amd64/amd64/pmap.c @@ -2405,17 +2405,21 @@ retry: 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 + i386_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 { @@ -2432,18 +2436,23 @@ retry: 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 + i386_ptob(tmpidx), p, mpte); + vm_page_lock_queues(); vm_page_flag_set(p, PG_MAPPED); vm_page_wakeup(p); } + vm_page_unlock_queues(); } } return; @@ -2526,7 +2535,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) { @@ -2535,10 +2544,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/i386/i386/pmap.c b/sys/i386/i386/pmap.c index 3df1e09..ffd23d4 100644 --- a/sys/i386/i386/pmap.c +++ b/sys/i386/i386/pmap.c @@ -2405,17 +2405,21 @@ retry: 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 + i386_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 { @@ -2432,18 +2436,23 @@ retry: 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 + i386_ptob(tmpidx), p, mpte); + vm_page_lock_queues(); vm_page_flag_set(p, PG_MAPPED); vm_page_wakeup(p); } + vm_page_unlock_queues(); } } return; @@ -2526,7 +2535,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) { @@ -2535,10 +2544,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(); } } |