svn commit: r252182 - user/attilio/vmobj-readlock/sys/vm
Attilio Rao
attilio at FreeBSD.org
Mon Jun 24 23:20:34 UTC 2013
Author: attilio
Date: Mon Jun 24 23:20:33 2013
New Revision: 252182
URL: http://svnweb.freebsd.org/changeset/base/252182
Log:
Implement the sleep for the swap-in-progress with a separate
mechanism.
This avoid pollution on the busy mechanism and offers a more
precise way to perform the wakeup/sleep.
Sponsored by: EMC / Isilon storage division
Modified:
user/attilio/vmobj-readlock/sys/vm/swap_pager.c
user/attilio/vmobj-readlock/sys/vm/vm_object.c
user/attilio/vmobj-readlock/sys/vm/vm_object.h
user/attilio/vmobj-readlock/sys/vm/vm_page.h
user/attilio/vmobj-readlock/sys/vm/vnode_pager.c
Modified: user/attilio/vmobj-readlock/sys/vm/swap_pager.c
==============================================================================
--- user/attilio/vmobj-readlock/sys/vm/swap_pager.c Mon Jun 24 21:33:19 2013 (r252181)
+++ user/attilio/vmobj-readlock/sys/vm/swap_pager.c Mon Jun 24 23:20:33 2013 (r252182)
@@ -1219,15 +1219,14 @@ swap_pager_getpages(vm_object_t object,
*/
VM_OBJECT_WLOCK(object);
while ((mreq->oflags & VPO_SWAPINPROG) != 0) {
+ mreq->oflags |= VPO_SWAPSLEEP;
PCPU_INC(cnt.v_intrans);
- vm_page_lock(mreq);
- VM_OBJECT_WUNLOCK(object);
- if (vm_page_sleep_onpage(mreq, PSWP, "swread", hz * 20)) {
+ if (VM_OBJECT_SLEEP(object, &object->paging_in_progress, PSWP,
+ "swread", hz * 20)) {
printf(
"swap_pager: indefinite wait buffer: bufobj: %p, blkno: %jd, size: %ld\n",
bp->b_bufobj, (intmax_t)bp->b_blkno, bp->b_bcount);
}
- VM_OBJECT_WLOCK(object);
}
/*
@@ -1510,6 +1509,10 @@ swp_pager_async_iodone(struct buf *bp)
vm_page_t m = bp->b_pages[i];
m->oflags &= ~VPO_SWAPINPROG;
+ if (m->oflags & VPO_SWAPSLEEP) {
+ m->oflags &= ~VPO_SWAPSLEEP;
+ wakeup(&object->paging_in_progress);
+ }
if (bp->b_ioflags & BIO_ERROR) {
/*
Modified: user/attilio/vmobj-readlock/sys/vm/vm_object.c
==============================================================================
--- user/attilio/vmobj-readlock/sys/vm/vm_object.c Mon Jun 24 21:33:19 2013 (r252181)
+++ user/attilio/vmobj-readlock/sys/vm/vm_object.c Mon Jun 24 23:20:33 2013 (r252182)
@@ -391,7 +391,7 @@ vm_object_pip_wait(vm_object_t object, c
VM_OBJECT_ASSERT_WLOCKED(object);
while (object->paging_in_progress) {
object->flags |= OBJ_PIPWNT;
- VM_OBJECT_SLEEP(object, object, PVM, waitid);
+ VM_OBJECT_SLEEP(object, object, PVM, waitid, 0);
}
}
@@ -606,7 +606,7 @@ retry:
VM_OBJECT_WUNLOCK(robject);
object->flags |= OBJ_PIPWNT;
VM_OBJECT_SLEEP(object, object,
- PDROP | PVM, "objde2");
+ PDROP | PVM, "objde2", 0);
VM_OBJECT_WLOCK(robject);
temp = robject->backing_object;
if (object == temp) {
Modified: user/attilio/vmobj-readlock/sys/vm/vm_object.h
==============================================================================
--- user/attilio/vmobj-readlock/sys/vm/vm_object.h Mon Jun 24 21:33:19 2013 (r252181)
+++ user/attilio/vmobj-readlock/sys/vm/vm_object.h Mon Jun 24 23:20:33 2013 (r252182)
@@ -229,8 +229,8 @@ extern struct vm_object kmem_object_stor
rw_rlock(&(object)->lock)
#define VM_OBJECT_RUNLOCK(object) \
rw_runlock(&(object)->lock)
-#define VM_OBJECT_SLEEP(object, wchan, pri, wmesg) \
- rw_sleep((wchan), &(object)->lock, (pri), (wmesg), 0)
+#define VM_OBJECT_SLEEP(object, wchan, pri, wmesg, timo) \
+ rw_sleep((wchan), &(object)->lock, (pri), (wmesg), (timo))
#define VM_OBJECT_TRYRLOCK(object) \
rw_try_rlock(&(object)->lock)
#define VM_OBJECT_TRYWLOCK(object) \
Modified: user/attilio/vmobj-readlock/sys/vm/vm_page.h
==============================================================================
--- user/attilio/vmobj-readlock/sys/vm/vm_page.h Mon Jun 24 21:33:19 2013 (r252181)
+++ user/attilio/vmobj-readlock/sys/vm/vm_page.h Mon Jun 24 23:20:33 2013 (r252182)
@@ -177,7 +177,7 @@ struct vm_page {
*
*/
#define VPO_BUSY 0x01 /* page is in transit */
-#define VPO_UNUSED02 0x02 /* --available-- */
+#define VPO_SWAPSLEEP 0x02 /* waiting for swap to finish */
#define VPO_UNMANAGED 0x04 /* no PV management for page */
#define VPO_SWAPINPROG 0x08 /* swap I/O in progress on page */
#define VPO_NOSYNC 0x10 /* do not collect for syncer */
Modified: user/attilio/vmobj-readlock/sys/vm/vnode_pager.c
==============================================================================
--- user/attilio/vmobj-readlock/sys/vm/vnode_pager.c Mon Jun 24 21:33:19 2013 (r252181)
+++ user/attilio/vmobj-readlock/sys/vm/vnode_pager.c Mon Jun 24 23:20:33 2013 (r252182)
@@ -117,7 +117,7 @@ vnode_create_vobject(struct vnode *vp, o
}
VOP_UNLOCK(vp, 0);
vm_object_set_flag(object, OBJ_DISCONNECTWNT);
- VM_OBJECT_SLEEP(object, object, PDROP | PVM, "vodead");
+ VM_OBJECT_SLEEP(object, object, PDROP | PVM, "vodead", 0);
vn_lock(vp, LK_EXCLUSIVE | LK_RETRY);
}
@@ -211,7 +211,7 @@ retry:
if ((object->flags & OBJ_DEAD) == 0)
break;
vm_object_set_flag(object, OBJ_DISCONNECTWNT);
- VM_OBJECT_SLEEP(object, object, PDROP | PVM, "vadead");
+ VM_OBJECT_SLEEP(object, object, PDROP | PVM, "vadead", 0);
}
KASSERT(vp->v_usecount != 0, ("vnode_pager_alloc: no vnode reference"));
More information about the svn-src-user
mailing list