summaryrefslogtreecommitdiffstats
path: root/sys/nfsclient
diff options
context:
space:
mode:
authoralc <alc@FreeBSD.org>2010-05-05 18:16:06 +0000
committeralc <alc@FreeBSD.org>2010-05-05 18:16:06 +0000
commit5c7ca3ee73eb98150c91a44001daf8ac7adb0907 (patch)
treeaed312c92f14a164a2e36963e81da2e8973206a2 /sys/nfsclient
parent402e3baadee30786a2a2fa508b9b7bec572da072 (diff)
downloadFreeBSD-src-5c7ca3ee73eb98150c91a44001daf8ac7adb0907.zip
FreeBSD-src-5c7ca3ee73eb98150c91a44001daf8ac7adb0907.tar.gz
Acquire the page lock around all remaining calls to vm_page_free() on
managed pages that didn't already have that lock held. (Freeing an unmanaged page, such as the various pmaps use, doesn't require the page lock.) This allows a change in vm_page_remove()'s locking requirements. It now expects the page lock to be held instead of the page queues lock. Consequently, the page queues lock is no longer required at all by callers to vm_page_rename(). Discussed with: kib
Diffstat (limited to 'sys/nfsclient')
-rw-r--r--sys/nfsclient/nfs_bio.c18
1 files changed, 12 insertions, 6 deletions
diff --git a/sys/nfsclient/nfs_bio.c b/sys/nfsclient/nfs_bio.c
index 13effd0..c93d677 100644
--- a/sys/nfsclient/nfs_bio.c
+++ b/sys/nfsclient/nfs_bio.c
@@ -129,12 +129,15 @@ nfs_getpages(struct vop_getpages_args *ap)
*/
VM_OBJECT_LOCK(object);
if (pages[ap->a_reqpage]->valid != 0) {
- vm_page_lock_queues();
for (i = 0; i < npages; ++i) {
- if (i != ap->a_reqpage)
+ if (i != ap->a_reqpage) {
+ vm_page_lock(pages[i]);
+ vm_page_lock_queues();
vm_page_free(pages[i]);
+ vm_page_unlock_queues();
+ vm_page_unlock(pages[i]);
+ }
}
- vm_page_unlock_queues();
VM_OBJECT_UNLOCK(object);
return (0);
}
@@ -169,12 +172,15 @@ nfs_getpages(struct vop_getpages_args *ap)
if (error && (uio.uio_resid == count)) {
nfs_printf("nfs_getpages: error %d\n", error);
VM_OBJECT_LOCK(object);
- vm_page_lock_queues();
for (i = 0; i < npages; ++i) {
- if (i != ap->a_reqpage)
+ if (i != ap->a_reqpage) {
+ vm_page_lock(pages[i]);
+ vm_page_lock_queues();
vm_page_free(pages[i]);
+ vm_page_unlock_queues();
+ vm_page_unlock(pages[i]);
+ }
}
- vm_page_unlock_queues();
VM_OBJECT_UNLOCK(object);
return (VM_PAGER_ERROR);
}
OpenPOWER on IntegriCloud