diff options
author | alc <alc@FreeBSD.org> | 2010-05-05 18:16:06 +0000 |
---|---|---|
committer | alc <alc@FreeBSD.org> | 2010-05-05 18:16:06 +0000 |
commit | 5c7ca3ee73eb98150c91a44001daf8ac7adb0907 (patch) | |
tree | aed312c92f14a164a2e36963e81da2e8973206a2 /sys/fs/smbfs | |
parent | 402e3baadee30786a2a2fa508b9b7bec572da072 (diff) | |
download | FreeBSD-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/fs/smbfs')
-rw-r--r-- | sys/fs/smbfs/smbfs_io.c | 18 |
1 files changed, 12 insertions, 6 deletions
diff --git a/sys/fs/smbfs/smbfs_io.c b/sys/fs/smbfs/smbfs_io.c index 7e021c1..c47fb1b 100644 --- a/sys/fs/smbfs/smbfs_io.c +++ b/sys/fs/smbfs/smbfs_io.c @@ -440,12 +440,15 @@ smbfs_getpages(ap) VM_OBJECT_LOCK(object); if (m->valid != 0) { - vm_page_lock_queues(); for (i = 0; i < npages; ++i) { - if (i != reqpage) + if (i != 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; } @@ -478,12 +481,15 @@ smbfs_getpages(ap) VM_OBJECT_LOCK(object); if (error && (uio.uio_resid == count)) { printf("smbfs_getpages: error %d\n",error); - vm_page_lock_queues(); for (i = 0; i < npages; i++) { - if (reqpage != i) + if (reqpage != i) { + 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; } |