diff options
author | attilio <attilio@FreeBSD.org> | 2013-08-05 08:55:35 +0000 |
---|---|---|
committer | attilio <attilio@FreeBSD.org> | 2013-08-05 08:55:35 +0000 |
commit | 899ab645146d3b9d10334951eb65770773ed3630 (patch) | |
tree | 668bc05fd597966d485deb8ea05c427ee434fde6 /sys/vm/vm_glue.c | |
parent | 05101f7501be1dd160855b1f31fcbe7c123817ec (diff) | |
download | FreeBSD-src-899ab645146d3b9d10334951eb65770773ed3630.zip FreeBSD-src-899ab645146d3b9d10334951eb65770773ed3630.tar.gz |
Revert r253939:
We cannot busy a page before doing pagefaults.
Infact, it can deadlock against vnode lock, as it tries to vget().
Other functions, right now, have an opposite lock ordering, like
vm_object_sync(), which acquires the vnode lock first and then
sleeps on the busy mechanism.
Before this patch is reinserted we need to break this ordering.
Sponsored by: EMC / Isilon storage division
Reported by: kib
Diffstat (limited to 'sys/vm/vm_glue.c')
-rw-r--r-- | sys/vm/vm_glue.c | 16 |
1 files changed, 9 insertions, 7 deletions
diff --git a/sys/vm/vm_glue.c b/sys/vm/vm_glue.c index 445a24a..948e2b3 100644 --- a/sys/vm/vm_glue.c +++ b/sys/vm/vm_glue.c @@ -223,7 +223,7 @@ vsunlock(void *addr, size_t len) * Return the pinned page if successful; otherwise, return NULL. */ static vm_page_t -vm_imgact_page_iostart(vm_object_t object, vm_ooffset_t offset) +vm_imgact_hold_page(vm_object_t object, vm_ooffset_t offset) { vm_page_t m, ma[1]; vm_pindex_t pindex; @@ -249,7 +249,9 @@ vm_imgact_page_iostart(vm_object_t object, vm_ooffset_t offset) } vm_page_wakeup(m); } - vm_page_io_start(m); + vm_page_lock(m); + vm_page_hold(m); + vm_page_unlock(m); out: VM_OBJECT_WUNLOCK(object); return (m); @@ -264,7 +266,7 @@ vm_imgact_map_page(vm_object_t object, vm_ooffset_t offset) { vm_page_t m; - m = vm_imgact_page_iostart(object, offset); + m = vm_imgact_hold_page(object, offset); if (m == NULL) return (NULL); sched_pin(); @@ -275,16 +277,16 @@ vm_imgact_map_page(vm_object_t object, vm_ooffset_t offset) * Destroy the given CPU private mapping and unpin the page that it mapped. */ void -vm_imgact_unmap_page(vm_object_t object, struct sf_buf *sf) +vm_imgact_unmap_page(struct sf_buf *sf) { vm_page_t m; m = sf_buf_page(sf); sf_buf_free(sf); sched_unpin(); - VM_OBJECT_WLOCK(object); - vm_page_io_finish(m); - VM_OBJECT_WUNLOCK(object); + vm_page_lock(m); + vm_page_unhold(m); + vm_page_unlock(m); } void |