Module Name:    src
Committed By:   christos
Date:           Sat Nov 23 14:32:13 UTC 2013

Modified Files:
        src/sys/uvm: uvm_swap.c uvm_swap.h

Log Message:
convert from CIRCLEQ to TAILQ
add uvm_swap_shutdown(), unused


To generate a diff of this commit:
cvs rdiff -u -r1.163 -r1.164 src/sys/uvm/uvm_swap.c
cvs rdiff -u -r1.18 -r1.19 src/sys/uvm/uvm_swap.h

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/uvm/uvm_swap.c
diff -u src/sys/uvm/uvm_swap.c:1.163 src/sys/uvm/uvm_swap.c:1.164
--- src/sys/uvm/uvm_swap.c:1.163	Tue May  7 11:49:09 2013
+++ src/sys/uvm/uvm_swap.c	Sat Nov 23 09:32:13 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: uvm_swap.c,v 1.163 2013/05/07 15:49:09 riastradh Exp $	*/
+/*	$NetBSD: uvm_swap.c,v 1.164 2013/11/23 14:32:13 christos Exp $	*/
 
 /*
  * Copyright (c) 1995, 1996, 1997, 2009 Matthew R. Green
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: uvm_swap.c,v 1.163 2013/05/07 15:49:09 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uvm_swap.c,v 1.164 2013/11/23 14:32:13 christos Exp $");
 
 #include "opt_uvmhist.h"
 #include "opt_compat_netbsd.h"
@@ -81,7 +81,7 @@ __KERNEL_RCSID(0, "$NetBSD: uvm_swap.c,v
  * partitions/files.   there is a sorted LIST of "swappri" structures
  * which describe "swapdev"'s at that priority.   this LIST is headed
  * by the "swap_priority" global var.    each "swappri" contains a
- * CIRCLEQ of "swapdev" structures at that priority.
+ * TAILQ of "swapdev" structures at that priority.
  *
  * locking:
  *  - swap_syscall_lock (krwlock_t): this lock serializes the swapctl
@@ -136,7 +136,7 @@ struct swapdev {
 	int			swd_drumsize;	/* #pages in drum */
 	blist_t			swd_blist;	/* blist for this swapdev */
 	struct vnode		*swd_vp;	/* backing vnode */
-	CIRCLEQ_ENTRY(swapdev)	swd_next;	/* priority circleq */
+	TAILQ_ENTRY(swapdev)	swd_next;	/* priority circleq */
 
 	int			swd_bsize;	/* blocksize (bytes) */
 	int			swd_maxactive;	/* max active i/o reqs */
@@ -149,7 +149,7 @@ struct swapdev {
  */
 struct swappri {
 	int			spi_priority;     /* priority */
-	CIRCLEQ_HEAD(spi_swapdev, swapdev)	spi_swapdev;
+	TAILQ_HEAD(spi_swapdev, swapdev)	spi_swapdev;
 	/* circleq of swapdevs at this priority */
 	LIST_ENTRY(swappri)	spi_swappri;      /* global list of pri's */
 };
@@ -335,7 +335,7 @@ swaplist_insert(struct swapdev *sdp, str
 			    priority, 0, 0, 0);
 
 		spp->spi_priority = priority;
-		CIRCLEQ_INIT(&spp->spi_swapdev);
+		TAILQ_INIT(&spp->spi_swapdev);
 
 		if (pspp)
 			LIST_INSERT_AFTER(pspp, spp, spi_swappri);
@@ -351,7 +351,7 @@ swaplist_insert(struct swapdev *sdp, str
 	 * circleq list and bump the total number of swapdevs.
 	 */
 	sdp->swd_priority = priority;
-	CIRCLEQ_INSERT_TAIL(&spp->spi_swapdev, sdp, swd_next);
+	TAILQ_INSERT_TAIL(&spp->spi_swapdev, sdp, swd_next);
 	uvmexp.nswapdev++;
 }
 
@@ -373,10 +373,10 @@ swaplist_find(struct vnode *vp, bool rem
 	 */
 
 	LIST_FOREACH(spp, &swap_priority, spi_swappri) {
-		CIRCLEQ_FOREACH(sdp, &spp->spi_swapdev, swd_next) {
+		TAILQ_FOREACH(sdp, &spp->spi_swapdev, swd_next) {
 			if (sdp->swd_vp == vp) {
 				if (remove) {
-					CIRCLEQ_REMOVE(&spp->spi_swapdev,
+					TAILQ_REMOVE(&spp->spi_swapdev,
 					    sdp, swd_next);
 					uvmexp.nswapdev--;
 				}
@@ -399,8 +399,7 @@ swaplist_trim(void)
 	struct swappri *spp, *nextspp;
 
 	LIST_FOREACH_SAFE(spp, &swap_priority, spi_swappri, nextspp) {
-		if (CIRCLEQ_FIRST(&spp->spi_swapdev) !=
-		    (void *)&spp->spi_swapdev)
+		if (TAILQ_EMPTY(&spp->spi_swapdev))
 			continue;
 		LIST_REMOVE(spp, spi_swappri);
 		kmem_free(spp, sizeof(*spp));
@@ -421,7 +420,7 @@ swapdrum_getsdp(int pgno)
 	struct swappri *spp;
 
 	LIST_FOREACH(spp, &swap_priority, spi_swappri) {
-		CIRCLEQ_FOREACH(sdp, &spp->spi_swapdev, swd_next) {
+		TAILQ_FOREACH(sdp, &spp->spi_swapdev, swd_next) {
 			if (sdp->swd_flags & SWF_FAKE)
 				continue;
 			if (pgno >= sdp->swd_drumoffset &&
@@ -742,7 +741,7 @@ uvm_swap_stats(int cmd, struct swapent *
 	int count = 0;
 
 	LIST_FOREACH(spp, &swap_priority, spi_swappri) {
-		CIRCLEQ_FOREACH(sdp, &spp->spi_swapdev, swd_next) {
+		TAILQ_FOREACH(sdp, &spp->spi_swapdev, swd_next) {
 			int inuse;
 
 			if (sec-- <= 0)
@@ -1108,6 +1107,55 @@ swap_off(struct lwp *l, struct swapdev *
 	return (0);
 }
 
+void
+uvm_swap_shutdown(struct lwp *l)
+{
+	struct swapdev *sdp;
+	struct swappri *spp;
+	struct vnode *vp;
+	int error;
+
+	printf("turning of swap...");
+	rw_enter(&swap_syscall_lock, RW_WRITER);
+	mutex_enter(&uvm_swap_data_lock);
+again:
+	LIST_FOREACH(spp, &swap_priority, spi_swappri)
+		TAILQ_FOREACH(sdp, &spp->spi_swapdev, swd_next) {
+			if (sdp->swd_flags & SWF_FAKE)
+				continue;
+			if ((sdp->swd_flags & (SWF_INUSE|SWF_ENABLE)) == 0)
+				continue;
+#ifdef DEBUG
+			printf("\nturning off swap on %s...",
+			    sdp->swd_path);
+#endif
+			if (vn_lock(vp = sdp->swd_vp, LK_EXCLUSIVE)) {
+				error = EBUSY;
+				vp = NULL;
+			} else
+				error = 0;
+			if (!error) {
+				error = swap_off(l, sdp);
+				mutex_enter(&uvm_swap_data_lock);
+			}
+			if (error) {
+				printf("stopping swap on %s failed "
+				    "with error %d\n", sdp->swd_path, error);
+				TAILQ_REMOVE(&spp->spi_swapdev, sdp,
+				    swd_next);
+				uvmexp.nswapdev--;
+				swaplist_trim();
+				if (vp)
+					vput(vp);
+			}
+			goto again;
+		}
+	printf(" done\n");
+	mutex_exit(&uvm_swap_data_lock);
+	rw_exit(&swap_syscall_lock);
+}
+
+
 /*
  * /dev/drum interface and i/o functions
  */
@@ -1555,7 +1603,7 @@ uvm_swap_alloc(int *nslots /* IN/OUT */,
 
 ReTry:	/* XXXMRG */
 	LIST_FOREACH(spp, &swap_priority, spi_swappri) {
-		CIRCLEQ_FOREACH(sdp, &spp->spi_swapdev, swd_next) {
+		TAILQ_FOREACH(sdp, &spp->spi_swapdev, swd_next) {
 			uint64_t result;
 
 			/* if it's not enabled, then we can't swap from it */
@@ -1572,8 +1620,8 @@ ReTry:	/* XXXMRG */
 			/*
 			 * successful allocation!  now rotate the circleq.
 			 */
-			CIRCLEQ_REMOVE(&spp->spi_swapdev, sdp, swd_next);
-			CIRCLEQ_INSERT_TAIL(&spp->spi_swapdev, sdp, swd_next);
+			TAILQ_REMOVE(&spp->spi_swapdev, sdp, swd_next);
+			TAILQ_INSERT_TAIL(&spp->spi_swapdev, sdp, swd_next);
 			sdp->swd_npginuse += *nslots;
 			uvmexp.swpginuse += *nslots;
 			mutex_exit(&uvm_swap_data_lock);

Index: src/sys/uvm/uvm_swap.h
diff -u src/sys/uvm/uvm_swap.h:1.18 src/sys/uvm/uvm_swap.h:1.19
--- src/sys/uvm/uvm_swap.h:1.18	Tue Apr 26 20:35:52 2011
+++ src/sys/uvm/uvm_swap.h	Sat Nov 23 09:32:13 2013
@@ -1,4 +1,4 @@
-/*	$NetBSD: uvm_swap.h,v 1.18 2011/04/27 00:35:52 rmind Exp $	*/
+/*	$NetBSD: uvm_swap.h,v 1.19 2013/11/23 14:32:13 christos Exp $	*/
 
 /*
  * Copyright (c) 1997 Matthew R. Green
@@ -39,6 +39,7 @@
 #endif
 
 struct swapent;
+struct lwp;
 
 #if defined(VMSWAP)
 int	uvm_swap_get(struct vm_page *, int, int);
@@ -50,6 +51,7 @@ bool	uvm_swapisfull(void);
 #else /* defined(VMSWAP) */
 #define	uvm_swapisfull()	true
 #endif /* defined(VMSWAP) */
+void	uvm_swap_shutdown(struct lwp *);
 
 #endif /* _KERNEL */
 

Reply via email to