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 */