summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoralc <alc@FreeBSD.org>2002-07-28 20:13:48 +0000
committeralc <alc@FreeBSD.org>2002-07-28 20:13:48 +0000
commit0cc69019ed44da3e46f9d2c7adbddd05856f635e (patch)
treefb129692e9f38ea444b3ab98a3bfc0839e40fb83
parentb1555a27432152cc7817d0c592bbcebf95fdfd19 (diff)
downloadFreeBSD-src-0cc69019ed44da3e46f9d2c7adbddd05856f635e.zip
FreeBSD-src-0cc69019ed44da3e46f9d2c7adbddd05856f635e.tar.gz
o Lock page queue accesses by vm_page_free().
o Apply some style fixes.
-rw-r--r--sys/vm/vnode_pager.c33
1 files changed, 19 insertions, 14 deletions
diff --git a/sys/vm/vnode_pager.c b/sys/vm/vnode_pager.c
index 913cb1e..30f069a 100644
--- a/sys/vm/vnode_pager.c
+++ b/sys/vm/vnode_pager.c
@@ -620,7 +620,7 @@ vnode_pager_generic_getpages(vp, m, bytecount, reqpage)
vm_object_t object;
vm_offset_t kva;
off_t foff, tfoff, nextoff;
- int i, size, bsize, first, firstaddr;
+ int i, j, size, bsize, first, firstaddr;
struct vnode *dp;
int runpg;
int runend;
@@ -650,11 +650,11 @@ vnode_pager_generic_getpages(vp, m, bytecount, reqpage)
* if we can't bmap, use old VOP code
*/
if (VOP_BMAP(vp, 0, &dp, 0, NULL, NULL)) {
- for (i = 0; i < count; i++) {
- if (i != reqpage) {
+ vm_page_lock_queues();
+ for (i = 0; i < count; i++)
+ if (i != reqpage)
vm_page_free(m[i]);
- }
- }
+ vm_page_unlock_queues();
cnt.v_vnodein++;
cnt.v_vnodepgsin++;
return vnode_pager_input_old(object, m[reqpage]);
@@ -666,11 +666,11 @@ vnode_pager_generic_getpages(vp, m, bytecount, reqpage)
*/
} else if ((PAGE_SIZE / bsize) > 1 &&
(vp->v_mount->mnt_stat.f_type != nfs_mount_type)) {
- for (i = 0; i < count; i++) {
- if (i != reqpage) {
+ vm_page_lock_queues();
+ for (i = 0; i < count; i++)
+ if (i != reqpage)
vm_page_free(m[i]);
- }
- }
+ vm_page_unlock_queues();
cnt.v_vnodein++;
cnt.v_vnodepgsin++;
return vnode_pager_input_smlfs(object, m[reqpage]);
@@ -682,10 +682,11 @@ vnode_pager_generic_getpages(vp, m, bytecount, reqpage)
* media.
*/
if (m[reqpage]->valid == VM_PAGE_BITS_ALL) {
- for (i = 0; i < count; i++) {
+ vm_page_lock_queues();
+ for (i = 0; i < count; i++)
if (i != reqpage)
vm_page_free(m[i]);
- }
+ vm_page_unlock_queues();
return VM_PAGER_OK;
}
m[reqpage]->valid = 0;
@@ -712,21 +713,25 @@ vnode_pager_generic_getpages(vp, m, bytecount, reqpage)
(u_long)(u_int32_t)
object->un_pager.vnp.vnp_size);
}
+ vm_page_lock_queues();
vm_page_free(m[i]);
+ vm_page_unlock_queues();
runend = i + 1;
first = runend;
continue;
}
runend = i + runpg;
if (runend <= reqpage) {
- int j;
- for (j = i; j < runend; j++) {
+ vm_page_lock_queues();
+ for (j = i; j < runend; j++)
vm_page_free(m[j]);
- }
+ vm_page_unlock_queues();
} else {
if (runpg < (count - first)) {
+ vm_page_lock_queues();
for (i = first + runpg; i < count; i++)
vm_page_free(m[i]);
+ vm_page_unlock_queues();
count = first + runpg;
}
break;
OpenPOWER on IntegriCloud