summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
authorattilio <attilio@FreeBSD.org>2014-03-19 01:13:42 +0000
committerattilio <attilio@FreeBSD.org>2014-03-19 01:13:42 +0000
commitf19bbde667a9348da3a87d8020cdcdd8e58f77d0 (patch)
tree32ddd87329a889e5bd40542e4baf48292475d469 /sys
parent060e6c4c4bb0bf187f8d7858b1b57cdbfab83071 (diff)
downloadFreeBSD-src-f19bbde667a9348da3a87d8020cdcdd8e58f77d0.zip
FreeBSD-src-f19bbde667a9348da3a87d8020cdcdd8e58f77d0.tar.gz
vm_page_grab() and vm_pager_get_pages() can drop the vm_object lock,
then threads can sleep on the pip condition. Avoid to deadlock such threads by correctly awakening the sleeping ones after the pip is finished. swapoff side of the bug can likely result in shutdown deadlocks. Sponsored by: EMC / Isilon Storage Division Reported by: pho, pluknet Tested by: pho
Diffstat (limited to 'sys')
-rw-r--r--sys/dev/md/md.c2
-rw-r--r--sys/vm/swap_pager.c4
2 files changed, 3 insertions, 3 deletions
diff --git a/sys/dev/md/md.c b/sys/dev/md/md.c
index 817a89d..367a6a2 100644
--- a/sys/dev/md/md.c
+++ b/sys/dev/md/md.c
@@ -903,7 +903,7 @@ mdstart_swap(struct md_s *sc, struct bio *bp)
offs = 0;
ma_offs += len;
}
- vm_object_pip_subtract(sc->object, 1);
+ vm_object_pip_wakeup(sc->object);
VM_OBJECT_WUNLOCK(sc->object);
return (rv != VM_PAGER_ERROR ? 0 : ENOSPC);
}
diff --git a/sys/vm/swap_pager.c b/sys/vm/swap_pager.c
index 54ebf9d..861de94 100644
--- a/sys/vm/swap_pager.c
+++ b/sys/vm/swap_pager.c
@@ -1713,7 +1713,7 @@ swp_pager_force_pagein(vm_object_t object, vm_pindex_t pindex)
vm_object_pip_add(object, 1);
m = vm_page_grab(object, pindex, VM_ALLOC_NORMAL);
if (m->valid == VM_PAGE_BITS_ALL) {
- vm_object_pip_subtract(object, 1);
+ vm_object_pip_wakeup(object);
vm_page_dirty(m);
vm_page_lock(m);
vm_page_activate(m);
@@ -1725,7 +1725,7 @@ swp_pager_force_pagein(vm_object_t object, vm_pindex_t pindex)
if (swap_pager_getpages(object, &m, 1, 0) != VM_PAGER_OK)
panic("swap_pager_force_pagein: read from swap failed");/*XXX*/
- vm_object_pip_subtract(object, 1);
+ vm_object_pip_wakeup(object);
vm_page_dirty(m);
vm_page_lock(m);
vm_page_deactivate(m);
OpenPOWER on IntegriCloud