tech-kern archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: unconfiguring swap at shutdown



On Sat, 30 Aug 2008, Christos Zoulas wrote:
The following patch removes swap devices at shutdown. This is useful for
example when typing reboot and having a raidframe partition... Comments?

etc/rc.d/swap[12] run "swapctl -U -t {,no}blk" right now now shutdown.
Is that redundant / unneeded with your patch?


 - Hubert


christos

Index: kern/vfs_subr.c
===================================================================
RCS file: /cvsroot/src/sys/kern/vfs_subr.c,v
retrieving revision 1.355
diff -u -u -r1.355 vfs_subr.c
--- kern/vfs_subr.c     31 Jul 2008 05:38:05 -0000      1.355
+++ kern/vfs_subr.c     28 Aug 2008 15:52:33 -0000
@@ -114,6 +114,7 @@
#include <uvm/uvm.h>
#include <uvm/uvm_readahead.h>
#include <uvm/uvm_ddb.h>
+#include <uvm/uvm_swap.h>

#include <sys/sysctl.h>

@@ -2333,6 +2334,13 @@
        if (panicstr != NULL)
                return;

+#if defined(_KERNEL) && !defined(_RUMPKERNEL)
+       /*
+        * We need to turn off swap first before we unmount
+        * /dev, because otherwise the spec_vnodes are bad.
+        */
+       uvm_swap_shutdown(l);
+#endif
        /* Release inodes held by texts before update. */
#ifdef notdef
        vnshutdown();
Index: uvm/uvm_swap.c
===================================================================
RCS file: /cvsroot/src/sys/uvm/uvm_swap.c,v
retrieving revision 1.139
diff -u -u -r1.139 uvm_swap.c
--- uvm/uvm_swap.c      29 May 2008 14:51:27 -0000      1.139
+++ uvm/uvm_swap.c      28 Aug 2008 15:52:35 -0000
@@ -1073,6 +1073,55 @@
        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)
+               CIRCLEQ_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);
+                               CIRCLEQ_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
 */
Index: uvm/uvm_swap.h
===================================================================
RCS file: /cvsroot/src/sys/uvm/uvm_swap.h,v
retrieving revision 1.17
diff -u -u -r1.17 uvm_swap.h
--- uvm/uvm_swap.h      29 May 2008 14:51:27 -0000      1.17
+++ uvm/uvm_swap.h      28 Aug 2008 15:52:35 -0000
@@ -39,6 +39,7 @@
#endif

struct swapent;
+struct lwp;

#if defined(VMSWAP)
int     uvm_swap_get(struct vm_page *, int, int);
@@ -51,6 +52,7 @@
#define uvm_swapisfull()        true
#endif /* defined(VMSWAP) */
void    uvm_swap_stats(int, struct swapent *, int, register_t *);
+void   uvm_swap_shutdown(struct lwp *);

#endif /* _KERNEL */




Home | Main Index | Thread Index | Old Index