summaryrefslogtreecommitdiffstats
path: root/sys/vm/swap_pager.c
diff options
context:
space:
mode:
authoralc <alc@FreeBSD.org>2003-06-13 03:02:28 +0000
committeralc <alc@FreeBSD.org>2003-06-13 03:02:28 +0000
commitd66a37a0f2941403e0d02a5cb82f14bdb07338cc (patch)
tree131300009b7d968e4f3ac335ab6af00d92af89ef /sys/vm/swap_pager.c
parentf7366986b75e25cef2a0167fe951b8ee613d671a (diff)
downloadFreeBSD-src-d66a37a0f2941403e0d02a5cb82f14bdb07338cc.zip
FreeBSD-src-d66a37a0f2941403e0d02a5cb82f14bdb07338cc.tar.gz
Add vm object locking to various pagers' "get pages" methods, i386 stack
management functions, and a u area management function.
Diffstat (limited to 'sys/vm/swap_pager.c')
-rw-r--r--sys/vm/swap_pager.c9
1 files changed, 7 insertions, 2 deletions
diff --git a/sys/vm/swap_pager.c b/sys/vm/swap_pager.c
index 4ddc7fe..e1880f8 100644
--- a/sys/vm/swap_pager.c
+++ b/sys/vm/swap_pager.c
@@ -1006,8 +1006,6 @@ swap_pager_getpages(object, m, count, reqpage)
daddr_t blk;
vm_pindex_t lastpindex;
- GIANT_REQUIRED;
-
mreq = m[reqpage];
if (mreq->object != object) {
@@ -1075,6 +1073,10 @@ swap_pager_getpages(object, m, count, reqpage)
return (VM_PAGER_FAIL);
/*
+ * Getpbuf() can sleep.
+ */
+ VM_OBJECT_UNLOCK(object);
+ /*
* Get a swap buffer header to perform the IO
*/
bp = getpbuf(&nsw_rcount);
@@ -1095,6 +1097,7 @@ swap_pager_getpages(object, m, count, reqpage)
bp->b_bufsize = PAGE_SIZE * (j - i);
bp->b_pager.pg_reqpage = reqpage - i;
+ VM_OBJECT_LOCK(object);
vm_page_lock_queues();
{
int k;
@@ -1105,6 +1108,7 @@ swap_pager_getpages(object, m, count, reqpage)
}
}
vm_page_unlock_queues();
+ VM_OBJECT_UNLOCK(object);
bp->b_npages = j - i;
pbgetvp(swapdev_vp, bp);
@@ -1157,6 +1161,7 @@ swap_pager_getpages(object, m, count, reqpage)
vm_page_unlock_queues();
splx(s);
+ VM_OBJECT_LOCK(mreq->object);
/*
* mreq is left busied after completion, but all the other pages
* are freed. If we had an unrecoverable read error the page will
OpenPOWER on IntegriCloud