summaryrefslogtreecommitdiffstats
path: root/sys/vm/vm_glue.c
diff options
context:
space:
mode:
authorattilio <attilio@FreeBSD.org>2013-08-05 08:55:35 +0000
committerattilio <attilio@FreeBSD.org>2013-08-05 08:55:35 +0000
commit899ab645146d3b9d10334951eb65770773ed3630 (patch)
tree668bc05fd597966d485deb8ea05c427ee434fde6 /sys/vm/vm_glue.c
parent05101f7501be1dd160855b1f31fcbe7c123817ec (diff)
downloadFreeBSD-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.c16
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
OpenPOWER on IntegriCloud