svn commit: r292393 - user/alc/PQ_LAUNDRY/sys/vm

Mark Johnston markj at FreeBSD.org
Thu Dec 17 01:33:47 UTC 2015


Author: markj
Date: Thu Dec 17 01:33:45 2015
New Revision: 292393
URL: https://svnweb.freebsd.org/changeset/base/292393

Log:
  Use an sx lock rather than a hand-rolled lock to serialize swapon/swapoff.

Modified:
  user/alc/PQ_LAUNDRY/sys/vm/swap_pager.c

Modified: user/alc/PQ_LAUNDRY/sys/vm/swap_pager.c
==============================================================================
--- user/alc/PQ_LAUNDRY/sys/vm/swap_pager.c	Thu Dec 17 01:31:26 2015	(r292392)
+++ user/alc/PQ_LAUNDRY/sys/vm/swap_pager.c	Thu Dec 17 01:33:45 2015	(r292393)
@@ -147,12 +147,12 @@ struct swblock {
 };
 
 static MALLOC_DEFINE(M_VMPGDATA, "vm_pgdata", "swap pager private data");
+static struct sx sw_conf_sx;
 static struct mtx sw_dev_mtx;
 static TAILQ_HEAD(, swdevt) swtailq = TAILQ_HEAD_INITIALIZER(swtailq);
 static struct swdevt *swdevhd;	/* Allocate from here next */
 static int nswapdev;		/* Number of swap devices */
 int swap_pager_avail;
-static int swdev_syscall_active = 0; /* serialize swap(on|off) */
 
 static vm_ooffset_t swap_total;
 SYSCTL_QUAD(_vm, OID_AUTO, swap_total, CTLFLAG_RD, &swap_total, 0,
@@ -487,6 +487,7 @@ swap_pager_init(void)
 		TAILQ_INIT(&swap_pager_object_list[i]);
 	mtx_init(&sw_alloc_mtx, "swap_pager list", NULL, MTX_DEF);
 	mtx_init(&sw_dev_mtx, "swapdev", NULL, MTX_DEF);
+	sx_init(&sw_conf_sx, "swapconf");
 
 	/*
 	 * Device Stripe, in PAGE_SIZE'd blocks
@@ -2004,9 +2005,7 @@ sys_swapon(struct thread *td, struct swa
 		return (error);
 
 	mtx_lock(&Giant);
-	while (swdev_syscall_active)
-	    tsleep(&swdev_syscall_active, PUSER - 1, "swpon", 0);
-	swdev_syscall_active = 1;
+	sx_xlock(&sw_conf_sx);
 
 	/*
 	 * Swap metadata may not fit in the KVM if we have physical
@@ -2041,8 +2040,7 @@ sys_swapon(struct thread *td, struct swa
 	if (error)
 		vrele(vp);
 done:
-	swdev_syscall_active = 0;
-	wakeup_one(&swdev_syscall_active);
+	sx_xunlock(&sw_conf_sx);
 	mtx_unlock(&Giant);
 	return (error);
 }
@@ -2174,9 +2172,7 @@ sys_swapoff(struct thread *td, struct sw
 		return (error);
 
 	mtx_lock(&Giant);
-	while (swdev_syscall_active)
-	    tsleep(&swdev_syscall_active, PUSER - 1, "swpoff", 0);
-	swdev_syscall_active = 1;
+	sx_xlock(&sw_conf_sx);
 
 	NDINIT(&nd, LOOKUP, FOLLOW | AUDITVNODE1, UIO_USERSPACE, uap->name,
 	    td);
@@ -2198,8 +2194,7 @@ sys_swapoff(struct thread *td, struct sw
 	}
 	error = swapoff_one(sp, td->td_ucred);
 done:
-	swdev_syscall_active = 0;
-	wakeup_one(&swdev_syscall_active);
+	sx_xunlock(&sw_conf_sx);
 	mtx_unlock(&Giant);
 	return (error);
 }
@@ -2213,6 +2208,7 @@ swapoff_one(struct swdevt *sp, struct uc
 #endif
 
 	mtx_assert(&Giant, MA_OWNED);
+	sx_assert(&sw_conf_sx, SA_XLOCKED);
 #ifdef MAC
 	(void) vn_lock(sp->sw_vp, LK_EXCLUSIVE | LK_RETRY);
 	error = mac_system_check_swapoff(cred, sp->sw_vp);
@@ -2275,10 +2271,7 @@ swapoff_all(void)
 	int error;
 
 	mtx_lock(&Giant);
-	while (swdev_syscall_active)
-		tsleep(&swdev_syscall_active, PUSER - 1, "swpoff", 0);
-	swdev_syscall_active = 1;
-
+	sx_xlock(&sw_conf_sx);
 	mtx_lock(&sw_dev_mtx);
 	TAILQ_FOREACH_SAFE(sp, &swtailq, sw_list, spt) {
 		mtx_unlock(&sw_dev_mtx);
@@ -2296,9 +2289,7 @@ swapoff_all(void)
 		mtx_lock(&sw_dev_mtx);
 	}
 	mtx_unlock(&sw_dev_mtx);
-
-	swdev_syscall_active = 0;
-	wakeup_one(&swdev_syscall_active);
+	sx_xunlock(&sw_conf_sx);
 	mtx_unlock(&Giant);
 }
 


More information about the svn-src-user mailing list