Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 24 Jun 2013 23:20:33 +0000 (UTC)
From:      Attilio Rao <attilio@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-user@freebsd.org
Subject:   svn commit: r252182 - user/attilio/vmobj-readlock/sys/vm
Message-ID:  <201306242320.r5ONKXwu074005@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
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"));



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201306242320.r5ONKXwu074005>